有没有人对通过集成测试框架(如Selenium)回滚数据库事务的最佳实践或首选方法提出任何建议?
以下是我们目前的情况:我们有一个.net web项目,其中包含许多单元测试,它们在我们的单元测试环境中运行良好 - 每个测试都继承了一个在[SetUp]中打开事务的父类,并回滚[TearDown]中的交易。每次测试后,我们的单元测试数据库都会恢复到原始状态。
然而,一旦我们进入集成环境,事情就会发生变化。我们的持续集成服务器自动编译我们的提交并将它们推送到测试服务器,以便服务器始终运行在最新的代码上。我们还设置了一个Selenium实例来自动化用户与站点的交互。 selenium测试基本上与现有的Selenium服务器通信,并告诉服务器诸如“启动浏览器并转到http://testsite/TestPage.aspx之类的事情 - 在id为'def'的表单字段中输入文本'abc' - 断言新页面包含文本'XYZ'“
每个测试都以类似于我们的vanilla单元测试的方式运行,但有一个重要的例外:Selenium所做的任何更改都是在完全不同的线程/应用程序中完成的,因此我们不能(我认为我们可以至少,在测试拆解时将它们推回去。
我们还没有找到一个好的解决方案。现在我们正在使用SqlCommand来执行sql语句来备份数据库,然后在测试结束时,我们将数据库设置为单个用户,删除当前数据库并恢复旧副本 - 这不太理想,因为它有效地杀死了附加到数据库的应用程序,并要求我们再次重新初始化应用程序。
这是以前解决过的问题吗?任何建议都很棒。
谢谢!
答案 0 :(得分:3)
我们在每次测试之前运行drop / create-table脚本。这非常快,并确保以前的测试不会留下任何东西。
PS:我们正在使用NHibernate,它可以动态创建这个脚本并在内存中运行Sqlite上的测试,它是光速的。但是如果我们切换到SqlServer,它仍然很快。答案 1 :(得分:3)
这是一个棘手的问题,解决方案通常对每个应用程序都是独一无二的。在主要框架采用“推荐方法”之前,这将继续是一种痛苦。
我最好的建议:在应用开始时计划此用法。包括从应用程序下方重置数据库后清理的API(即:重置缓存)。
答案 2 :(得分:2)
有一个专门针对此方案设计的名为Amnesia(more docs,recent code)的项目。它简化了using the MSDTC TransactionScope to rollback test changes的过程。 (在大多数应用程序中,尤其是那些尚未使用MSDTC的应用程序,需要对数据访问进行适度的侵入式更改。)