NUnit - 我可以通过密钥对测试进行分组并在每个组中并行运行测试,但是每个组都是串联的吗?

时间:2017-09-21 12:07:58

标签: unit-testing nunit

我有一大堆目前正在运行的测试。我想尽可能地使套件可并行化。我遇到的一个大问题是,某些测试需要以某种方式设置某个全局应用程序状态,而某些测试需要以另一种方式设置它。有没有办法让NUnit测试运行组根据它们需要的全局状态进行测试,然后在每个组内并行运行测试,并修改组之间的全局状态?

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

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

  1. 设置Foo = N,其中N是该组的Foo值。
  2. 并行运行该组中的所有测试。
  3. 在一个理想的世界里,我会为这个全球状态建立一个模拟系统,但这需要花费很多时间,而我现在还没有。我可以让NUnit做这个或类似的东西吗?

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

    这是一个伪代码示例。

    默认情况下,测试按以下方式执行:

    foreach (var t in allTests)
    {
        Run(t);
    }
    

    NUnits的基本并行行为是这样的:

    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));
    }
    

1 个答案:

答案 0 :(得分:1)

当你陈述问题时,它在NUnit中还不可能。计划但尚未实施的功能允许任意分组可能一起运行的测试。

您的解决方法是让每个"组"测试,因为NUnit只允许在测试中指定并行化。请注意,通过测试,我们指的是测试用例或一组测试,即夹具或命名空间套件。

在层次结构中的任何位置放置[Parallelizable]导致该测试与同一级别的其他测试并行运行。在其上放置[NonParallelizable]会导致相同的测试单独运行。

假设您有五个需要Foo值的灯具。您可以使每个灯具不可并行化。这样,他们中没有一个可以同时运行并干扰其他人。

如果你想允许那些灯具​​与其他非Foo灯具并行运行,只需将它们全部放在同一个命名空间中,如Tests.FooRequred。 在该命名空间中创建一个SetupFixture - 可能是一个虚拟的,没有任何实际的设置操作。将[Parallelizable]属性放在上面。

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