我正在使用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
答案 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是您测试的一部分。您可以定义的任何ActionAttribute也是如此,如另一个答案所示。不要在那里登录。
不幸的是,在测试中有记录的历史,因为NUnit要么没有提供替代方案 - 至少没有一个易于使用的方法。对于NUnit V2,您可以为此目的创建一个测试事件监听器插件。如果那是你正在使用的NUnit版本,你仍然可以。
对于NUnit 3.0及更高版本,您应该创建一个与TestEngine一起使用的侦听器扩展名。 TestEngine及其扩展与您的测试完全分开。一旦你有一个经过良好测试的扩展,你就可以在所有测试中使用它,并且测试不会被记录代码混乱。