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
相关产品推荐
相关产品推荐

