maven-failsafe-plugin配置后无法并行执行测试仅单线程运行
问题根因
- 第一,依赖和执行逻辑错配:你引入的是
cucumber-junit,这是适配JUnit 4的Runner组件;同时你在Failsafe配置里只指定了单个入口类MyTestRunner.java。Failsafe的parallel、threadCount配置只会对扫描到的测试类、测试方法做并行调度,但你的入口类本身没有可执行的测试方法,只是挂载了Cucumber的执行入口,Failsafe只会把这一个类当成单个任务提交,自然只会用单线程运行。 - 第二,并行配置对象错误:Cucumber的场景执行调度权在Cucumber引擎自身,不在Maven Failsafe插件上,你把并行参数配在Failsafe层面,对Cucumber内部的场景调度完全不生效。
- 第三,版本存在兼容缺陷:你用的
maven-failsafe-plugin 3.0.0-M3是早期里程碑版本,本身存在多个并行执行相关的已知bug,稳定性不足。
修复配置步骤
1. 替换Cucumber JUnit适配依赖
删除原有cucumber-junit依赖,替换为适配JUnit 5(Jupiter)的Cucumber引擎,和你已引入的JUnit Jupiter版本对齐:
<dependency> <groupId>io.cucumber</groupId> <artifactId>cucumber-junit-platform-engine</artifactId> <version>${cucumber.version}</version> <scope>test</scope> </dependency> <dependency> <groupId>org.junit.platform</groupId> <artifactId>junit-platform-suite-api</artifactId> <version>1.8.2</version> <scope>test</scope> </dependency>
2. 升级插件版本,修正Failsafe配置
把Surefire、Failsafe插件升级到稳定正式版,不要使用M3这类里程碑版本,在properties里修改版本号:
<maven.surefire.version>3.2.5</maven.surefire.version> <maven.failsafe.plugin>3.2.5</maven.failsafe.plugin>
调整Failsafe插件配置,移除原来无效的并行参数,改为通过JUnit Platform传参控制Cucumber并行:
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-failsafe-plugin</artifactId> <version>${maven.failsafe.plugin}</version> <executions> <execution> <goals> <goal>integration-test</goal> <goal>verify</goal> </goals> <configuration> <includes> <include>**/MyTestRunner.java</include> </includes> <configurationParameters> <!-- 开启Cucumber并行执行开关 --> cucumber.execution.parallel.enabled=true <!-- 固定并行线程数为4 --> cucumber.execution.parallel.config.strategy=fixed cucumber.execution.parallel.config.fixed.parallelism=4 <!-- 并行粒度为场景级别,也可改为feature按特性文件并行 --> cucumber.execution.parallel.config.fixed.max-pool-size=4 </configurationParameters> </configuration> </execution> </executions> </plugin>
3. 修改测试入口Runner类
把原来基于JUnit 4的Cucumber Runner注解,替换为JUnit 5 Suite注解,示例:
import org.junit.platform.suite.api.ConfigurationParameter; import org.junit.platform.suite.api.IncludeEngines; import org.junit.platform.suite.api.SelectClasspathResource; import org.junit.platform.suite.api.Suite; import static io.cucumber.junit.platform.engine.Constants.GLUE_PROPERTY_NAME; @Suite @IncludeEngines("cucumber") // 替换为你自己的feature文件存放路径 @SelectClasspathResource("features") // 替换为你自己的步骤定义、钩子函数的包路径 @ConfigurationParameter(key = GLUE_PROPERTY_NAME, value = "com.test.steps") public class MyTestRunner { }
注意事项
- 如果是Selenium UI自动化并行,必须保证每个线程持有独立的WebDriver实例,不要用静态全局单例的WebDriver对象,否则会出现多线程抢占同一个浏览器实例的问题。
- 你当前引入的
extentreports-cucumber7-adapter如果是低版本,可能存在并行写报告文件冲突的问题,如果出现报告内容缺失、乱码,需要升级适配器版本或者调整报告生成逻辑到所有测试执行完成后统一处理。 - 如果不想修改现有Runner结构,也可以把feature文件拆分对应多个独立的Runner类,把Failsafe的并行配置改为
<parallel>classes</parallel>,这种方式不需要替换Cucumber依赖,但维护多个Runner的成本更高。
验证方式:执行
mvn verify时观察控制台输出,会打印Cucumber并行执行的配置参数,同时能看到多个浏览器实例同时启动,即代表并行配置生效。
内容的提问来源于stack exchange,提问作者Ludo
相关产品推荐
相关产品推荐

