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