我正在创建一系列Web自动化测试,这些测试要求测试数据位于数据库中(SQL Server 2008)。为了为每个测试生成所需的数据,我必须调用一些C#代码,这些代码将正确的数据插入到DB中(即我不能只编写SQL脚本来插入数据)。我的问题是我不想用这些自动化测试中的大量测试数据来污染我的测试数据库。因此,想要回滚测试期间对数据库所做的所有更改。
有人能建议一种明智的方法来实现这一目标吗?
答案 0 :(得分:5)
简单的方法是在运行测试之前创建数据库的备份,然后在最后恢复。
答案 1 :(得分:4)
两种方法。
一种方法是将您的测试封装在一个事务中并将其回滚。另一种方法是使用清理脚本作为测试完成代码的一部分(我们在一些事务不起作用的集成测试中执行此操作)。
答案 2 :(得分:2)
当我无法控制测试的事务范围时,我通常会每次从头开始删除并重新创建数据库。
显然,只有测试可以针对裸模式运行(或者在创建脚本中插入硬编码查找值),这才是可行的。
当我对预先填充了大量数据的快照数据库进行测试时,我之前使用过清理脚本,比如删除每个表中高于我的基线快照最大ID的所有记录。
还没有像AdaTheDev建议的那样尝试自动化备份/回滚,但如果您不想维护可能复杂(并且错误)的清理脚本(这取决于快照数据的复杂性),这听起来可能是您的最佳选择您可以多久更改一次快照,并相应地修改清理工作。)
您是否考虑过模拟数据访问,以便您的Web测试针对内存数据存储运行?然后在内部测试数据访问过程,您仍然可以回滚事务范围吗?
答案 3 :(得分:2)
Red Gate上的向导刚刚发布了SQL Virtual Restore,它实际上将一个备份文件作为一个可读,可读,可写的数据库挂载 - 所以你可以在测试之前有一个表示系统基线状态的备份文件,此备份的副本,将副本装载为测试数据库,运行测试,然后卸载并擦除副本。
虚拟还原时间为http://www.red-gate.com/products/sql_virtual_restore/index.htm,如果您想试用,则可以进行为期14天的试用。
我与Red Gate没有任何关系,顺便说一下 - 我只是他们工具的热心用户。
答案 4 :(得分:1)
听起来很难使用事务,因为您将在一次测试中发出多个Web请求 - 但这将是我的首选,因为它比从备份恢复数据库更快。
如果你有正确版本的SQL服务器,你可以使用数据库快照而不是备份:http://msdn.microsoft.com/en-us/library/ms175876.aspx,只是因为它们更快:)
答案 5 :(得分:0)
显然这完全取决于你如何调用测试,但是“回滚”属性是否适用于MbUnit?