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

我想让我的TearDown方法在应用某些逻辑之前检查先前的测试是否成功。 是否有捷径可寻?

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

显然,可以设置类中的私有标志。

如果你必须的话,这就是查理普尔本人的建议

在Ran对类似SO问题的回答中已经解决了这个问题。 引用冉:

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

如果你想使用TearDown来检测NUnit 3.5上次测试的状态,它应该是:

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

仅当您手动执行此操作时。 实际上,您甚至不知道打算运行哪些测试。 在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变量。 如果测试抛出exception,则不会设置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 } } 

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

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