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

Spring Boot 3项目中如何通过Maven分别运行JUnit5单元测试与Cucumber集成测试

Spring Boot 3项目中如何通过Maven分别运行JUnit5单元测试与Cucumber集成测试

我完全懂你这种升级后测试逻辑混乱的烦躁——之前用Surefire跑单元测试、Failsafe跑Cucumber集成测试的分工明明好好的,结果升级到Cucumber 7.15.0和JUnit 5之后,mvn test和mvn verify居然都一股脑跑所有测试,完全打乱了原来的节奏。别担心,咱们一步步把这个问题解决掉。

问题根源分析

核心问题出在cucumber-junit-platform-engine这个依赖上:它会优先识别cucumber.features属性,直接覆盖JUnit Platform的其他发现选择器,导致Surefire(单元测试插件)运行时也会触发Cucumber的测试扫描,把集成测试也跑了一遍。

解决方案步骤

1. 调整Surefire插件配置(仅跑单元测试)

让Surefire只扫描src/test/java下的单元测试,同时禁用Cucumber引擎的触发逻辑,避免它干扰单元测试执行:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-surefire-plugin</artifactId>
    <version>${maven-surefire-plugin.version}</version>
    <configuration>
        <skipTests>${unit-tests.skip}</skipTests>
        <!-- 只包含src/test下的单元测试类(按你的命名习惯调整) -->
        <includes>
            <include>**/*Test.java</include>
        </includes>
        <!-- 排除所有Cucumber相关的测试类 -->
        <excludes>
            <exclude>**/*IT.java</exclude>
            <exclude>**/Cucumber*.java</exclude>
        </excludes>
        <!-- 关键:禁用Cucumber引擎,避免它启动扫描 -->
        <properties>
            <configurationParameters>
                cucumber.enabled=false
            </configurationParameters>
        </properties>
    </configuration>
</plugin>

2. 优化Failsafe插件配置(仅跑集成测试)

让Failsafe专注于src/integration-test下的Cucumber测试,明确指定Cucumber的特性文件位置和引擎配置:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-failsafe-plugin</artifactId>
    <version>${maven-failsafe-plugin.version}</version>
    <dependencies>
        <!-- 仅让Failsafe加载Cucumber引擎 -->
        <dependency>
            <groupId>io.cucumber</groupId>
            <artifactId>cucumber-junit-platform-engine</artifactId>
            <version>${cucumber.version}</version>
        </dependency>
    </dependencies>
    <configuration>
        <skipTests>${integration-tests.skip}</skipTests>
        <runOrder>alphabetical</runOrder>
        <parallel>none</parallel>
        <!-- 只包含集成测试目录下的Cucumber测试类 -->
        <includes>
            <include>**/*IT.java</include>
            <include>**/Cucumber*.java</include>
        </includes>
        <properties>
            <configurationParameters>
                cucumber.junit-platform.naming-strategy=long
                cucumber.enabled=true
                <!-- 明确指定Cucumber特性文件位置,避免扫描混乱 -->
                cucumber.features=src/integration-test/resources/**/*.feature
            </configurationParameters>
        </properties>
    </configuration>
    <executions>
        <execution>
            <id>integration-tests</id>
            <goals>
                <goal>integration-test</goal>
                <goal>verify</goal>
            </goals>
        </execution>
    </executions>
</plugin>

3. 调整依赖范围(可选但推荐)

把cucumber-junit-platform-engine的依赖范围改为provided,这样只有Failsafe插件会加载它,从根源上避免Surefire触发Cucumber引擎:

<dependency>
    <groupId>io.cucumber</groupId>
    <artifactId>cucumber-junit-platform-engine</artifactId>
    <version>${cucumber.version}</version>
    <scope>provided</scope>
</dependency>

4. 优化Cucumber测试类的注解配置

确保你的CucumberIT.java类的@Suite注解配置更精确,避免不必要的扫描:

import org.junit.platform.suite.api.ConfigurationParameter;
import org.junit.platform.suite.api.IncludeEngines;
import org.junit.platform.suite.api.SelectClasspathResource;
import org.junit.platform.suite.api.Suite;
import static io.cucumber.junit.platform.engine.Constants.GLUE_PROPERTY_NAME;

@Suite
@IncludeEngines("cucumber")
// 指定特性文件所在的资源路径
@SelectClasspathResource("com/project/package/structure")
// 指定Cucumber glue代码的包路径
@ConfigurationParameter(key = GLUE_PROPERTY_NAME, value = "com.project.package.structure.scenariosteps")
public class CucumberIT {
}

验证效果

  • 运行mvn test:只会执行src/test/java下的JUnit5单元测试,不会触发Cucumber集成测试。
  • 运行mvn verify:会先执行单元测试(未跳过的情况下),再执行src/integration-test下的Cucumber集成测试,最后完成验证步骤。

备注:内容来源于stack exchange,提问作者Thnxalot

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.20 07:09:35