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

Remove failure message from multiple assertion failure in NUnit

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

但是,我注意到如果我正在 运行 测试,第一个测试失败,然后第二个测试通过,我通过 TestContext.CurrentContext.Result.Message 检查是否有任何断言失败并注意到记录第一次迭代失败并且我的测试显示为失败,即使测试在第二次迭代期间通过。如果两个测试都失败了,我将收到 "Multiple failures or warnings in test."

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

中删除初始失败

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

如果测试失败,请在测试中使用 NUnit 的 [Retry(5)] 属性重试测试。您发布的 link 中的解决方法取决于 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));
}