Cucumber CLI调用Main执行测试跳过feature文件问题咨询
问题根因
你的CLI传参存在两处核心错误,是导致测试无法正常执行的直接原因:
-g/--glue参数传值错误:该参数要求传入步骤定义类所在的Java包全限定名,不支持传入文件系统路径,这是你两次运行异常的核心诱因。- 标签参数传值不规范:
-t/--tags参数匹配标签时,需要传入带@前缀的完整标签名,漏写前缀会直接导致场景匹配失败。
两次异常的对应解释
- 带标签运行返回0场景:因为glue传入的是文件路径,Cucumber无法在类路径下扫描到任何步骤定义类,同时标签值漏写
@前缀,双重问题下没有任何符合匹配规则的场景被加载,最终返回0场景0步骤的结果。 - 移除标签后提示步骤缺失、指定单个feature仍提示步骤未定义:本质还是glue参数传了文件路径,Cucumber按照包名规则去类路径下扫描时,根本找不到对应位置的步骤定义类,自然无法匹配到feature里的任何步骤,所有步骤都会被标记为undefined。
正确传参示例
假设你的步骤定义类源码放在src/test/java/com/company/project/stepdefinitions目录下,对应包名为com.company.project.stepdefinitions,正确的Runner代码如下:
import io.cucumber.core.cli.Main; public class Runner { public static void main(String[] args) { Main.main(new String[]{ "-g", "com.company.project.stepdefinitions", // 传包名,不要传文件路径 "-t", "@Regression", // 标签必须带@前缀 "src/test/resources/features" // feature文件路径支持传文件系统相对路径 }); } }
运行前校验项
- 运行前先完成项目测试代码编译,确保target/test-classes目录下存在对应步骤定义的class文件,否则Cucumber扫描类路径时无法加载到步骤定义。
- 如果用IDE运行,先把
src/test/java目录标记为Test Sources Root,保证IDE运行时会把该目录下的类加入运行时类路径。 - 如果步骤定义分在多个子包下,只需要传入最上层的公共包名即可,Cucumber会递归扫描该包下所有类中的步骤定义方法,不需要单独指定单个步骤类。
内容的提问来源于stack exchange,提问作者Abhi
相关产品推荐
相关产品推荐

