SpringBoot+Cucumber测试运行器不执行用例无报错问题咨询
SpringBoot+Cucumber测试运行器无执行无报错问题排查方案
核心问题点
当前问题由多个配置错误共同导致,按影响优先级排序:
- 测试代码、特征文件存放路径不符合Maven标准目录规范,构建阶段根本不会被扫描执行
- SpringBoot 2.5.6默认集成JUnit 5,当前使用的
cucumber-junit是JUnit4体系的运行器,缺少兼容依赖导致运行器静默失效 - POM缺少Maven测试插件配置,未指定Cucumber运行器的扫描规则
- (次要)部分依赖版本存在兼容风险,运行器glue路径配置不完整
分步修复方案
1. 调整项目目录结构(必改)
Maven构建时默认仅扫描src/test目录下的测试代码与测试资源,你当前把stepdefs、runner、feature全放在src/main下,测试阶段不会加载这部分内容。调整后的标准结构如下:
src ├── main │ ├── java/com/xx/xx/automation # 仅存放业务代码、页面对象、工具类、Spring配置类 │ └── resources # 存放业务配置,如application.yml、静态资源 └── test ├── java │ └── com/xx/xx/automation │ ├── runners # 所有Cucumber测试运行器移到此处 │ └── stepdefs # 步骤定义、Hooks钩子类移到此处 └── resources └── features # 所有.feature特征文件移到此处
调整后在IDE中重新标记目录属性:将src/test/java标记为Test Sources Root,src/test/resources标记为Test Resources Root,避免IDE识别失败。
2. 修正pom.xml配置
2.1 补全JUnit4兼容依赖
SpringBoot 2.5.6的spring-boot-starter-test默认仅引入JUnit 5(Jupiter)依赖,缺少JUnit4的兼容引擎,Cucumber JUnit4运行器无法被识别加载,在dependencies节点中添加:
<!-- JUnit4兼容引擎,支撑cucumber-junit运行器 --> <dependency> <groupId>org.junit.vintage</groupId> <artifactId>junit-vintage-engine</artifactId> <scope>test</scope> </dependency>
2.2 升级存在兼容风险的依赖版本
你当前使用的lombok 1.18.2版本过旧,对JDK8、SpringBoot 2.5.x的兼容存在已知问题,将properties节点中的lombok版本修改为:
<lombok.version>1.18.22</lombok.version>
2.3 补全Maven测试插件配置
你当前仅配置了SpringBoot打包插件,缺少测试执行插件的扫描规则,在build->plugins节点下添加maven-surefire-plugin配置:
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <version>2.22.2</version> <configuration> <includes> <!-- 指定扫描所有以Runner结尾的测试运行器 --> <include>**/runners/*Runner.java</include> </includes> </configuration> </plugin>
3. 修正测试运行器配置
- 确认glue配置的包路径和你实际的stepdefs包路径完全匹配,注意包名层级不要多写/少写(你当前写的路径有3层xx,需和实际包名对齐)
- 如果使用cucumber-spring做依赖注入,需要把Spring配置类所在的包也加入glue扫描路径
- Cucumber 4.7.0中
strict=true为默认配置,无需显式声明避免版本兼容问题
修正后的运行器示例代码:
import org.junit.runner.RunWith; import io.cucumber.junit.Cucumber; import io.cucumber.junit.CucumberOptions; @RunWith(Cucumber.class) @CucumberOptions( features = "classpath:features", // 第二个路径替换为你自己的Spring Config配置类所在包 glue = {"com.xx.xx.automation.stepdefs", "com.xx.xx.automation.config"}, tags = "@SanityTest", plugin = {"pretty","html:target/cucumber.html","junit:target/cucumber.xml"}, monochrome = true, dryRun = false ) public class Srt3AppRunner { }
验证方法
- 先执行
mvn clean compile test-compile确认代码无编译错误 - 执行
mvn test看控制台是否输出Cucumber特征文件扫描、步骤匹配的日志 - 如果直接在IDE中运行运行器类,确认运行的是
src/test/java下的新类,不要运行之前main目录下的旧类 - 若仍提示步骤未定义,开启
dryRun = true运行一次,控制台会输出所有未匹配的步骤信息
内容的提问来源于stack exchange,提问作者Rudra
相关产品推荐
相关产品推荐

