NUnit测试可以在手动停止后进行清理吗?

时间:2014-08-05 17:09:42

标签: unit-testing nunit integration-testing

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

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

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

2 个答案:

答案 0 :(得分:0)

如果你停止代码执行,你也会停止程序,所以不会执行任何其他操作。

您可以执行的操作是删除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()
    { /* ... */ }
  }
}

答案 1 :(得分:0)

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

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

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

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