C# 如何在每次NUnit测试后运行方法(即使在拆卸过程中失败)

C# 如何在每次NUnit测试后运行方法(即使在拆卸过程中失败),c#,testing,nunit,nunit-3.0,teardown,C#,Testing,Nunit,Nunit 3.0,Teardown,我正在使用NUnit开发一个测试库,并在测试运行时生成一个自定义报告 在测试的TearDown中,我调用了一个报告测试结果的方法。如果测试通过,它就可以正常工作,但是如果测试失败、被忽略或没有结论,它就永远无法实现 为了使事情变得更加困难,拆卸中的“//do stuff”也会导致测试失败,在这种情况下,仍然需要记录测试。但是,Assert抛出一个异常,这意味着它离开块,永远不会到达报告代码 [SetUp] public void ExampleSetup() { //whatever }

我正在使用NUnit开发一个测试库,并在测试运行时生成一个自定义报告

在测试的
TearDown
中,我调用了一个报告测试结果的方法。如果测试通过,它就可以正常工作,但是如果测试失败、被忽略或没有结论,它就永远无法实现

为了使事情变得更加困难,拆卸中的“//do stuff”也会导致测试失败,在这种情况下,仍然需要记录测试。但是,
Assert
抛出一个异常,这意味着它离开块,永远不会到达报告代码

[SetUp]
public void ExampleSetup()
{
    //whatever
}

[Test]
public void ExampleTest()
{
    //whatever
}

[TearDown]
public void ExampleTearDown()
{
    //do stuff
    someObject.ReportTestResult();
}
更多信息 -使用NUnit 3.2.0

通过查找的章节,我们可以看到您需要使用

操作属性扩展点是:

旨在通过创建 属性,这些属性封装了在或之前要执行的特定操作 在测试运行之后

此扩展点的基本实现摘要 您需要在给定的say
FooBarActionAttribute()
类中实现
ITestAction
接口

鉴于此,您实现了
BeforeTest()
postertest()
目标
属性

对于基本场景,您需要使用上述两种方法执行自定义操作

您需要做的最后一件事是使用此属性,例如:

[Test][FooBarActionAttribute()]
public void Should_Baz_a_FooBar() { 
    ...
}
这将在测试方法运行前后执行


有关更高级的技术,请参阅链接文档,它非常简单。

坦率地说,这只是一个坏主意。拆卸是测试的一部分。这就是它可能失败的原因。(但请注意,NUnit将拆卸中的断言失败视为错误而不是失败)

因为测试可以做任何事情——好的或坏的,对的或错的——所以将您的日志记录到测试代码中是不可靠的。您应该登录运行测试的代码,而不是测试本身。如上所述,拆卸是测试的一部分。正如另一个答案中所建议的,您可以定义的任何ActionAttribute也是如此。不要在那里做日志记录

不幸的是,有在测试中进行日志记录的历史,因为NUnit要么没有提供替代方案——至少没有一个易于使用的方案。对于NUnit V2,您可以创建一个测试事件侦听器加载项来实现此目的。如果你使用的是NUnit的版本,你仍然可以

对于NUnit 3.0及更高版本,您应该创建一个可与TestEngine一起使用的侦听器扩展。TestEngine及其扩展完全独立于您的测试。一旦您有了一个经过良好测试的扩展,您将能够在所有测试中使用它,并且测试不会被日志代码弄乱