【问题标题】:How to automate functional/integration tests and database rollbacks如何自动化功能/集成测试和数据库回滚
【发布时间】:2009-09-24 05:04:07
【问题描述】:

相对于我的previous question,我会尽量给出我的要求。

我正在尝试找到一些符合以下条件的框架/方法/“事物”:

  • 能够使用 C# 编写自动化测试,最好是在 Visual Studio 中编写。
  • 测试应该像用户一样驱动 Web 浏览器并与 SUT 交互。
  • 测试应该能够在 DB 中设置测试场景。
  • 测试应该能够断言用户交互在 DB 中具有预期的效果。
  • 测试完成后,它应该能够回滚它在 DB 中所做的所有更改。

我的第一次尝试是使用 NUnit 测试来驱动 Selenium(以及之前的 Watin),但是在使用 TransactionScope 回滚 Selenium 驱动的浏览器在数据库。

有没有人在“现实世界”中做过这样的事情?我通过谷歌找到了一些参考资料,但还没有找到任何具体的例子来说明如何实现这一点。如果我要进行单元测试,就不会有任何问题。在这种情况下,TransactionScope 就足够了。

编辑: R. Harvey 向我指出了this 问题,这与我的情况几乎相同。

不过,这个问题几乎完全相同。我的应用程序是一系列服务的一部分,它们都访问同一组数据库表。所需的测试数据量不允许有效使用 drop/create-scripts,那么是否有一些替代解决方案呢?

我们使用的是 SQL Server 2005,而我对数据库魔法不是很精通,所以如果除了 drop/create 之外还有其他方法可以使用 sql 脚本,那么这可能是一种选择。

编辑 2:

根据答案和一些额外的头疼问题,我们将为开发人员寻找更轻量级的数据库来执行单元、集成和功能测试。这使我们能够使用 sql 脚本来设置和拆除测试。

【问题讨论】:

  • 这可能会有所帮助:stackoverflow.com/questions/768944/…
  • 是的,我对 Selenium 本身没有任何问题。似乎是一个很棒的工具!问题在于将 Selenium 驱动的 broser 所做的更改回滚到 db 中。
  • 天哪,我怎么能错过。在发布此之前,我尝试进行广泛的搜索,但该问题中的场景几乎是复制品。我将在我的问题中添加一点以区别于他们的情况...

标签: asp.net database automated-tests integration-testing functional-testing


【解决方案1】:

事务中所做的更改仅在所述事务中可见。此外,将测试包装在事务范围内(如果可能的话)会使测试在非常关键的方面(事务)表现得与真实事物不同。

最好使用在每个测试套件之前还原的数据库映像。这样,在套件完成并完成验证后,您将删除测试数据库。下一次运行,在套件设置期间,数据库从保存的图像重新创建,处于原始状态,准备进行测试。更好的是拥有一个从头开始部署数据库并在套件设置期间运行该脚本的脚本。

顺便说一句,在每次测试之前恢复到原始状态是不可行的。更一般地,具有冗长的单独测试设置和清理步骤是不可行的。随着您添加更多测试,在测试之间将数据库恢复到测试就绪状态所花费的时间将变得难以管理。具有数百个测试的套件非常常见,并且数万个测试的完整测试运行意味着仅花费数小时和数小时来恢复数据库以进行测试。设计您的个人测试,以便它们可以独立运行,即。即使测试 N-1 失败,测试 N 也必须产生有效结果。

要考虑的另一件事是失败调查,您希望失败的测试使数据库处于可以调查有意义的信息的状态并且您希望后续测试能够运行并产生有效的信息结果。有时这些要求会相互矛盾,但您必须考虑它们并围绕它们设计测试。

【讨论】:

  • 感谢您的见解,尤其是关于故障调查的部分。我会将此标记为答案,因为我倾向于同意我最初想到的实际上并不是一个现实的解决方案。
  • 您肯定早就选择了您的方法,但请注意,您应该始终能够重现失败的测试,并且可能使用调试器逐步完成它。所以我不会因为保留数据库状态而出问题。
【解决方案2】:

如果将数据库恢复到已知良好状态所需的数据量禁止删除/创建脚本,并且您正在 SQL 2005 的开发人员或企业版上运行测试,您可以查看creating a database snapshot状态良好,每次测试前reverting to it。这比完全恢复要快得多,尽管如果您有数百个测试,它可能仍然太耗时。

【讨论】:

  • 感谢您的回复!这是我们质量保证部门的标准做法。我的目标是在代码进入 QA 之前找到一些轻量级的替代方案供开发人员使用。我认为我们必须为数据库寻找“开发”内容,这样它就有足够的数据在开发过程中进行快速测试。
【解决方案3】:

不要错过我在this related question 上推荐的Amnesia

【讨论】:

    猜你喜欢
    • 2010-10-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-05
    • 1970-01-01
    • 2011-04-09
    • 1970-01-01
    • 2020-09-25
    相关资源
    最近更新 更多