You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

NUnit三层并行-串行-并行测试结构实现技术问询

NUnit 实现三层并行+串行混合测试结构的配置方案

先明确需求

咱们要的是这种三层测试结构:

  • 顶层(场景):多个场景并行运行,相互完全隔离(每个场景独立创建重型对象)
  • 中层(步骤):同一个场景内的步骤必须按顺序串行执行,但不同场景的步骤可以和其他场景的任意步骤并发
  • 底层(测试用例):同一个步骤里的用例可以并行,不同步骤、不同场景的用例也都能并行

之前的配置问题分析

你试的几种配置没达到预期,问题出在这:

  1. 只给顶层Fixture加[ParallelScope.Self],但NUnit默认不开启Fixture级并行,所以顶层还是串行
  2. 加[assembly: ParallelScope.Children]会让所有层级的子节点都并行,导致同场景内的步骤也乱序并行,破坏了步骤的串行要求
  3. 步骤加[ParallelScope.Children | ParallelScope.None]是把当前步骤标记为非并行,而且全局生效,导致所有场景的步骤都串行,浪费了跨场景并发的能力
  4. [assembly: ParallelScope.Fixtures]虽然开启了Fixture并行,但没控制场景内步骤的串行性,导致同场景内的步骤也会并行,不符合需求

正确的配置方案

分四个部分来配置,精准控制每个层级的并行规则:

1. 全局程序集级配置

先在项目的AssemblyInfo.cs或者任意类的顶部加这两行,全局层面开启Fixture并行,同时默认所有节点非并行(后续按需开启):

[assembly: Parallelizable(ParallelScope.Fixtures)]
[assembly: NonParallelizable]

2. 顶层场景(TestFixture)配置

每个顶层场景类标记为TestFixture,同时显式开启自身的并行能力,确保和其他场景可以并行:

[TestFixture]
[Parallelizable(ParallelScope.Self)] // 允许这个场景和其他场景并行
public class TopLevelScenarioOne
{
    // 重型对象的初始化,放在OneTimeSetUp里,每个场景独立执行
    [OneTimeSetUp]
    public void SetupHeavyObject()
    {
        // 这里创建你的重型对象、初始化流程
    }

    // 步骤定义往下看...
}

3. 中层步骤配置

每个步骤用Test标记,加Order控制执行顺序,同时开启该步骤内部用例的并行:

[Test, Order(1)]
[Parallelizable(ParallelScope.Children)] // 允许这个步骤下的测试用例并行
public void FirstStep()
{
    // 推进流程到FirstStep对应的状态
}

[Test, Order(2)]
[Parallelizable(ParallelScope.Children)]
public void SecondStep()
{
    // 推进流程到SecondStep对应的状态
}

4. 底层测试用例配置

直接用TestCase标记每个用例即可,它们会继承步骤的并行配置,自动并行执行:

[Test, Order(1)]
[Parallelizable(ParallelScope.Children)]
[TestCase("TestCaseA")]
[TestCase("TestCaseB")]
public void FirstStep(string testCaseName)
{
    // 验证当前步骤状态下的服务预期结果
}

[Test, Order(2)]
[Parallelizable(ParallelScope.Children)]
[TestCase("TestCaseA")]
[TestCase("TestCaseB")]
public void SecondStep(string testCaseName)
{
    // 验证当前步骤状态下的服务预期结果
}

配置逻辑说明

  • [assembly: Parallelizable(ParallelScope.Fixtures)]:核心是开启不同TestFixture的并行,满足顶层场景同时跑的需求
  • [assembly: NonParallelizable]:全局默认所有节点非并行,这样同一个场景内的步骤默认不会并行,保证了同场景内步骤的串行性
  • 顶层Fixture的[Parallelizable(ParallelScope.Self)]:覆盖全局默认,允许当前场景和其他场景并行
  • 步骤的[Parallelizable(ParallelScope.Children)]:仅开启该步骤下的TestCase并行,不影响步骤本身的串行性——因为全局默认非并行,同场景内的步骤还是会按Order顺序执行,而不同场景的步骤会随各自Fixture的并行而同时运行

运行效果验证

按这个配置跑,完全符合你要的示例逻辑:

  • TopLevelScenarioOne和TopLevelScenarioTwo同时启动,并行运行
  • TopLevelScenarioOne必须等FirstStep所有用例跑完,才会启动SecondStep
  • FirstStep里的TestCaseA和TestCaseB同时执行
  • TopLevelScenarioTwo的SecondStep可以和TopLevelScenarioOne的FirstStep/SecondStep同时运行

内容的提问来源于stack exchange,提问作者Balinth

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 01:20:08