NUnit - 是否可以在TearDown中检查测试是否成功?

时间:2009-09-24 17:53:12

标签: c# .net nunit

我想让我的TearDown方法在应用某些逻辑之前检查先前的测试是否成功。有一个简单的方法吗?

6 个答案:

答案 0 :(得分:31)

这已经在Ran's answer解决了类似的问题。 Quoting Ran:

从版本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();
    }
}

答案 1 :(得分:6)

如果您想使用TearDown检测NUnit 3.5上次测试的状态,那么应该是:

[TearDown]
 public void TearDown()
 {
   if (TestContext.CurrentContext.Result.Outcome.Status == TestStatus.Failed)
   {
      //your code
   }
 }

答案 2 :(得分:2)

听起来像一个危险的想法,除非它是一个集成测试,说删除数据说。为什么不在测试中做呢?

显然,可以设置班级中的私人标志。

如果你必须<{3}},Charlie Poole has suggested这就是

答案 3 :(得分:1)

仅在手动执行此操作时。实际上你甚至不知道打算运行哪些测试。在NUnit IDE中,可以启用一些测试并禁用其他测试。如果您想知道某个特定测试是否已经运行,您可以在测试类中包含这样的代码:

enum TestStateEnum { DISABLED, FAILED, SUCCEDED };
TestStateEnum test1State = TestStateEnum.DISABLED;

[Test]
void Test1()
{
test1State =  TestStateEnum.FAILED; // On the beginning of your test
...
test1State =  TestStateEnum.SUCCEDED; // On the End of your Test
}

然后你可以检查test1State变量。如果测试抛出异常,则不会设置SUCCEDED。你也可以在测试中使用稍微不同的逻辑把它放在try catch finally块中:

[Test]
void Test1()
{
test1State =  TestStateEnum.SUCCEDED; // On the beginning of your test
try
{
    ... // Your Test
}
catch( Exception )
{
   test1State =  TestStateEnum.FAILED;
   throw; // Rethrows the Exception
}
}

答案 4 :(得分:0)

    [OneTimeTearDown]
    public void AfterEachTest()
    {
        if (TestContext.CurrentContext.Result.Outcome.Status.Equals(TestStatus.Failed))
        {
           Console.WriteLine("FAILS");

        }
        else if (TestContext.CurrentContext.Result.Outcome.Equals(ResultState.Success))
        {
            Console.WriteLine("SUCESS");

        }
    }

答案 5 :(得分:-1)

恕我直言拆除逻辑应独立于测试结果。

理想情况下,你应该完全避免使用设置和拆解,al xunit.net。有关详细信息,请参阅here