使用cucumber-groovy并行运行Cucumber场景遇类找不到及步骤定义问题
Cucumber-Groovy项目Gradle运行报错及步骤定义找不到问题
运行命令 ./gradlew cucumber -Denv=test -Ptags=@myTest --continue --no-daemon 时出现以下错误:
Error: Could not find or load main class io.cucumber.core.cli.Main Caused by: java.lang.ClassNotFoundException: io.cucumber.core.cli.Main
本地已存在相关依赖,在IntelliJ运行配置中设置Main class:io.cucumber.core.cli.Main无报错,但运行时提示步骤定义未找到(可从特征文件跳转至步骤定义)。当前使用Gradle 5.0,build.gradle中cucumber任务配置如下:
doLast { javaexec { main = "io.cucumber.core.cli.Main" classpath = configurations.cucumberRuntime + sourceSets.main.output + sourceSets.test.output systemProperty "parallel", System.properties.getProperty("parallel", setParallel) if (setParallel == "true") cucumberArgs.addAll(cucumberThreadsOption) args = cucumberArgs jvmArgs = [ "-Denv=$env", ] } }
依赖配置:
dependencies { implementation "io.cucumber:cucumber-core:5.1.3" implementation "io.cucumber:cucumber-groovy:5.1.3" compile "org.codehaus.groovy:groovy-all:2.5.6" }
核心问题1:找不到io.cucumber.core.cli.Main
你的依赖配置和Gradle任务的classpath不匹配:
- 任务中使用了
configurations.cucumberRuntime作为classpath的一部分,但当前依赖是用implementation和compile声明的,这些依赖不会自动加入cucumberRuntime配置中。 - Gradle的
cucumberRuntime默认继承自testRuntime,所以需要把Cucumber相关依赖放到testImplementation,或者直接给cucumberRuntime配置添加依赖。
修正方案(二选一):
方案A:改用testImplementation声明依赖
dependencies { testImplementation "io.cucumber:cucumber-core:5.1.3" testImplementation "io.cucumber:cucumber-groovy:5.1.3" testImplementation "org.codehaus.groovy:groovy-all:2.5.6" }
方案B:直接给cucumberRuntime添加依赖
dependencies { cucumberRuntime "io.cucumber:cucumber-core:5.1.3" cucumberRuntime "io.cucumber:cucumber-groovy:5.1.3" cucumberRuntime "org.codehaus.groovy:groovy-all:2.5.6" }
核心问题2:步骤定义未找到
排除依赖问题后,这个问题通常由以下原因导致:
- Groovy文件未被编译:确保build.gradle开头已应用Groovy插件,否则Gradle会忽略Groovy文件,导致步骤定义无法被编译到classpath中:
apply plugin: 'groovy' apply plugin: 'java'
- 未指定步骤定义的扫描路径:Cucumber需要明确知道去哪里找步骤定义,需要在
cucumberArgs中添加--glue参数指定包路径。比如你的步骤定义在com.example.steps下,修改任务配置:
args = cucumberArgs + ['--glue', 'com.example.steps']
- classpath未正确包含步骤定义:确认
sourceSets.test.output确实包含了步骤定义的编译产物,检查test目录下的Groovy文件是否被正确编译到build/classes/groovy/test目录中。
内容的提问来源于stack exchange,提问作者Steerpike
相关产品推荐
相关产品推荐

