【问题标题】:NUnit grouping asserts in parallel testing并行测试中的 NUnit 分组断言
【发布时间】:2020-08-31 15:14:49
【问题描述】:

我想并行运行 NUUnit 测试,因为我有大量的等待条件,最终会以顺序方式进行大量长时间的测试运行。下面概述的这种简化结构适合我的所有需求,但是,当我调用 TestParallel 方法时,NUnit 似乎正在对断言进行分组

public class Tests
{
    [Test]
    public void Test1()
    {
        Assert.Fail("Test1 Failure");
    }

    [Test]
    public void Test2()
    {
        Thread.Sleep(1000);
        Assert.Fail("Test2 Failure");
    }

    [Test]
    public void TestParallel()
    {
        var toRun = new Task[]
        {
            Task.Run(() => Test1()),
            Task.Run(() => Test2())
        };
        Task.WaitAll(toRun);
    }
}

两个测试都按预期失败,但是第二个失败的测试也显示第一个失败的测试断言异常,如下所示:

NUnit.Framework.AssertionException: 'Multiple failures or warnings in test:
  1) Test1 Failure
  2) Test2 Failure
'

我有哪些选择可以避免这种行为?

【问题讨论】:

    标签: c# multithreading unit-testing nunit


    【解决方案1】:

    运行测试是 NUnit 的工作,而不是你的工作。 :-)

    在您的代码中,您为 NUnit 提供了三个要运行的测试,Test1、Test2 和 TestParallel。它这样做了,但 TestParallel 也第二次启动了 Test1 和 Test2。他们的断言被认为是 TestParallel 的一部分,并据此报告。

    当然,您可以从 Test1 和 Test2 中删除 [Test] 属性,只留下一个包含其他两个的测试。这不是一种可以很好扩展的方法。

    更自然的方法是让 NUnit 并行运行测试,而不是自己进行。为此,请将 [Parallelizable] 添加到 Test1 和 Test2 并删除 TestParallel。

    【讨论】:

    • [Parallelizable] 是我研究的第一个资源,但不幸的是,由于现有库的规模和技术债务,这不是一个选择。实际使用中TestParallel方法对程序集进行反射,新建TestClasses实例,根据运行时发现的TestIds执行匹配方法。
    • 在这种情况下,您实际上已经接管了运行测试的工作,而第一个选项将是您最好的选择。鉴于你做了这么多,我想知道你为什么将它作为你自己的代码和 NUnit 的混合体来做,而不是作为你自己的跑步者。
    • 因为有多个 CI 流程需要在不同的条件下运行不同的测试,而不是通过命令行传递测试作为构建步骤来咨询 devops 工程师要运行的测试,CI 管道设置为仅运行 TestParallel。它在运行时动态地从 API 中提取,并且只执行它在程序集中找到的符合条件的测试。
    • 明白。如我所建议的那样,在不涉及 NUnit 的情况下做到这一点将是一项巨大的努力——大约是 NUnit 本身的大小。 :-)
    猜你喜欢
    • 1970-01-01
    • 2013-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多