【问题标题】:Remove failure message from multiple assertion failure in NUnit从 NUnit 中的多个断言失败中删除失败消息
【发布时间】:2018-03-29 22:06:38
【问题描述】:

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

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

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

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

【问题讨论】:

标签: nunit nunit-3.0


【解决方案1】:

在测试中使用 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));
}

【讨论】:

  • 谢谢你,罗伯!我们之前在测试中使用了[Retry(x)] 属性,但实现了上述解决方案,因为我们真的想在执行过程中出现未处理的异常时重试测试,而[Retry(x)] 属性不支持这一点。
  • 那么我们应该给 NUnit 添加一个 issue 来处理意外的异常。我会这样做的:)
  • 只是后续,看来新版本的 NUnit(当前为 v3.10.1)实际上可能存在问题。我实现了上述解决方案,并说我有[Retry(3)] 并且测试失败了两次,但第三次通过了,我的报告将显示测试失败,但是当我深入研究步骤时,它会显示通过状态。 NUnit v3.4 不会发生这种情况。此外,如果所有三个测试都失败,我将收到上述“测试中的多次失败或警告”消息,而不是预期的最后一次测试的失败。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多