使用SQL Server创建和回滚测试数据

6
我正在创建一系列需要测试数据存储在数据库(SQL Server 2008)中的Web自动化测试。为了生成每个测试所需的数据,我必须调用一些C#代码,将正确的数据插入到数据库中(即我不能只编写SQL脚本来插入数据)。我的问题是,我不想通过这些自动化测试向我的测试数据库添加大量测试数据。因此,希望在测试期间回滚对数据库所做的所有更改。有人能建议一个明智的方法来实现这一点吗?

https://blog.johnnyreilly.com/2016/09/12/integration-tests-with-sql-server/ - Karel Frajták
6个回答

5

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


甚至可以在测试结束时进行还原,这样下次运行测试时,干净的数据库已经就位。嗨,Tim,嗨,James! - mcintyre321
Jamie,我也会选择这样做。将数据库设置为“完整”恢复模型。做一次全备份,然后在每次测试运行开始时运行差异备份,这应该非常快。在测试结束时执行“按时间点还原”http://msdn.microsoft.com/en-us/library/ms190982.aspx - 使用管理工具显示自动化所需的脚本。 - Joel Mansford

4

有两种方法可以实现这个目标。

一种是将测试内容包含在一个事务中并进行回滚。另一种方法是在测试完成代码的清理脚本中使用(我们在某些集成测试中采用此方法,因为事务无法正常工作)。


顺便提一下 - 我们通常会使用特定的参考数据库来进行集成测试,以便在我们运行集成测试之前将系统置于已知的良好状态(即使有回滚数据)。这样可以让事情变得更轻松。 - Bob Palmer

2

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

显然,这仅在测试可以运行针对裸架构的情况下才可行(或者在创建脚本中插入硬编码查找值)。

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

我没有尝试像AdaTheDev建议的那样自动备份/回滚,但如果您不想维护可能复杂(和错误的)清理脚本(取决于快照数据的复杂性/您可能会多频繁更改您的快照并相应地修改您的清理操作),这听起来可能是最佳选择。

您是否考虑过模拟数据访问,以便您的Web测试运行针对内存中的数据存储?然后,在内部测试数据访问过程时,您仍然可以回滚事务范围?


2
红门软件的巫师们刚刚发布了SQL虚拟还原,它实际上可以将备份文件作为可读写的数据库挂载—因此您可以在测试之前有一个备份文件代表系统的基线状态,然后复制这个备份,在您的测试数据库中挂载副本,运行测试,然后卸载和清除该副本。
虚拟还原位于http://www.red-gate.com/products/sql_virtual_restore/index.htm,如果您想尝试一下,有14天的试用期。
顺便说一下,我与红门软件没有任何关联,我只是他们工具的热心用户。

不清楚与将备份还原到MyTestDb相比的附加值在哪里?无需工具... - iDevlop

1

听起来使用事务可能会很困难,因为您将在单个测试中进行多个Web请求 - 但这将是我的首选,因为它比从备份还原数据库更快。

如果您拥有正确版本的SQL服务器,则可以使用数据库快照而不是备份:http://msdn.microsoft.com/en-us/library/ms175876.aspx,因为它们更快 :)


0

显然这取决于您如何调用测试,但是在MbUnit中是否会起作用“Rollback”属性?


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接