背景
我有一个Flex Web应用程序,它通过BlazeDS与Java后端进行通信。 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,那么如何实现呢?当然其他人也遇到过这个问题?之前已经提出了类似的问题(Rollback database after integration (Selenium) tests),但没有得到满意的答案。
答案 0 :(得分:5)
有几种选择:
如果对主键使用序列:在数据库加载了测试数据后,删除序列生成器并将其替换为以-1
开头的序列生成器并倒计时。测试后,您可以使用主键<删除对象。 0.修改现有数据的测试中断。
类似的方法是创建一个特殊用户,或者,如果您有created
个时间戳列,那么初始数据必须在过去的某个日期之前。但是,这需要额外的索引。
在服务器上使用可以快速擦除的数据库(例如H2)。添加一个服务API,您可以从客户端调用该API来重置数据库。
向您的网络应用添加撤消功能。这是一项非常努力但却非常酷的功能。
使用允许使用单个命令(例如Lotus Notes)及时移回的数据库。
根本不要使用数据库。而是编写一个代理服务器,它将使用正确的输出响应正确的输入。向您的真实服务器添加一些代码,将交换的数据写入文件并从中创建测试。
或编写针对真实服务器运行并创建这些文件的测试用例。这样您就可以在修改服务器或客户端上的代码时跟踪哪些文件发生了变化。
在服务器上编写测试,确保它能够进行正确的数据库修改。
与“根本没有数据库”类似,隐藏所有访问数据库层中DB的代码并使用接口来访问它。这允许您编写一个模拟层,其行为类似于真实数据库,但将数据保存在内存中。听起来很简单,但通常需要做很多工作。
答案 1 :(得分:1)
根据测试数据库的大小,您可以自动执行干净的备份/恢复,从而为您提供每次测试运行时的准确环境。
我已经采用了当前项目(不同平台)的方法,并且我们也使用相同的方法测试数据模式更改脚本。
答案 2 :(得分:0)
我脱水了(我的借口是短暂的)。很抱歉,如果这个答案太接近你不想要的“后端集成测试服务API”响应了。
在很久以前建立flexUnit的团队根据我们的架构做出了选择并创建了解决方案,其中一些只适用于我们的基础架构。需要考虑的事项: 1)我们所有的后端方法都返回相同的远程映射类。 2)我们的大多数方法都有一个抽象的方法,它告诉方法在方法的开头运行(或不运行)“begin transaction”,最后运行“commit transaction”(不确定你的db chunk)
后者可能不是最面向对象的解决方案,但这是异步单元测试调用的作用:每个单元测试调用相同的方法包装器,并传入method-name / package-locale,加上[...] args。 beginTransaction已完成。调用该方法,将false传递给FE单元测试的方法(忽略beginTransaction和commitTransaction行),运行所有内容并生成主“响应”类并返回到单元测试方法。运行db-rollback并将响应返回到单元测试。
我们所有的单元测试都基于回滚交易。我无法告诉你他们在设置jive时遇到的问题,但这是我对schtuff如何工作的一般理解。
希望有所帮助。如果没有,可以理解。 祝你好运, --jeremy