如何并行运行多个NUnit测试夹具但不并行执行内部组合测试方法
NUnit 并行配置实现方案:不同夹具并行,同夹具内串行
你的需求可以通过NUnit的[Parallelizable]和[NonParallelizable]特性组合实现,核心是精准控制并行的层级范围,以下是具体配置方案:
核心需求梳理
- 不同夹具文件(如
LoginFixture和其他业务夹具)之间允许并行运行 LoginFixture的三个参数化实例(Chrome、Firefox、Edge)彼此串行,避免浏览器资源冲突- 单个夹具实例内,
Combinatorial生成的所有测试用例串行执行,防止同一浏览器内的测试互相干扰
修改后的代码示例
namespace Tests { // 为每个参数化夹具实例标记:自身串行,但允许与其他夹具并行 [TestFixture(Chrome), NonParallelizable(ParallelScope.Self)] [TestFixture(Firefox), NonParallelizable(ParallelScope.Self)] [TestFixture(Edge), NonParallelizable(ParallelScope.Self)] // 允许该夹具类与其他标记了Fixture级并行的夹具同时运行 [Parallelizable(ParallelScope.Fixtures)] public class LoginFixture: BrowserSetupBase { public LoginFixture(string browser) : base(browser: browser){} // 标记测试方法串行,确保同一夹具实例内的组合用例按顺序执行 [Test, Combinatorial, NonParallelizable] public void ShouldLoginAndLogout( [Values("SiteOne", "SiteTwo")] string website, [ValueSource(typeof(UserNamesClass), nameof(Values))] string userName ) { // Run Test } } // 其他业务夹具示例,遵循相同规则:与外部夹具并行,自身实例内串行 [Parallelizable(ParallelScope.Fixtures)] [NonParallelizable(ParallelScope.Self)] public class CheckoutFixture { [Test, NonParallelizable] public void ShouldCompleteCheckout() { // Run Test } } }
特性作用说明
[Parallelizable(ParallelScope.Fixtures)]:作用于夹具类,允许该夹具与其他开启了Fixture级并行的夹具同时执行,实现跨夹具的并行能力。[NonParallelizable(ParallelScope.Self)]:作用于每个[TestFixture]参数化实例,限制同一夹具的不同参数实例(如Chrome和Firefox)不能并行,避免浏览器资源竞争。[NonParallelizable]:作用于测试方法,确保同一夹具实例内的所有测试用例(包括Combinatorial生成的组合用例)串行执行,防止同一浏览器会话内的测试相互干扰。
全局并行配置补充
需确保NUnit全局并行开关开启,可通过nunit.runsettings文件配置:
<RunSettings> <NUnit> <Parallelize> <Workers>4</Workers> <!-- 根据本地CPU核心数设置合理的工作线程数 --> <Scope>Fixtures</Scope> <!-- 全局默认并行范围设为夹具级 --> </Parallelize> </NUnit> </RunSettings>
内容的提问来源于stack exchange,提问作者ascendantofrain
相关产品推荐
相关产品推荐

