从NUnit中的多个断言失败中删除失败消息

时间:2018-03-27 19:19:11

标签: nunit nunit-3.0

我已将测试配置为在发生故障时重试x次,以确保失败是合法的,而不是在运行期间出现侥幸。我没有在初始失败时记录错误消息。

但是,我注意到如果我正在运行测试,第一次测试失败,然后第二次测试通过,我通过TestContext.CurrentContext.Result.Message检查任何断言失败,并注意第一次迭代失败被记录,并且我的即使测试在第二次迭代期间通过,测试也显示为失败。如果两个测试都失败,我将收到“测试中的多个故障或警告。”

我想保留最终运行的失败与所有迭代的所有失败。有没有办法从TestContext.CurrentCOntext.Result.Message删除最初的失败?

编辑:我正在使用NUnit v 3.10.1,当我降级到v.3.4.0时,我得到了我想要的经验而没有对我的代码进行任何修改。

1 个答案:

答案 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));
}