NUnit三层并行-串行-并行测试结构实现技术问询
NUnit 实现三层并行+串行混合测试结构的配置方案
先明确需求
咱们要的是这种三层测试结构:
- 顶层(场景):多个场景并行运行,相互完全隔离(每个场景独立创建重型对象)
- 中层(步骤):同一个场景内的步骤必须按顺序串行执行,但不同场景的步骤可以和其他场景的任意步骤并发
- 底层(测试用例):同一个步骤里的用例可以并行,不同步骤、不同场景的用例也都能并行
之前的配置问题分析
你试的几种配置没达到预期,问题出在这:
- 只给顶层Fixture加
[ParallelScope.Self],但NUnit默认不开启Fixture级并行,所以顶层还是串行 - 加
[assembly: ParallelScope.Children]会让所有层级的子节点都并行,导致同场景内的步骤也乱序并行,破坏了步骤的串行要求 - 步骤加
[ParallelScope.Children | ParallelScope.None]是把当前步骤标记为非并行,而且全局生效,导致所有场景的步骤都串行,浪费了跨场景并发的能力 [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所有用例跑完,才会启动SecondStepFirstStep里的TestCaseA和TestCaseB同时执行TopLevelScenarioTwo的SecondStep可以和TopLevelScenarioOne的FirstStep/SecondStep同时运行
内容的提问来源于stack exchange,提问作者Balinth
相关产品推荐
相关产品推荐

