【问题标题】:Can NUnit tests be cleaned up after they've been manually stopped?NUnit 测试在手动停止后可以清理吗?
【发布时间】:2014-09-28 10:54:14
【问题描述】:

我正在使用 NUnit 和 Resharper 作为测试运行器为我的应用程序编写一些测试。我有一个测试,它使用自定义数据访问层在 SQL 中创建条目,然后检查它们是否实际上已创建。此检查是通过使用 SqlDataAdapter 的更直接连接来完成的。

收集测试结果后,测试条目从表中删除(在测试方法中,而不是在 TearDown() 中)。我注意到,由于各种原因,我经常在中间停止测试,而且它们显然没有被清理,因为我告诉测试停止,所以它永远不会到达清理代码。根据我的经验,当使用停止按钮停止测试时,即使 TearDown() 也不会被调用。

我的问题是:当我点击停止按钮时,有没有办法调用清理程序来删除测试工件?

【问题讨论】:

  • 我怀疑这是可能的,因为您实际上是在退出程序。注意:这是集成测试,而不是单元测试。最好的做法是让每个测试都创建自己的数据库,而不是让它们混合在一起。
  • 关于集成测试的部分你是正确的。我觉得为了确保应用程序的可靠性,最好在尽可能接近真实的条件下进行测试,这就是我决定针对实际数据库进行测试的原因。测试创建自己的数据库有优势吗?这是测试从您的应用程序到数据库模式的整个链的可靠方法吗?编辑:我在评论完成之前不小心按了 Enter。
  • 这就是存在模拟框架(例如 NSubstitute)的原因。

标签: unit-testing nunit integration-testing


【解决方案1】:

如果您停止代码执行,您也将停止该过程,因此不会执行任何其他操作。

您可以做的就是删除Set Up。此方法在每次测试之前执行。这似乎是确保数据库干净的最佳方法。

SetUpAttribute (NUnit 2.0)

此属性在 TestFixture 中使用,以提供一组公共函数,这些函数在调用每个测试方法之前执行。一个 TestFixture 只能有一个 SetUp 方法。如果定义了多个,TestFixture 将成功编译,但其测试不会运行。

示例

namespace NUnit.Tests
{
  using System;
  using NUnit.Framework;

  [TestFixture]
  public class SuccessTests
  {
    [SetUp] public void Init()
    { /* ... */ }

    [TearDown] public void Dispose()
    { /* ... */ }

    [Test] public void Add()
    { /* ... */ }
  }
}

【讨论】:

  • 这是个好主意,尽管唯一需要注意的是最后一次测试仍会留下一些伪影。我正在考虑创建自己的测试运行程序,其中可以使用 CancellationToken 取消测试,然后运行一些例程来清理它们。虽然我不确定我正在研究的任务有多大。
  • @Anshul:最后一次测试仍然会有一些工件,但下一次运行的测试会删除它们,所以没有人会看到其他数据:)
  • 在最后一次运行和第一次运行之间怎么办?我还是会看到那个时期的数据吧?
  • @Anshul:没错,但从我的角度来看,如果数据库仅用于测试目的似乎无关紧要。
  • 理想情况下,在启动我的应用程序之前,所有测试都会通过,这样所有测试都会正确清理。但我正在考虑一个我不小心运行测试并让应用程序运行的场景。我还没有完全决定是否应该在实时数据库上运行测试,因为我已经制作了我的应用程序以便它会忽略测试条目,但我不希望这些条目随着时间的推移而徘徊和积累。我还考虑过只在其上运行测试的复制数据库。
【解决方案2】:

如果您的测试连接到数据库,那么它们实际上并不是“单元”测试,而是更多的集成测试。单元测试的执行不应影响应用程序中的任何其他层。

我建议你使用“依赖注入”机制。简而言之,构建您的自定义数据访问层,以便在初始化时将 SQL 连接对象传递给它。从您的应用程序中,您传递实际连接,但从您的单元测试中,您传递一个模拟连接。然后,您可以断言是否执行了查询或非查询的模拟连接。

这样,您的数据库中根本不会插入任何数据,如果您的测试在执行过程中停止,您无需担心清理它。

您可以在这篇文章中查看模拟 SQL 连接的示例:Mocking data access Layer Rhino mock

【讨论】:

    猜你喜欢
    • 2010-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-29
    • 2010-10-30
    • 1970-01-01
    • 2011-07-03
    • 1970-01-01
    相关资源
    最近更新 更多