一尘不染

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

selenium

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

这是当前的情况:我们有一个.net Web项目,其中包含许多在单元测试环境中可以正常工作的单元测试-
每个测试都继承一个父类,该父类在[SetUp]中打开一个事务,并在其中回滚该事务。 [TearDown]。每次测试后,我们的单元测试数据库都恢复到原始状态。

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

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

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

这是以前已经解决的问题吗?任何建议都很棒。

谢谢!


阅读 522

收藏
2020-06-26

共1个答案

一尘不染

每次测试之前,我们正在运行一个drop / create-table脚本。这非常快,可以确保以前的测试没有遗留任何内容。

PS:我们正在使用NHibernate,它可以动态创建此脚本并在内存中的Sqlite上运行测试,这是光速。但是,如果我们切换到SqlServer,它仍然非常快。

2020-06-26