我已将测试配置为在发生故障时重试x次,以确保失败是合法的,而不是在运行期间出现侥幸。我没有在初始失败时记录错误消息。
但是,我注意到如果我正在运行测试,第一次测试失败,然后第二次测试通过,我通过TestContext.CurrentContext.Result.Message
检查任何断言失败,并注意第一次迭代失败被记录,并且我的即使测试在第二次迭代期间通过,测试也显示为失败。如果两个测试都失败,我将收到“测试中的多个故障或警告。”
我想保留最终运行的失败仅与所有迭代的所有失败。有没有办法从TestContext.CurrentCOntext.Result.Message
删除最初的失败?
编辑:我正在使用NUnit v 3.10.1,当我降级到v.3.4.0时,我得到了我想要的经验而没有对我的代码进行任何修改。
答案 0 :(得分:2)
如果测试失败,请在测试中使用NUnit的[Retry(5)]
属性重试测试。您发布的链接中的变通方法取决于NUnit的未记录的内部行为,这些行为可能会在不同版本之间发生变化。
根据下面的评论进行更新,如果您需要处理意外的异常,请将可能引入try / catch块的片状代码包装起来,然后在该块之外进行断言。
[Test]
[Retry(5)]
public void TestFlakyMethod()
{
int result = 0;
try
{
result = FlakyAdd(2, 2);
}
catch(Exception ex)
{
Assert.Fail($"Test failed with unexpected exception, {ex.Message}");
}
Assert.That(result, Is.EqualTo(4));
}
int FlakyAdd(int x, int y)
{
var rand = new Random();
if (rand.NextDouble() > 0.5)
throw new ArgumentOutOfRangeException();
return x + y;
}
除此之外,您还可以使用Assert.DoesNotThrow
,它更清晰,更容易编写。
[Test]
[Retry(5)]
public void TestFlakyMethod()
{
int result = 0;
Assert.DoesNotThrow(() => {{
result = FlakyAdd(2, 2);
});
Assert.That(result, Is.EqualTo(4));
}