1

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

TearDown我的测试中,我调用了一个报告测试结果的方法。如果测试通过,它就可以正常工作,但如果测试失败、被忽略或不确定,则永远无法达到。

为了让事情变得更加困难,“//do stuff”中的“//do stuff”TearDown也可能导致测试失败,在这种情况下仍然需要记录它。但是Assert会引发异常,这意味着它会离开块并且永远不会到达报告代码。

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

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

[TearDown]
public void ExampleTearDown()
{
    //do stuff
    someObject.ReportTestResult();
}

更多信息 - 使用 NUnit 3.2.0

4

2 回答 2

1

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

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

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

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

于 2016-04-01T20:33:50.557 回答
1

通过查看NUnit 文档框架可扩展性一章,我们可以看到您需要使用操作属性

动作属性扩展点是:

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

这个扩展点的一个基本实现总结

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

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

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

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

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

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

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

于 2016-04-01T18:16:49.690 回答