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

.net 集成(Selenium)测试后回滚数据库,.net,testing,selenium,integration-testing,.net,Testing,Selenium,Integration Testing,有人对从集成测试框架(如Selenium)回滚数据库事务的最佳实践或首选方法有什么建议吗 我们目前的情况如下:我们有一个.net web项目,其中包含许多单元测试,这些测试在我们的单元测试环境中运行良好-每个测试都继承一个父类,该父类在[SetUp]中打开一个事务,并在[TearDown]中回滚该事务。每次测试之后,我们的单元测试数据库都会恢复到原始状态 然而,一旦我们进入集成环境,情况就会发生变化。我们的持续集成服务器自动编译我们的提交并将它们推出到测试服务器,以便服务器始终运行最新的代码。我

有人对从集成测试框架(如Selenium)回滚数据库事务的最佳实践或首选方法有什么建议吗

我们目前的情况如下:我们有一个.net web项目,其中包含许多单元测试,这些测试在我们的单元测试环境中运行良好-每个测试都继承一个父类,该父类在[SetUp]中打开一个事务,并在[TearDown]中回滚该事务。每次测试之后,我们的单元测试数据库都会恢复到原始状态

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

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

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

这是以前解决过的问题吗?任何建议都会很棒


谢谢

我们在每次测试之前都会运行一个drop/create table脚本。这是相当快的,并确保没有留下任何东西从以前的测试


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

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


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

有一个名为(,)的项目专门为此场景设计。它简化了测试过程。(在大多数应用程序中,尤其是那些尚未使用MSDTC的应用程序中,使用时需要对数据访问进行适度的侵入性更改。)

感谢Stefan,这似乎是最好的解决方案-我们在每次测试后都会截断表并重新加载夹具,这并不是很费力,而且似乎工作正常。再次感谢!在oracle上截断相当快,因为您无法回滚此操作。脚本在我们的情况下很容易,脚本已经可用,我们不需要维护其他东西。这个脚本是在每个测试方法或测试用例之前运行的吗?我会假设每一种测试方法。。。。这个脚本是如何运行的?后端是否有服务API?它在每个测试方法之前运行。它由非常容易使用的NHibernates SchemaExport类运行。它基于映射文件创建表。