【问题标题】:Creating & rolling back test data with SQL server使用 SQL Server 创建和回滚测试数据
【发布时间】:2011-05-16 21:53:20
【问题描述】:

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

谁能提出一个明智的方法来实现这一目标?

【问题讨论】:

标签: c# sql-server automated-tests test-data webautomation


【解决方案1】:

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

【讨论】:

  • 或者甚至在测试结束时进行恢复,以便下次运行测试时干净的数据库已经到位。嗨蒂姆,嗨詹姆斯!
  • 杰米,我也会这样做。将数据库设置为“完整”恢复模式。进行一次性完整备份,然后在每次测试运行开始时进行差异备份运行,这应该非常快。在测试结束时执行“恢复到时间点”msdn.microsoft.com/en-us/library/ms190982.aspx - 使用管理工作室向您展示自动化测试所需的脚本。
【解决方案2】:

有两种方法。

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

【讨论】:

  • 附带说明 - 我们通常使用特定的参考数据库进行集成测试,因此在我们的集成测试运行之前系统始终处于已知的良好状态(即使有回滚数据)。让事情变得更容易。
【解决方案3】:

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

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

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

没有像 AdaTheDev 建议的那样尝试自动备份/回滚,但如果您不想维护潜在的复杂(和错误)清理脚本(取决于快照数据的复杂性/您可能多久更改一次快照并必须相应地修改您的清理)。

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

【讨论】:

    【解决方案4】:

    Red Gate 的向导刚刚发布了 SQL Virtual Restore,它实际上会将备份文件挂载为实时、可读、可写的数据库 - 因此您可以在测试之前拥有一个代表系统基线状态的备份文件,采取此备份的副本,将副本装载为您的测试数据库,运行测试,然后卸载并擦除副本。

    Virtual Restore 位于 http://www.red-gate.com/products/sql_virtual_restore/index.htm,如果您想试用,可以试用 14 天。

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

    【讨论】:

    • 我不清楚与将备份恢复到 MyTestDb 相比有什么附加价值?无需工具...
    【解决方案5】:

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

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

    【讨论】:

      【解决方案6】:

      显然,这完全取决于您如何调用测试,但 MbUnit 中的“回滚”属性是否有效?

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-09-06
        • 1970-01-01
        • 1970-01-01
        • 2017-09-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多