Unit testing NUnit-我可以按键对测试进行分组,并在每个组中并行运行测试,但在每个组中串联运行测试吗?

Unit testing NUnit-我可以按键对测试进行分组,并在每个组中并行运行测试,但在每个组中串联运行测试吗?,unit-testing,nunit,Unit Testing,Nunit,我有一大套测试,目前正在系列运行。我希望尽可能使套件可并行化。我遇到的一个大问题是,有些测试要求以一种方式设置某些全局应用程序状态,而有些测试则要求以另一种方式设置。是否有一种方法可以使NUnit测试运行程序根据其所需的全局状态对我的测试进行分组,然后在每个组内并行运行测试,并修改组之间的全局状态 例如,假设有一个全局设置Foo和一个自定义属性[RequiresFoo(X)],可用于注释测试需要的Foo值。在运行时,我希望NUnit将所有测试按其参数分组为RequiresFoo,将未标记的测试计

我有一大套测试,目前正在系列运行。我希望尽可能使套件可并行化。我遇到的一个大问题是,有些测试要求以一种方式设置某些全局应用程序状态,而有些测试则要求以另一种方式设置。是否有一种方法可以使NUnit测试运行程序根据其所需的全局状态对我的测试进行分组,然后在每个组内并行运行测试,并修改组之间的全局状态

例如,假设有一个全局设置
Foo
和一个自定义属性
[RequiresFoo(X)]
,可用于注释测试需要的
Foo
值。在运行时,我希望NUnit将所有测试按其参数分组为
RequiresFoo
,将未标记的测试计算为具有一些默认值
Foo

然后,对于每个组,我希望它

  • 设置
    Foo=N
    ,其中
    N
    是该组的
    Foo
  • 并行运行该组中的所有测试
  • 在一个理想的世界里,我会为这个全球国家建立一个模拟系统,但这需要很多时间,而我现在还没有。我能让NUnit这样做吗

    注意,我需要能够在组之间执行任何方法,而不仅仅是设置一个变量。我实际处理的全局上下文可能涉及启动或停止微服务、更新配置文件等。我可以将这些需求序列化为字符串以传递给自定义属性,但在运行时,我需要能够运行任意代码来解析需求并重新配置环境


    下面是一个伪代码示例

    默认情况下,测试按如下顺序执行:

    foreach (var t in allTests)
    {
        Run(t);
    }
    
    Parallel.ForEach(allTests, t => Run(t));
    
    var grouped = allTests
        .GroupBy(t => GetRequirementsFromCustomAttributes(t));
    
    foreach (var g in grouped)
    {
        SetGlobalState(g.Key);
        Parallel.ForEach(g, t => Run(t));
    }
    
    其基本并行行为如下所示:

    foreach (var t in allTests)
    {
        Run(t);
    }
    
    Parallel.ForEach(allTests, t => Run(t));
    
    var grouped = allTests
        .GroupBy(t => GetRequirementsFromCustomAttributes(t));
    
    foreach (var g in grouped)
    {
        SetGlobalState(g.Key);
        Parallel.ForEach(g, t => Run(t));
    }
    
    我想要这样的东西:

    foreach (var t in allTests)
    {
        Run(t);
    }
    
    Parallel.ForEach(allTests, t => Run(t));
    
    var grouped = allTests
        .GroupBy(t => GetRequirementsFromCustomAttributes(t));
    
    foreach (var g in grouped)
    {
        SetGlobalState(g.Key);
        Parallel.ForEach(g, t => Run(t));
    }
    

    正如你所说的问题,在努尼特还不可能。有一个已计划但尚未实施的特性,允许对可能不同时运行的测试进行任意分组

    您的解决方法是使每个“组”都成为一个测试,因为NUnit只允许在测试上指定并行化。注意,所谓测试,我们指的是一个测试用例或一组测试,即fixture或namespace套件

    [Parallelizable]
    放在层次结构中任何位置的测试都会导致该测试与同一级别的其他测试并行运行。将
    [NonParallelizable]
    放在它上面会导致相同的测试在隔离状态下运行

    假设有五个装置要求值为Foo。您将使这些装置中的每一个都不可并行化。这样,他们中的任何一个都不能同时运行并干扰其他人

    如果您想让这些fixture与其他非Foo fixture并行运行,只需将它们全部放在同一名称空间中,如
    Tests.foorequre
    。 在该命名空间中创建一个
    SetupFixture
    ——可能是一个没有任何实际设置操作的虚拟。将
    [Parallelizable]
    属性放在上面


    然后,所有foo测试组将与其他测试并行运行,而各个装置将不会彼此并行运行。

    谢谢Charlie。我不知道名称空间装置。这可能就解决了问题。小小的技术修正:不管你做什么,我们都有名称空间套件。但是,如果在名称空间中创建SetUpFixture,它将接管名称空间套件的工作,并允许更高级别的一次性设置和拆卸。在本例中,我建议使用SetupFIxture只是为了给您一些属性可以显示的内容—属性不适用于名称空间?还是
    [Parallelizable]
    起到了作用?