代码之家  ›  专栏  ›  技术社区  ›  matt

集成(Selenium)测试后回滚数据库

  •  9
  • matt  · 技术社区  · 16 年前

    对于从集成测试框架(如Selenium)中回滚数据库事务的最佳实践或首选方法,是否有人有任何建议?

    这里是我们当前的情况:我们有一个.NET Web项目,其中包含许多在单元测试环境中工作良好的单元测试-每个测试继承一个父类,它在[设置]中打开一个事务,并在[拆卸]中回滚该事务。每次测试之后,我们的单元测试数据库都会恢复到原始状态。

    然而,一旦我们进入集成环境,事情就会发生变化。我们的持续集成服务器自动编译我们的提交,并将它们推送到测试服务器,以便服务器始终运行最新的代码。我们还设置了一个Selenium实例来自动与站点进行用户交互。Selenium测试基本上与现有的Selenium服务器通信,并告诉服务器“启动浏览器并转到 http://testsite/TestPage.aspx -在ID为“def”的表单域中输入文本“abc”-断言新页包含文本“xyz”“

    每个测试的运行方式与我们的普通单元测试类似,但有一个重要的例外:Selenium所做的任何更改都是在完全不同的线程/应用程序中完成的,因此我们不能(至少我认为我们不能)在测试拆卸中回滚它们。

    我们还没有找到一个很好的解决办法。现在,我们正在使用sqlcommand执行一条SQL语句来备份数据库,然后在测试结束时,我们将数据库设置为单用户,删除当前数据库,并还原旧副本-这不太理想,因为这会有效地杀死附加到数据库的应用程序,并需要我们将再次重新初始化应用程序。

    这是以前解决过的问题吗?任何建议都是了不起的。

    谢谢!

    3 回复  |  直到 14 年前
        1
  •  3
  •   Stefan Steinegger    16 年前

    我们在每次测试之前都要运行一个删除/创建表脚本。这是相当快的,并确保从以前的测试中不会留下任何东西。

    PS:我们使用的是nhibernate,它在运行时创建这个脚本,并在内存中的sqlite上运行测试,它是lightspeed。但是如果我们切换到sqlserver,它仍然很快。

        2
  •  3
  •   Patrick Lightbody    16 年前

    这是一个棘手的问题,解决方案对于每个应用程序都是独一无二的。在主要框架采用“推荐方法”之前,这将继续是一个痛苦。

    我的最佳建议:在你的应用程序开始时就计划好这种用法。包括从应用程序下面重置数据库后清理的API(即:重置缓存)。

        3
  •  2
  •   user423430    14 年前

    有一个项目叫 Amnesia ( more docs , recent code )这是专门为这个场景设计的。它简化了 using the MSDTC TransactionScope to rollback test changes .(在大多数应用程序中,尤其是那些尚未使用MSDTC的应用程序中,对数据访问的使用需要适度的侵入性更改。)