Cucumber Junit配置并行执行未生效 测试用例串行运行问题
问题根因
配置不生效由三个核心问题导致:
- maven-failsafe-plugin的
parallel=methods配置对Cucumber JUnit4 Runner完全无效。@RunWith(Cucumber.class)标记的运行器类只会提供一个测试执行入口,所有feature文件的逻辑都在这个单入口内串行执行,maven插件无法拆分单方法内的执行逻辑做并行。 - 现有failsafe配置仅包含单个
MyTestRunner.java测试类,哪怕调整并行维度为classes,也只会启动一个测试进程,没有并行调度的空间。 - 未开启Cucumber 7.x版本内置的并行执行能力。Cucumber的并行调度不依赖maven插件的并行参数,需要通过自身配置文件显式开启。
解决方案(推荐使用Cucumber内置并行,配置成本最低)
- 先修改maven-failsafe-plugin的配置,删除无效的并行维度配置,补充缺失的verify goal,修改后配置如下:
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-failsafe-plugin</artifactId> <version>3.0.0-M6</version> <executions> <execution> <goals> <goal>integration-test</goal> <goal>verify</goal> </goals> <configuration> <includes> <include>**/MyTestRunner.java</include> </includes> </configuration> </execution> </executions> </plugin>
- 在
src/test/resources路径下新建cucumber.properties配置文件,添加Cucumber并行相关配置:
# 开启Cucumber内置并行执行 cucumber.execution.parallel.enabled=true # 并行策略选fixed可固定线程数,选dynamic会根据CPU核心数动态计算线程数 cucumber.execution.parallel.config.strategy=fixed # 固定4个并行线程,和预期配置一致 cucumber.execution.parallel.config.fixed.parallelism=4 # 并行粒度默认是scenario(所有场景独立并行),如果要按feature粒度并行(同feature内场景串行)就添加下面这行 # cucumber.execution.parallel.execution.mode=feature
注意:如果选择scenario级别的并行,要保证所有测试场景完全独立,没有前后依赖,否则会出现用例互相干扰的问题。
- 改造浏览器实例管理逻辑:
不能用静态变量存储WebDriver实例,要改用ThreadLocal<WebDriver>做线程隔离,保证每个并行线程持有独立的浏览器实例,避免多线程争抢同一个浏览器导致用例失败、执行逻辑串行的问题。所有类级别的JUnit钩子(@BeforeClass/@AfterClass)要替换成Cucumber原生的@Before/@After钩子,这类钩子会在每个并行场景的执行前后触发,适配多线程环境。
不推荐的备选方案(maven层面并行)
如果坚持要通过maven插件做并行调度,就不能只用一个Runner类:
- 需要为每个feature文件单独创建对应的Cucumber Runner类,每个类的
@CucumberOptions只指定对应的单个feature文件 - 把failsafe的
<parallel>配置改成classes,再配置对应的线程数,maven会同时调度多个Runner类实现并行 - 这种方案需要维护大量Runner类,维护成本极高,没有特殊需求不建议使用。
内容的提问来源于stack exchange,提问作者Biswamber Khandei
相关产品推荐
相关产品推荐

