Jenkins中Cucumber测试重复执行两次的问题解决求助
Cucumber7 + JUnit5 测试执行两次的解决办法
项目环境
- Java 17
- JUnit 5
- Cucumber 7
- Maven 3.3.9
- Spring
现有配置
Runner类代码
(注:原代码中@Suit是笔误,需修正为@Suite才能正常生效)
@Suite @IncludeEngines("cucumber") @SelectClasspathResource("project/uss/as/play/test/features/smoke/smoke_test.feature") @ConfigurationParameter(key = GLUE_PROPERTY_NAME, value = "project.uss.as.play.test") public class RunnerTest { }
junit-platform.properties 配置文件
cucumber.execution.parallel.enabled=false cucumber.execution.parallel.config.strategy=fixed cucumber.execution.parallel.config.fixed.parallelism=1 cucumber.execution.exclusive-resources.isolated.read-write=org.junit.platform.engine.support.hierarchical.ExclusiveResource.GLOBAL_KEY cucumber.plugin=pretty, html:target/cucumber.html, json:target/cucumber.json, io.qameta.allure.cucumber7jvm.AllureCucumber7Jvm cucumber.publish.quiet=true
Jenkins执行命令
mvn -s /u01/jenkins_slave/workspace/MyTest/.m2/settings.xml clean test -Dmaven.test.failure.ignore=true -Dcucumber.features=classpath:project/uss/as/play/test/features/smoke/smoke_test.feature -Dcucumber.filter.tags="not @skip"
问题现象与已尝试操作
- 现象:日志里出现两次独立的测试运行流程,不是单条用例重复跑,怀疑是JUnit和Cucumber各启动了一次测试
- 已尝试:
- 命令行加
-Dsurefire.includeJUnit5Engines=cucumber - 指定标签
-Dcucumber.filter.tags=@1
以上操作都没解决问题
- 命令行加
问题原因
核心问题是Maven Surefire插件被触发了两次测试执行:
- 带
@Suite注解的RunnerTest类会被JUnit 5平台识别,自动启动一次Cucumber测试 - 命令行里指定了
-Dcucumber.features参数,Cucumber会直接基于这个参数再启动一次测试
两者叠加就导致了两次独立的测试运行。
解决方案
方案1:移除命令行中的-Dcucumber.features参数
保留Runner类的配置,修改Jenkins命令:
mvn -s /u01/jenkins_slave/workspace/MyTest/.m2/settings.xml clean test -Dmaven.test.failure.ignore=true -Dcucumber.filter.tags="not @skip"
这样测试只会通过Runner类触发一次,标签过滤的参数依然能正常生效。
方案2:删除Runner类,完全用命令行控制
如果不需要通过代码维护测试配置,可以直接删掉RunnerTest类,仅用命令行参数执行测试,junit-platform.properties里的配置会正常生效。
方案3:配置Surefire插件,仅执行Runner类
在pom.xml里配置Surefire插件,指定只运行RunnerTest类,避免命令行参数触发额外执行:
<build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <version>3.0.0-M7</version> <!-- 用适配JUnit5的版本,建议3.0.0及以上 --> <configuration> <includes> <include>**/RunnerTest.java</include> </includes> </configuration> </plugin> </plugins> </build>
这种方式既能保留Runner类的配置,也能防止命令行参数导致的重复执行。
额外提醒
- 先把Runner类里的
@Suit改成@Suite,不然Runner类根本起不了作用 - 确保Surefire插件版本和JUnit5、Cucumber7兼容,尽量用新一点的版本
内容的提问来源于stack exchange,提问作者Денис Кондратов
相关产品推荐
相关产品推荐

