C# 创建&;使用SQL server回滚测试数据

C# 创建&;使用SQL server回滚测试数据,c#,sql-server,automated-tests,test-data,webautomation,C#,Sql Server,Automated Tests,Test Data,Webautomation,我正在创建一系列web自动化测试,这些测试要求测试数据位于数据库中(SQLServer2008)。为了生成每个测试所需的数据,我必须调用一些C#代码,将正确的数据插入数据库(即,我不能只编写SQL脚本来插入数据)。我的问题是我不想用这些自动化测试的大量测试数据污染我的测试数据库。因此,我想回滚测试期间对DB所做的所有更改 有人能提出一个明智的方法来实现这一点吗 最简单的方法是在运行测试之前创建数据库备份,然后在测试结束时恢复。有两种方法 一种是将测试封装在事务中并回滚。另一种方法是使用清理脚本作

我正在创建一系列web自动化测试,这些测试要求测试数据位于数据库中(SQLServer2008)。为了生成每个测试所需的数据,我必须调用一些C#代码,将正确的数据插入数据库(即,我不能只编写SQL脚本来插入数据)。我的问题是我不想用这些自动化测试的大量测试数据污染我的测试数据库。因此,我想回滚测试期间对DB所做的所有更改


有人能提出一个明智的方法来实现这一点吗

最简单的方法是在运行测试之前创建数据库备份,然后在测试结束时恢复。

有两种方法


一种是将测试封装在事务中并回滚。另一种方法是使用清理脚本作为测试完成代码的一部分(我们在一些事务不起作用的集成测试中这样做)。

当我无法控制测试的事务范围时,我通常每次都会从零开始删除并重新创建数据库

显然,这只有在测试可以针对裸模式运行(或者在创建脚本中插入硬编码的查找值)时才可行

当我对预填充了大量数据的快照数据库进行测试时,我以前使用过清理脚本,比如从每个表中删除基线快照最大id以上的所有记录

我还没有像AdaTheDev建议的那样尝试自动化备份/回滚,但如果您不想维护可能复杂(而且有缺陷)的清理脚本(取决于快照数据的复杂性/更改快照的频率和相应修改清理的频率),这可能是您最好的选择


您是否考虑过模拟数据访问,以便web测试针对内存中的数据存储运行?然后在内部测试数据访问过程,在那里您仍然可以回滚事务作用域?

听起来似乎很难使用事务,因为您将在一次测试中发出多个web请求-但这将是我的首选,因为它比从备份中恢复数据库快


如果您有正确版本的SQL server,您可以使用数据库快照而不是备份:,原因很简单:)

RedGate的向导刚刚发布了SQL虚拟还原,它将以实时、可读的方式装载备份文件,可写数据库—因此,您可以在测试之前拥有一个表示系统基线状态的备份文件,获取此备份的副本,将副本装载为测试数据库,运行测试,然后卸载并擦除副本

虚拟恢复已启动,如果您想试用,还需要14天的试用期


顺便说一句,我与Red Gate没有任何关系-我只是他们工具的热心用户。

显然,这一切都取决于您如何调用测试,但MbUnit中的“回滚”属性会起作用吗?

附带说明-我们通常使用特定的参考数据库进行集成测试,因此,在集成测试运行之前(即使使用回滚数据),系统始终处于已知的良好状态。甚至在测试结束时进行恢复,以便下次测试运行时,干净的数据库已经就绪。嗨,蒂姆,嗨,詹姆斯!杰米,我也会这么做的。将数据库设置为“完全”恢复模式。执行一次性完全备份,然后在每次测试运行开始时执行差异备份运行这应该非常快。在测试结束时,执行“恢复到时间点”-使用management studio向您展示实现自动化所需的脚本。我不清楚与将备份恢复到MyTestDb相比,有什么附加值?不需要工具。。。