Asp.net 如何自动化功能/集成测试和数据库回滚

Asp.net 如何自动化功能/集成测试和数据库回滚,asp.net,database,automated-tests,integration-testing,functional-testing,Asp.net,Database,Automated Tests,Integration Testing,Functional Testing,与我的要求相反,我会尽量给出我的要求 我试图找到符合以下要求的框架/方法/东西: 能够使用C#编写自动化测试,最好是在Visual Studio中编写 测试应该像用户一样驱动web浏览器并与SUT交互 测试应该能够在DB中设置测试场景 测试应该能够断言用户交互在DB中具有预期的效果 测试完成后,它应该能够回滚它在DB中所做的所有更改 我的第一次尝试是使用NUnit test驱动Selenium(以及之前的Watin),但在使用TransactionScope回滚Selenium驱动的浏览器在

与我的要求相反,我会尽量给出我的要求

我试图找到符合以下要求的框架/方法/东西:

  • 能够使用C#编写自动化测试,最好是在Visual Studio中编写
  • 测试应该像用户一样驱动web浏览器并与SUT交互
  • 测试应该能够在DB中设置测试场景
  • 测试应该能够断言用户交互在DB中具有预期的效果
  • 测试完成后,它应该能够回滚它在DB中所做的所有更改
我的第一次尝试是使用NUnit test驱动Selenium(以及之前的Watin),但在使用TransactionScope回滚Selenium驱动的浏览器在DB中所做的更改时,我遇到了一点问题(请查看上面的链接)

在“现实世界”中有人做过类似的事情吗?我在谷歌上找到了一些参考资料,但还没有找到任何具体的例子来说明如何实现这一点。如果我做单元测试,就不会有任何问题。那样的话,交易范围就足够了

编辑:R.哈维给我指了一个问题,这个问题和我的情况几乎相同

然而,这个问题几乎是一样的。我的应用程序是一系列服务的一部分,所有这些服务都访问同一组数据库表。所需的测试数据量不允许高效使用drop/create脚本,因此是否有其他解决方案

我们使用的是SQLServer2005,我对数据库魔术不是很精通,所以如果有其他方法使用SQL脚本而不是drop/create,那么这可能是一种选择

编辑2:


基于这些答案和一些额外的麻烦,我们将为开发人员提供更轻量级的数据库,以执行单元测试、集成测试和功能测试。这使我们能够使用sql脚本来设置和删除测试。

在事务中所做的更改仅在所述事务中可见。此外,将测试包装在事务范围内(如果可能的话)将使测试在非常关键的方面(事务)表现出与实际情况不同的行为

最好在每个测试套件之前使用还原的数据库映像。这样,在套件完成并完成验证之后,您将删除测试数据库。下一次运行时,在套件设置过程中,将从保存的映像重新创建数据库,该映像处于原始状态,准备进行测试。更好的做法是使用一个脚本从头开始部署数据库,并在套件安装期间运行该脚本

顺便说一句,在每次测试之前,恢复到原始状态是不可行的。更一般地说,拥有冗长的单独测试设置和清理步骤是不可行的。随着添加更多测试,在测试之间将数据库恢复到测试就绪状态所花费的时间将变得难以管理。包含数百个测试的套件非常常见,成千上万个测试的完整测试运行意味着需要花费数小时才能恢复数据库进行测试。设计单独的测试,使其能够独立运行,即即使测试N-1失败,测试N也必须产生有效的结果


另一个要考虑的问题是失败调查,你希望你的失败测试离开数据库,在一个可以被调查的有意义的信息的状态下,你希望以后的测试能够运行并产生有效的结果。有时这些需求会相互矛盾,但您必须考虑它们并围绕它们设计测试

如果将数据库恢复到已知良好状态所需的数据量不允许使用drop/create脚本,并且您正在SQL 2005的Developer或Enterprise edition上运行测试,则可以在每次测试之前查看良好状态的详细信息。这比完全恢复要快得多,尽管如果您有数百个测试,它可能仍然太耗时。

请不要错过我推荐的测试。

这可能会有所帮助:是的,我对Selenium本身没有问题。似乎是一个伟大的工具!问题在于将Selenium驱动的broser所做的更改回滚到db中。哦,天哪,我怎么会错过这一点。在发布这篇文章之前,我试图进行广泛的搜索,但这个问题中的场景几乎是一个复制品。我将在我的问题中添加一点,以区别于他们的情况…谢谢你的回答!这是我们qa部门的标准做法。我的目标是在代码进入qa之前为开发人员找到一些轻量级的替代方案。我认为我们必须进行“开发”——数据库的内容,以便在开发过程中有足够的数据进行快速测试。感谢您的见解,特别是关于故障调查的部分。我将把这个标记为一个答案,因为我倾向于同意我最初所想的实际上不是一个现实的解决方案。您肯定很久以前就选择了您的方法,但请注意,您应该始终能够重现失败的测试,并可能使用调试器逐步完成它。所以我不会因为保留数据库状态而产生问题。