You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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插件被触发了两次测试执行:

  1. 带@Suite注解的RunnerTest类会被JUnit 5平台识别,自动启动一次Cucumber测试
  2. 命令行里指定了-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,提问作者Денис Кондратов

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 16:26:05