NUnit - 测试失败后清理

bh2*_*213 41 .net nunit nunit-2.5

我们有一些访问数据库的NUnit测试.当其中一个失败时,它可能使数据库处于不一致状态 - 这不是问题,因为我们为每次测试运行重建数据库 - 但它可能导致其他测试在同一次运行中失败.

是否有可能检测到其中一个测试失败并执行某种清理?

我们不想在每个测试中编写清理代码,我们现在已经这样做了.我想在Teardown中进行清理,但只有在测试失败的情况下才能进行清理,因为清理可能很昂贵.

更新:澄清 - 我希望测试很简单,不包括任何清理或错误处理逻辑.我也不想在每次测试运行时执行数据库重置 - 仅在测试失败时.这个代码应该可以在Teardown方法中执行,但是我不知道有什么方法可以获取信息,如果测试我们目前正在从失败或成功中拆除.

Update2:

        [Test]
        public void MyFailTest()
        {
            throw new InvalidOperationException();
        }

        [Test]
        public void MySuccessTest()
        {
            Assert.That(true, Is.True);
        }

        [TearDown]
        public void CleanUpOnError()
        {
            if (HasLastTestFailed()) CleanUpDatabase();
        }
Run Code Online (Sandbox Code Playgroud)

我正在寻找HasLastTestFailed()的实现

小智 65

从版本2.5.7开始,NUnit允许Teardown检测上次测试是否失败.新的TestContext类允许测试访问有关自身的信息,包括TestStauts.

有关更多详细信息,请参阅http://nunit.org/?p=releaseNotes&r=2.5.7

[TearDown]
public void TearDown()
{
    if (TestContext.CurrentContext.Result.Status == TestStatus.Failed)
    {
        PerformCleanUpFromTest();
    }
}
Run Code Online (Sandbox Code Playgroud)

  • TestContext.CurrentContext.Result.Outcome.Status == TestStatus。在NUnit 3.0中失败 (2认同)

Iga*_*nik 20

这个想法让我感兴趣,所以我做了一点挖掘.NUnit没有开箱即用的这种能力,但NUnit提供了一个完整的可扩展性框架.我发现这篇关于扩展NUnit的好文章 - 这是一个很好的起点.在使用它之后,我想出了以下解决方案:CleanupOnError如果灯具中的一个测试失败,将调用用自定义属性修饰的方法.

以下是测试的样子:

  [TestFixture]
  public class NUnitAddinTest
  {
    [CleanupOnError]
    public static void CleanupOnError()
    {
      Console.WriteLine("There was an error, cleaning up...");
      // perform cleanup logic
    }

    [Test]
    public void Test1_this_test_passes()
    {
      Console.WriteLine("Hello from Test1");
    }

    [Test]
    public void Test2_this_test_fails()
    {
      throw new Exception("Test2 failed");
    }

    [Test]
    public void Test3_this_test_passes()
    {
      Console.WriteLine("Hello from Test3");
    }
  }
Run Code Online (Sandbox Code Playgroud)

属性的简单地:

  [AttributeUsage(AttributeTargets.Method, AllowMultiple = false, Inherited = false)]
  public sealed class CleanupOnErrorAttribute : Attribute
  {
  }
Run Code Online (Sandbox Code Playgroud)

这是从插件执行的方式:

public void RunFinished(TestResult result)
{
  if (result.IsFailure)
  {
    if (_CurrentFixture != null)
    {
      MethodInfo[] methods = Reflect.GetMethodsWithAttribute(_CurrentFixture.FixtureType,
                                                             CleanupAttributeFullName, false);
      if (methods == null || methods.Length == 0)
      {
        return;
      }

      Reflect.InvokeMethod(methods[0], _CurrentFixture);
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

但这里是棘手的部分:必须将插件放在addinsNUnit跑步者旁边的目录中.Mine被放置在TestDriven.NET目录中的NUnit运行器旁边:

C:\Program Files\TestDriven.NET 2.0\NUnit\addins

(我创建了addins目录,它不在那里)

编辑另一件事是清理方法需要static!

我一起破解了一个简单的插件,你可以从我的SkyDrive下载源代码.你将不得不增加引用nunit.framework.dll,nunit.core.dllnunit.core.interfaces.dll在适当的地方.

一些注意事项:属性类可以放在代码中的任何位置.我不想将它放在与addin本身相同的程序集中,因为它引用了两个CoreNUnit程序集,因此我将它放在不同的程序集中.CleanAddin.cs如果您决定将其放在其他位置,请记住更改中的行.

希望有所帮助.