对于回滚由集成测试框架(如 Selenium)进行的数据库事务的最佳实践或首选方法,是否有人有任何建议?
这是我们目前的情况:我们有一个 .net web 项目,其中包含许多单元测试,这些单元测试在我们的单元测试环境中运行良好 - 每个测试都继承了一个在 [SetUp] 中打开事务并回滚的父类[TearDown] 中的事务。每次测试后,我们的单元测试数据库都会恢复到原始状态。
但是,一旦我们进入集成环境,情况就会发生变化。我们的持续集成服务器会自动编译我们的提交并将它们推送到测试服务器,以便该服务器始终运行在最新的代码上。我们还设置了一个 Selenium 实例来自动执行用户与网站的交互。 selenium 测试基本上与现有的 Selenium 服务器通信,并告诉服务器诸如“启动浏览器并转到 http://testsite/TestPage.aspx - 在 ID 为“def”的表单字段中输入文本“abc” - 断言新页面包含文本“xyz” '"
每个测试都以与我们的普通单元测试类似的方式运行,但有一个重要的异常(exception):Selenium 所做的任何更改都是在完全不同的线程/应用程序中完成的,因此我们不能(我*认为我们可以',至少)在测试拆解中将它们回滚。
我们还没有找到一个好的解决方案。现在我们正处于使用 SqlCommand 执行 sql 语句来备份数据库的地步,然后在测试结束时,我们将数据库设置为单用户,删除当前数据库,然后恢复旧副本 - 这不太理想,因为这有效地杀死了附加到数据库的应用程序,并且需要我们再次重新初始化应用程序。
这是以前解决过的问题吗?任何建议都会很棒。
谢谢!
最佳答案
我们在每次测试之前运行一个删除/创建表脚本。这非常快,并确保之前的测试没有遗漏任何东西。
PS:我们正在使用 NHibernate,它会动态创建此脚本并在内存中的 Sqlite 上运行测试,速度非常快。但是,如果我们切换到 SqlServer,它仍然非常快。
关于.net - 集成(Selenium)测试后回滚数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/768944/