C# NUnit分组断言在并行测试中的应用

C# NUnit分组断言在并行测试中的应用,c#,multithreading,unit-testing,nunit,C#,Multithreading,Unit Testing,Nunit,我希望并行运行NUNit测试,因为我有很重的等待条件,这些条件最终会以顺序方式进行长时间的测试运行。下面概述的这种简化结构适合我的所有需要,但是,当我调用TestParallel方法时,NUnit似乎正在对断言进行分组 public class Tests { [Test] public void Test1() { Assert.Fail("Test1 Failure"); } [Test] public v

我希望并行运行NUNit测试,因为我有很重的等待条件,这些条件最终会以顺序方式进行长时间的测试运行。下面概述的这种简化结构适合我的所有需要,但是,当我调用
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
'


我必须采取哪些措施来避免这种行为?

运行您的测试是我的工作,而不是您的测试。:-)

在代码中,您为NUnit提供了三个要运行的测试:Test1、Test2和TestParallel。确实如此,但TestParallel也在第二次启动Test1和Test2。他们的断言被视为TestParallel的一部分,并相应地报告

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


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

[Parallelizable]
是我研究的第一个资源,但不幸的是,由于现有库的规模和技术债务,这不是一个选项。在实际使用中,
TestParallel
方法对程序集执行反射,创建TestClass的新实例,并根据运行时发现的TestID执行匹配方法。在这种情况下,您实际上已经接管了运行测试的工作,第一个选项将是您的最佳选择。考虑到你做了这么多,我想知道你为什么要把自己的代码和NUnit混合在一起,而不是作为自己的运行者。因为有多个CI进程需要在不同的条件下运行不同的测试,作为构建步骤,CI管道设置为仅运行TestParallel,而不是通过命令行传递测试来咨询要运行的devops工程师。它在运行时动态地从API中提取,并且只执行它在程序集中找到的符合条件的测试。按照我的建议,在不涉及NUnit的情况下完成这项工作将是一项巨大的努力——大约相当于NUnit本身的规模。:-)