3

背景:

我有一个通过 BlazeDS 与 Java 后端通信的 Flex Web 应用程序。Flex 客户端由一个包含视图和表示模型的 flex-client 模块和一个包含模型(值对象)和服务对象的单独的 flex-service 模块组成。

我正在使用 FlexUnit4 为 flex-service 模块的 RemoteObjects 编写异步集成测试。在一些测试中,我修改了测试数据并查询它以查看是否一切正常(此处显示的技术:http: //saturnboy.com/2010/02/async-testing-with-flexunit4

问题:

如何在每个 FlexUnit4 测试方法(或测试方法链)之前将数据库重置为已知状态?在我的 Java 服务器集成测试中,我通过结合使用 DBUnit 和 Spring Test 的事务来做到这一点——在每个测试方法之后回滚。但是这些 Flexunit 集成跨越多个请求,因此跨越多个事务。

如果没有在后端实现集成测试服务 API,如何实现。其他人肯定也遇到过这种情况吗?之前已经提出过类似的问题(集成(Selenium)测试后回滚数据库),但没有令人满意的答案。

4

3 回答 3

5

有几种选择:

  1. 如果您使用序列作为主键:在数据库加载了测试数据后,删除序列生成器并将其替换为以开头-1并倒计时的序列生成器。测试后,您可以删除主键 < 0 的对象。修改现有数据的测试中断。

    类似的方法是创建一个特殊用户,或者,如果您有created时间戳列,那么初始数据必须在过去某个日期之前。不过,这需要额外的索引。

  2. 在服务器上使用可以快速擦除的数据库(例如H2)。添加一个服务 API,您可以从客户端调用它来重置数据库。

  3. 将撤消添加到您的网络应用程序。这是一项相当大的努力,但却是一个非常酷的功能。

  4. 使用一个数据库,它允许通过一个命令及时回到过去,比如 Lotus Notes。

  5. 根本不要使用数据库。而是编写一个代理服务器,它将以正确的输出响应正确的输入。将一些代码添加到您的真实服务器以将交换的数据写入文件并从中创建测试。

    或者编写针对真实服务器运行并创建这些文件的测试用例。这将允许您在修改服务器或客户端上的代码时跟踪哪些文件发生了变化。

    在服务器上,编写测试以确保它会进行正确的数据库修改。

  6. 类似于“根本没有数据库”,将所有访问数据库的代码隐藏在一个数据库层中,并使用接口来访问它。这允许您编写一个模拟层,其行为类似于真实数据库,但将数据保存在内存中。听起来很简单,但通常需要大量工作。

于 2010-11-01T16:42:50.563 回答
1

根据您的测试数据库的大小,您可以自动执行干净的备份/恢复,从而为您提供每次测试运行时所拥有的确切环境。

我在我当前的项目(不同平台)中采用了这种方法,我们还使用相同的方法测试数据模式更改脚本。

于 2010-11-01T18:12:16.970 回答
0

我脱水了(我最喜欢的缺点借口)。很抱歉,如果这个答案太接近您不想要的“后端集成测试服务 API”响应。

“很久以前”设置 flexUnit 的团队根据我们的架构做出了选择并创建了解决方案,其中一些仅适用于我们的基础架构。需要考虑的事项:1)我们所有的后端方法都返回相同的远程映射类。2)大多数我们所有的方法都有一个抽象的方法,告诉方法(或不)在方法开始时运行“开始事务”,在结束时运行“提交事务”(不确定你的数据库块) .

后者可能不是最面向对象的解决方案,但这是异步单元测试调用的作用:每个单元测试调用相同的方法包装器,我们传入方法名称/包区域设置,加上 [ ...]参数。beginTransaction 完成。调用该方法,将 false 传递给 FE 单元测试方法(以忽略 beginTransaction 和 commitTransaction 行),一切都运行并生成主“响应”类并返回给单元测试方法。运行 db-rollback 并将响应返回给单元测试。

我们所有的单元测试都基于回滚事务。我无法告诉你他们在设置那个 jive 时遇到的问题,但这是我对 schtuff 工作原理的一般理解。

希望有帮助。没有的话可以理解。祝你好运,--杰里米

于 2010-10-29T20:27:40.537 回答