不使用Maven如何通过CLI运行Cucumber Test runner
报错原因
java.lang.NoClassDefFoundError: io/cucumber/core/cli/Main是运行时classpath没包含cucumber-core依赖包导致的,和代码逻辑无关。无Maven环境下跑Cucumber的核心是手动把所有依赖、编译产物加入classpath,具体操作步骤如下:
前置准备
在项目根目录新建lib文件夹,把项目用到的所有依赖jar全部放进去,包括但不限于:
- cucumber-core、cucumber-java、cucumber-junit等Cucumber核心包
- extentreports相关的Cucumber适配器包
- JUnit包
- 项目引用的其他第三方工具包
必须确认lib目录下存在cucumber-core的jar,之前报错缺失的io.cucumber.core.cli.Main类就在这个包内
第一步:编译源码
先执行编译命令,把所有Java源码编译到class输出目录:
# 创建输出目录 mkdir -p target/classes target/test-classes # 编译步骤定义、Runner类等测试代码,有其他源码路径直接追加在命令末尾即可 javac -cp "lib/*" -d target/test-classes src/test/java/stepdefinitions/*.java src/test/java/CucumberRunner.java
Linux/macOS环境classpath用冒号分隔路径,Windows环境换成分号即可。
第二步:执行测试
两种运行方式选其一即可,不需要额外给Runner类加main方法。
方式1:直接调用Cucumber CLI运行(灵活支持命令行传参指定标签)
运行命令如下,所有配置可以直接在命令行传参,不需要改注解配置:
java -cp "lib/*:target/classes:target/test-classes" io.cucumber.core.cli.Main \ -g stepdefinitions \ src/test/resources/features \ --tags @Regression \ --plugin pretty \ --plugin com.aventstack.extentreports.cucumber.adapter.ExtentCucumberAdapter: \ --plugin timeline:test-output-thread/ \ --plugin json:target/cucumber-reports/jsonReports/Cucumber.json \ --plugin html:target/cucumber-reports/Cucumber.html
参数说明:
-g后面跟步骤定义类的包名,不是源码目录路径,比如步骤定义类顶部声明package stepdefinitions;,这里就填stepdefinitions,不要填src/test/java/stepdefinitions,否则会找不到步骤绑定--tags后面跟要运行的标签表达式,支持标准Cucumber标签语法:比如跑@Regression且不是@Ignore的用例就写"@Regression and not @Ignore",跑@Smoke或者@Regression的用例就写"@Smoke or @Regression",临时切换运行标签直接改这个参数即可,不需要改代码- 后面的--plugin参数和你之前在@CucumberOptions里配置的插件一一对应,保持一致即可
方式2:基于原有Runner类的注解配置运行
你最开始写的带@CucumberOptions注解的CucumberRunner类不需要修改,也不需要加main方法,直接通过JUnit入口运行即可,会自动读取注解里的features路径、标签、插件配置:
java -cp "lib/*:target/classes:target/test-classes" org.junit.runner.JUnitCore CucumberRunner
如果要临时覆盖标签配置,不需要改代码,换成方式1的命令传--tags参数即可。
注意事项
- 所有编译、运行命令的classpath必须把lib下所有jar、编译后的target/classes、target/test-classes目录全部包含,缺任意一项都可能报类找不到的错误
- 你之前写的main方法调用逻辑本身没有问题,只要运行时把cucumber-core的jar加入classpath就能正常跑,但没必要额外封装main方法,直接用官方提供的CLI入口更稳定,也不需要改原有代码。
内容的提问来源于stack exchange,提问作者Abhi
相关产品推荐
相关产品推荐

