NUnit - 是否可以在TearDown中检查测试是否成功?
只有当你手动执行此操作。事实上,你甚至不知道哪些测试打算运行。在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。你也可以把它放进一个尝试捕捉终于在您的测试块以稍微不同的逻辑:
[Test]
void Test1()
{
test1State = TestStateEnum.SUCCEDED; // On the beginning of your test
try
{
... // Your Test
}
catch(Exception)
{
test1State = TestStateEnum.FAILED;
throw; // Rethrows the Exception
}
}
它不是试图告诉哪个测试运行,只是我想抛出一个不同的错误,所以我可以得到更准确的堆栈跟踪 – 2009-09-24 19:11:04
恕我直言推倒逻辑应该是独立的测试结果。
理想情况下,你应该避免完全使用setup和teardown,al xunit.net。有关更多信息,请参阅here。
通常,绝对那是你应该做的。不过,我喜欢让自己的测试保持干净和内聚的BDD风格。有时候这意味着通过lambdas设置givens和assert并在TearDown中执行它们。问题是,如果由于某种原因安装程序或测试机构失败,堆栈跟踪令人困惑。 – 2009-09-24 19:09:32
对于类似的SO问题,这已经在Ran's answer中解决了。引用Ran:
从版本2.5.7开始,NUnit允许Teardown检测最后一次测试是否失败。 新的TestContext类允许测试访问关于它们自己的信息,包括TestStauts。
有关详细信息,请如果你想使用TearDown中检测与NUnit的3.5最后一次测试的状态是指http://nunit.org/?p=releaseNotes&r=2.5.7
[TearDown]
public void TearDown()
{
if (TestContext.CurrentContext.Result.Status == TestStatus.Failed)
{
PerformCleanUpFromTest();
}
}
感谢您的链接。请注意,这个问题在David回答之前的一年半内发布。 – 2013-05-06 20:00:22
在Nunit 3.x中它是'if(TestContext.CurrentContext.Result.Outcome == ResultState.Failure)' – Lukas 2016-07-11 15:44:18
它应该是:
[TearDown]
public void TearDown()
{
if (TestContext.CurrentContext.Result.Outcome.Status.Equals(TestStatus.Failed))
{
//your code
}
}
那是令人沮丧的,我会期望某种NUnit.CurrentTestContext API。我只需要知道测试是否成功,因为如果测试失败,我可以提供更多信息来帮助进行调试。 – 2009-09-24 19:14:49