Cucumber Feature文件并行执行失效,求排查方案(附POM配置)
Cucumber串行执行正常,但并行执行无法生效
问题描述
执行Cucumber Feature文件时,串行执行正常,但配置并行后完全不生效。已尝试更换不同依赖版本,问题仍存在。当前pom.xml配置如下:
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>org.example</groupId> <artifactId>Aurena_Auto1</artifactId> <version>1.0-SNAPSHOT</version> <properties> <maven.compiler.source>21</maven.compiler.source> <maven.compiler.target>21</maven.compiler.target> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <allure.version>2.24.0</allure.version> <aspectj.version>1.9.20.1</aspectj.version> </properties> <dependencyManagement> <dependencies> <dependency> <groupId>io.qameta.allure</groupId> <artifactId>allure-bom</artifactId> <version>${allure.version}</version> <type>pom</type> <scope>import</scope> </dependency> <dependency> <groupId>org.junit</groupId> <artifactId>junit-bom</artifactId> <version>5.10.1</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <dependencies> <dependency> <groupId>io.cucumber</groupId> <artifactId>cucumber-java</artifactId> <version>6.11.0</version> </dependency> <dependency> <groupId>io.cucumber</groupId> <artifactId>cucumber-core</artifactId> <version>6.11.0</version> </dependency> <dependency> <groupId>io.cucumber</groupId> <artifactId>cucumber-junit</artifactId> <version>6.11.0</version> <scope>test</scope> </dependency> <dependency> <groupId>javax.json</groupId> <artifactId>javax.json-api</artifactId> <version>1.1.4</version> </dependency> <dependency> <groupId>org.seleniumhq.selenium</groupId> <artifactId>selenium-java</artifactId> <version>4.17.0</version> </dependency> <dependency> <groupId>io.github.bonigarcia</groupId> <artifactId>webdrivermanager</artifactId> <version>5.8.0</version> <scope>test</scope> </dependency> <dependency> <groupId>io.qameta.allure</groupId> <artifactId>allure-junit4</artifactId> <version>2.24.0</version> <scope>test</scope> </dependency> <dependency> <groupId>io.qameta.allure</groupId> <artifactId>allure-cucumber6-jvm</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>io.rest-assured</groupId> <artifactId>rest-assured</artifactId> <version>5.4.0</version> </dependency> <dependency> <groupId>org.junit.jupiter</groupId> <artifactId>junit-jupiter-api</artifactId> <version>5.8.2</version> <scope>test</scope> </dependency> <dependency> <groupId>org.junit.jupiter</groupId> <artifactId>junit-jupiter-engine</artifactId> <version>5.8.2</version> <scope>test</scope> </dependency> <dependency> <groupId>org.junit.jupiter</groupId> <artifactId>junit-jupiter-params</artifactId> <version>5.8.2</version> <scope>test</scope> </dependency> <dependency> <groupId>org.json</groupId> <artifactId>json</artifactId> <version>20231013</version> </dependency> </dependencies> <build> <pluginManagement> <plugins> <!-- AspectJ plugin for aspect weaving --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <version>3.1.2</version> <configuration> <argLine> -javaagent:"${settings.localRepository}/org/aspectj/aspectjweaver/${aspectj.version}/aspectjweaver-${aspectj.version}.jar" </argLine> </configuration> <dependencies> <dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjweaver</artifactId> <version>${aspectj.version}</version> </dependency> </dependencies> </plugin> <!-- Maven Surefire plugin for parallel test execution --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <version>3.1.2</version> <configuration> <parallel>methods</parallel> <useUnlimitedThreads>true</useUnlimitedThreads> </configuration> </plugin> </plugins> </pluginManagement> </build> </project>
可提供Runner类及其他相关文件。
问题分析与解决方案
1. 合并重复的Surefire插件配置
你的pluginManagement中定义了两个完全相同的maven-surefire-plugin,后一个会覆盖前一个的配置,导致AspectJ的javaagent参数丢失,同时并行配置也会因为冲突失效。
修复方式:将两个插件的配置合并为一个:
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <version>3.1.2</version> <configuration> <argLine> -javaagent:"${settings.localRepository}/org/aspectj/aspectjweaver/${aspectj.version}/aspectjweaver-${aspectj.version}.jar" </argLine> <parallel>methods</parallel> <!-- 建议指定固定线程数,替代无限制线程 --> <threadCount>4</threadCount> <!-- <useUnlimitedThreads>true</useUnlimitedThreads> --> </configuration> <dependencies> <dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjweaver</artifactId> <version>${aspectj.version}</version> </dependency> </dependencies> </plugin>
2. 添加Cucumber并行执行核心配置
仅通过Surefire配置并行还不够,Cucumber 6.x需要额外配置并行策略。在src/test/resources/cucumber.properties中添加:
cucumber.execution.parallel.enabled=true cucumber.execution.parallel.config.strategy=fixed cucumber.execution.parallel.config.fixed.parallelism=4
如果使用Runner类,确保注解配置正确:
import io.cucumber.junit.Cucumber; import io.cucumber.junit.CucumberOptions; import org.junit.runner.RunWith; @RunWith(Cucumber.class) @CucumberOptions( features = "src/test/resources/features", glue = "stepdefinitions", plugin = {"pretty", "io.qameta.allure.cucumber6jvm.AllureCucumber6Jvm"} ) public class TestRunner { }
3. 解决JUnit版本冲突
你的依赖中同时引入了JUnit 4(cucumber-junit、allure-junit4)和JUnit 5(junit-jupiter-api等),会导致执行引擎冲突,影响并行执行。
修复方式:统一使用JUnit 5的Cucumber依赖:
- 替换
cucumber-junit为cucumber-junit-platform-engine:
<dependency> <groupId>io.cucumber</groupId> <artifactId>cucumber-junit-platform-engine</artifactId> <version>6.11.0</version> <scope>test</scope> </dependency>
- 移除
allure-junit4,添加JUnit 5兼容的Allure依赖:
<dependency> <groupId>io.qameta.allure</groupId> <artifactId>allure-junit-platform</artifactId> <scope>test</scope> </dependency>
4. 验证并行执行效果
执行测试时添加日志参数,查看是否有多线程启动:
mvn test -Dsurefire.debug=true
观察控制台输出是否有类似Running in parallel with [4] threads的日志,或者查看是否有多个浏览器实例同时启动(UI自动化场景)。
内容的提问来源于stack exchange,提问作者Amalmal
相关产品推荐
相关产品推荐

