Maven构建结果不符合预期问题求助
Maven构建结果不符合预期问题求助
兄弟,我之前升级JUnit5 + Cucumber7做并行执行的时候,也踩过类似的坑,结合你说的场景——10个feature文件各10个用例共100个,先帮你梳理下可能的问题点和实操解决办法:
一、先把核心配置对齐
Cucumber7是完全基于JUnit5平台运行的,所以首先得把依赖和并行配置做对:
- BOM依赖要确保版本统一:pom.xml里的dependencyManagement一定要正确引入Cucumber和JUnit5的BOM,避免版本冲突:
<dependencyManagement> <dependencies> <dependency> <groupId>io.cucumber</groupId> <artifactId>cucumber-bom</artifactId> <version>7.14.0</version> <!-- 换成你实际用的版本 --> <type>pom</type> <scope>import</scope> </dependency> <dependency> <groupId>org.junit</groupId> <artifactId>junit-bom</artifactId> <version>5.10.0</version> <!-- 对应你用的JUnit5版本 --> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> - JUnit5并行配置要到位:在
src/test/resources下创建junit-platform.properties,配置并行规则:
这里要注意:Cucumber的每个feature文件在JUnit5里会被当作一个测试类,所以# 开启JUnit5并行执行 junit.jupiter.execution.parallel.enabled = true # 按feature文件(类级别)并行执行 junit.jupiter.execution.parallel.mode.default = concurrent junit.jupiter.execution.parallel.mode.classes.default = concurrent # 线程数设置为10,和你的feature文件数量匹配,避免线程浪费或竞争 junit.jupiter.execution.parallel.config.strategy = fixed junit.jupiter.execution.parallel.config.fixed.parallelism = 10classes.default设为concurrent才能让多个feature同时跑起来。
二、排查Maven Surefire插件的坑
Surefire是Maven跑测试的核心插件,配置不对直接导致并行失效:
- 必须用高版本Surefire:至少3.0.0-M5以上,旧版本对JUnit5的并行支持有bug,我之前用3.0.0-M4就踩过坑,换成3.2.2就正常了:
<build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <version>3.2.2</version> <configuration> <!-- 只扫描你的Cucumber Runner类 --> <includes> <include>**/*CucumberRunner.class</include> </includes> <!-- 重点:别开Surefire自己的并行配置!和JUnit5的并行会冲突,导致线程混乱 --> </configuration> </plugin> </plugins> </build>
三、清理旧插件,避免冲突
你之前用的cucumber-jvm-parallel-plugin在Cucumber7里已经完全不需要了——现在是靠JUnit5的平台来做并行,这个旧插件的逻辑会和JUnit5的并行机制打架,导致用例重复执行、遗漏或者报告异常,一定要把它从pom.xml里彻底删掉。
四、线程安全问题别忽略
如果你的测试用例里有共享的资源(比如全局的测试数据、复用的浏览器实例),并行执行的时候肯定会出问题,比如用例失败、结果混乱。这时候要确保每个用例的上下文是独立的:
- 用Cucumber的
@BeforeEach和@AfterEach来初始化/销毁每个用例的专属资源,别用@BeforeAll或@AfterAll(这俩是类级别,并行时会被多个线程共享); - 如果是和Spring集成的测试,要把测试类的scope设为
prototype,避免单例冲突。
最后给你个小建议:先别直接跑100个用例,先挑2个feature跑,确认并行正常了再逐步扩容到10个,这样更容易定位问题。
备注:内容来源于stack exchange,提问作者Azarudeen Asraff
相关产品推荐
相关产品推荐

