7

与我的previous question相反,我会尽力满足我的要求。如何自动化功能/集成测试和数据库回滚

我试图找到一些框架/方法/“东西”,将符合下列:

  • 能力编写自动测试,最好写在Visual Studio中,使用C#。
  • 测试应该驱动一个Web浏览器,并像用户一样与SUT进行交互。
  • 测试应该能够在数据库中设置测试场景。
  • 测试应该能够断言用户交互在DB中具有预期的效果。
  • 测试完成后,它应该能够回滚它在数据库中所做的所有更改。

我的第一次尝试是使用NUnit测试来驱动硒(在此之前,华廷),但我面临有点问题的(检查上面的链接),而使用的TransactionScope回滚变化硒驱动浏览器在DB中做过。

有没有人在“真实世界”中做过这样的事情?我通过Google找到了一些参考资料,但一直未能找到有关如何实施的具体示例。如果我要进行单元测试,那就不会有任何问题。在这种情况下,TransactionScope就足够了。

编辑:河哈维指出我的this问题,这几乎与我的情况相同。

但是,这个问题只是差不多相同。我的应用程序是一系列服务的一部分,它们都访问同一组数据库表。所需的测试数据量不允许有效使用drop/create-scripts,那么是否有一些替代解决方案?

我们正在使用SQL Server 2005,并且我不擅长数据库魔术,所以如果有一些方法可以使用除drop/create之外的sql脚本,那么这可能是一个选项。

编辑2:

基础上的答案和一些额外的挠头,我们会去更轻量级的数据库开发人员执行单位 - ,集成 - 测试和功能测试。这使我们能够使用sql脚本来设置和拆除测试。

+0

这可能有帮助:http://stackoverflow.com/questions/768944/rollback-database-after-integration-selenium-tests – 2009-09-24 05:12:49

+0

是的,我本身没有硒问题。似乎是一个伟大的工具!问题在于回滚Selenium驱动的broser到db中的变化。 – juarola 2009-09-24 05:14:03

+0

哦,我的,我怎么会错过。在发布之前,我试图做大量的搜索,但这个问题的场景几乎是一个副本。我会在我的问题中添加一点以区别于他们的情况... – juarola 2009-09-24 06:03:53

回答

7

在交易中所做的更改仅在所述交易中可见。将测试包装在事务范围中(如果可能的话)会使测试在非常关键的方面(事务)的行为与真实的行为不同。

使用在每个测试套件之前恢复的数据库映像要好得多。套件完成并验证完成后,您可以放弃测试数据库。下一次运行,在套件安装过程中,数据库将从已保存的图像中以原始状态重新创建,并准备好进行测试。更好的办法是有一个脚本,可以从头开始部署数据库,并在套件安装过程中运行该脚本。

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

另一个要考虑的是故障调查,你希望你的测试失败,使数据库中,可以为你想随后的测试需要能够运行并产生有效的结果有意义的信息进行调查的状态。有时候这些要求会互相矛盾,但你必须考虑到这些要求并围绕它们设计你的测试。

+0

谢谢您的见解,尤其是关于失败调查的部分。我会将这一个标记为答案,因为我倾向于同意,我最初想到的并不是一个现实的解决方案。 – juarola 2009-09-25 10:25:31

+0

很久以前,您肯定已经选择了您的方法,但请注意,您应始终能够重现失败的测试,并可能使用调试器逐步完成测试。所以我不会因保留数据库状态而造成问题。 – 2010-06-22 14:02:34

7

如果将数据库还原到已知的良好状态所需的数据量是望而却步下降/创建脚本,并在运行你的开发人员或SQL 2005的企业版的测试,你可以看看的好creating a database snapshot状态和reverting to it在每个测试之前。这比完全恢复要快得多,但如果您有数百次测试,它可能仍然太耗时。

+0

谢谢你的回复!这是我们qa部门的标准做法。我的目标是在代码转向qa之前为开发人员找到一些轻量级的替代方案。我认为我们必须为数据库开发“内容”,以便在开发过程中拥有足够的数据进行快速测试。 – juarola 2009-09-25 10:19:17