我正在创建一系列需要测试数据存储在数据库(SQL Server 2008)中的Web自动化测试。为了生成每个测试所需的数据,我必须调用一些C#代码,将正确的数据插入到数据库中(即我不能只编写SQL脚本来插入数据)。我的问题是,我不想通过这些自动化测试向我的测试数据库添加大量测试数据。因此,希望在测试期间回滚对数据库所做的所有更改。有人能建议一个明智的方法来实现这一点吗?
一个简单的方法是在运行测试之前创建数据库备份,然后在最后恢复备份。
有两种方法可以实现这个目标。
一种是将测试内容包含在一个事务中并进行回滚。另一种方法是在测试完成代码的清理脚本中使用(我们在某些集成测试中采用此方法,因为事务无法正常工作)。
当我无法控制测试的事务范围时,通常会每次从头开始删除并重新创建数据库。
显然,这仅在测试可以运行针对裸架构的情况下才可行(或者在创建脚本中插入硬编码查找值)。
当我使用预先填充了大量数据的快照数据库进行测试时,我以前使用过清理脚本,例如删除每个表中所有高于基线快照最大id的记录。
我没有尝试像AdaTheDev建议的那样自动备份/回滚,但如果您不想维护可能复杂(和错误的)清理脚本(取决于快照数据的复杂性/您可能会多频繁更改您的快照并相应地修改您的清理操作),这听起来可能是最佳选择。
您是否考虑过模拟数据访问,以便您的Web测试运行针对内存中的数据存储?然后,在内部测试数据访问过程时,您仍然可以回滚事务范围?
听起来使用事务可能会很困难,因为您将在单个测试中进行多个Web请求 - 但这将是我的首选,因为它比从备份还原数据库更快。
如果您拥有正确版本的SQL服务器,则可以使用数据库快照而不是备份:http://msdn.microsoft.com/en-us/library/ms175876.aspx,因为它们更快 :)
显然这取决于您如何调用测试,但是在MbUnit中是否会起作用“Rollback”属性?