如何基于JUnit5实现Cucumber测试场景并行执行?
解决Cucumber + JUnit5 测试场景并行执行问题
核心问题分析
你当前的配置仅启用了JUnit Jupiter层面的并行,但Cucumber JUnit Platform Engine需要单独开启自身的并行执行配置,且默认并行粒度是feature文件而非单个scenario,这导致单个feature内的场景无法并行运行。
解决方案步骤
1. 修正Cucumber并行配置(更新junit-platform.properties)
在src/test/resources/junit-platform.properties中添加Cucumber专属的并行参数,确保场景级并行:
# JUnit Jupiter 基础并行配置(保留) junit.jupiter.execution.parallel.enabled = true junit.jupiter.execution.parallel.mode.default = concurrent # Cucumber 并行核心配置 cucumber.execution.parallel.enabled=true # 设置并行粒度为单个场景(默认是feature文件) cucumber.execution.parallel.mode=scenario # 固定并行线程数 cucumber.execution.parallel.config.strategy=fixed cucumber.execution.parallel.config.fixed.parallelism=4
2. 配置Maven Surefire Plugin
确保Surefire插件正确支持并行执行,避免线程共享问题:
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <version>3.2.5</version> <configuration> <!-- 配置进程数,建议和并行线程数匹配或设为CPU核心数 --> <forkCount>4</forkCount> <!-- 禁用进程复用,防止跨测试状态污染 --> <reuseForks>false</reuseForks> <!-- 显式传递并行配置参数(可选,确保配置生效) --> <properties> <configurationParameters> cucumber.execution.parallel.enabled=true cucumber.execution.parallel.mode=scenario cucumber.execution.parallel.config.fixed.parallelism=4 </configurationParameters> </properties> </configuration> </plugin>
3. 确保Step Definitions线程安全(关键!)
由于使用Selenium,必须保证每个测试线程拥有独立的WebDriver实例,避免线程冲突。使用ThreadLocal存储WebDriver:
import org.openqa.selenium.WebDriver; import org.openqa.selenium.chrome.ChromeDriver; import io.cucumber.java.After; import io.cucumber.java.Before; public class StepDef { private static final ThreadLocal<WebDriver> driverHolder = new ThreadLocal<>(); @Before public void setup() { if (driverHolder.get() == null) { WebDriver driver = new ChromeDriver(); driverHolder.set(driver); } } @After public void teardown() { WebDriver driver = driverHolder.get(); if (driver != null) { driver.quit(); driverHolder.remove(); } } // 所有步骤方法中通过 driverHolder.get() 获取WebDriver实例 }
验证执行
运行Maven命令执行测试:
mvn clean test
此时单个feature文件内的多个场景会并行执行,多个feature文件也会同时运行。
内容的提问来源于stack exchange,提问作者Akshay Kachare
相关产品推荐
相关产品推荐

