Gradle运行Cucumber场景时Scenario1步骤未找到的原因排查
我来帮你分析下这个问题——JUnit Runner跑正常但Gradle任务出问题,大概率是Gradle任务里的Cucumber CLI参数配置有坑,结合你的描述,我整理了几个最可能的原因:
1. Cucumber CLI 参数顺序错误(最核心原因)
Cucumber CLI有个严格的参数规则:所有选项(--format/--glue/--tags等)必须放在feature文件/目录路径的前面。但你的Gradle任务里把src/test/resources(feature文件所在目录)放在了--glue和--tags前面,这会导致Cucumber把后面的--glue、--tags当成无效的feature路径,直接忽略这些配置!
这就解释了为什么Scenario2的步骤能被识别,而Scenario1的找不到——大概率Scenario2的步骤定义在Cucumber默认扫描的路径里(比如和JUnit Runner同包),而Scenario1的步骤专门放在了stepDefinition包下,因为--glue参数没生效,Cucumber根本没去扫描这个包。
修复方法:把src/test/resources移到所有选项的最后:
args = [ '--format', 'pretty', '--format', 'html:'+System.getProperty("port")+System.getProperty("tag"), '--format', 'json:'+System.getProperty("port")+'/cucumber.json', '--glue', 'stepDefinition', // 这里去掉多余的classpath:前缀 '--tags', System.getProperty("tag"), 'src/test/resources' // feature路径必须放在最后 ]
2. --glue 参数写法错误
你在Gradle里写的'classpath:stepDefinition'是多余的,Cucumber CLI的--glue参数只需要直接指定包名即可,不需要加classpath:前缀。这个前缀是JUnit Runner里不需要的写法,加了会导致Cucumber无法正确识别包路径,找不到对应包下的步骤定义。
3. Gradle任务的类路径与编译依赖问题
虽然JUnit跑正常,但Gradle任务可能没确保测试类先编译完成。建议把任务改成标准的JavaExec类型,并添加testClasses依赖,确保执行Cucumber任务前先编译测试代码:
task Cucumber(type: JavaExec) { dependsOn testClasses // 强制先编译测试类 println 'Running Test' main = "cucumber.api.cli.Main" classpath = configurations.cucumberRuntime + sourceSets.main.output + sourceSets.test.output // 上面修正后的args配置 }
(另外,你之前用的<<是Gradle旧版语法,建议换成type: JavaExec的写法,更稳定规范)
4. 标签参数的潜在过滤问题
如果启动Gradle任务时tag属性传的是@Scenario2,Cucumber会只执行Scenario2,但你说的是Scenario1的步骤找不到,不是没执行,所以这个可能性较低,但可以检查下启动命令,比如:
./gradlew Cucumber -Dtag=@Scenario1
确保tag参数没有错误过滤掉Scenario1。
先试试调整参数顺序和修正--glue写法,这两个是最可能解决问题的点。
内容的提问来源于stack exchange,提问作者drunkcoder

