如何在每次NUnit测试后运行方法(甚至在拆卸中失败)

时间:2016-04-01 17:42:33

标签: c# testing nunit nunit-3.0 teardown

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

在我的测试的List<bool> values; var result = dic.TryGetValue(key, out values) ? values.Where(x => x == true).ToList() : new List<bool>(); 中,我调用了一个报告测试结果的方法。如果测试通过,它可以正常工作,但如果测试失败,被忽略或不确定,则永远不会达到。

为了让事情变得更加困难,&#34; //做东西&#34;在TearDown中也可能导致测试失败,在这种情况下仍然需要记录。但是TearDown会抛出异常,这意味着它会离开块并且永远不会到达报告代码。

Assert

更多信息   - 使用NUnit 3.2.0

2 个答案:

答案 0 :(得分:1)

通过查找NUnit documentation Framework Extensibility章节,我们可以看到您需要使用Action Attribute

Action Attribute扩展点是:

  

旨在通过创建更好地实现测试逻辑的可组合性   封装在之前或之前要采取的特定操作的属性   在测试完成后。

此扩展点的基本实现摘要

您需要在给定的ITestAction类中实现FooBarActionAttribute()接口。

鉴于此,您实施了BeforeTest()AfterTest()Targets属性。

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

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

[Test][FooBarActionAttribute()]
public void Should_Baz_a_FooBar() { 
    ...
}

这将在测试方法运行之前和之后执行。

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

答案 1 :(得分:1)

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

由于测试可以做任何事情 - 好的或坏的,对或错 - 将您的日志记录放入测试代码是不可靠的。您应该登录运行测试的代码,而不是测试本身。如上所述,TearDown是您测试的一部分。您可以定义的任何ActionAttribute也是如此,如另一个答案所示。不要在那里登录。

不幸的是,在测试中有记录的历史,因为NUnit要么没有提供替代方案 - 至少没有一个易于使用的方法。对于NUnit V2,您可以为此目的创建一个测试事件监听器插件。如果那是你正在使用的NUnit版本,你仍然可以。

对于NUnit 3.0及更高版本,您应该创建一个与TestEngine一起使用的侦听器扩展名。 TestEngine及其扩展与您的测试完全分开。一旦你有一个经过良好测试的扩展,你就可以在所有测试中使用它,并且测试不会被记录代码混乱。