Karate JUnit5测试IDEA运行正常但Maven命令行无测试执行
问题根因
- 测试执行引擎冲突:pom中同时引入JUnit 5(karate-junit5传递依赖)和TestNG 7.4.0,maven-surefire-plugin 2.22.2检测到TestNG存在时会默认使用TestNG执行器,完全不识别JUnit 5的
@Test注解。IDEA会自动根据类上的注解匹配执行器,所以IDE内运行正常,命令行执行时引擎选错,自然扫不到用例。另外TestNG默认只识别public修饰的测试类和方法,你的ExamplesTest是包访问权限,就算类里写了TestNG注解也扫不到。 - Karate依赖版本混乱:
karate-junit5用1.0.1版本,karate-apache却用0.9.6跨大版本旧包,还错误声明了<type>pom</type>,会导致核心类加载冲突、特征文件路径扫描逻辑异常。 - 扫描规则错位:执行日志显示运行的是
automation.tests.uiTests.UsersRunner而非你指定的ExamplesTest,就是因为TestNG执行器扫到了名字带Runner的类,但类里没有可识别的测试方法,直接返回0用例结果。 - pom存在无效占位符:artifactId标签里的
<ProjectName>未替换为实际值,可能导致maven构建时资源解析异常。
修复方案
按以下顺序修改配置:
- 移除TestNG依赖
如果没有同时使用TestNG写用例的需求,直接删除pom中testng的依赖块:
<dependency> <groupId>org.testng</groupId> <artifactId>testng</artifactId> <version>7.4.0</version> <scope>test</scope> </dependency>
如果必须保留TestNG,需要在surefire插件中显式配置同时支持两种引擎,无特殊需求直接删除是最稳妥的方案。
2. 统一Karate依赖版本
将karate-apache版本和karate-junit5对齐,删除错误的pom类型声明:
<dependency> <groupId>com.intuit.karate</groupId> <artifactId>karate-apache</artifactId> <version>${karate.version}</version> </dependency>
- 修正maven-surefire-plugin配置
显式指定JUnit5为执行引擎,补全测试类扫描规则,避免自动识别出错:
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <version>${maven.surefire.version}</version> <dependencies> <dependency> <groupId>org.junit.platform</groupId> <artifactId>junit-platform-surefire-provider</artifactId> <version>1.8.2</version> </dependency> </dependencies> <configuration> <argLine>-Dfile.encoding=UTF-8</argLine> <includes> <include>**/*Test.java</include> </includes> </configuration> </plugin>
- 修正pom基础配置
将artifactId标签里的<ProjectName>占位符替换为实际项目名称,比如<artifactId>karate-automation</artifactId>。 - 清缓存重跑
执行命令前先清理旧构建产物,先不要加-DfailIfNoTests=false参数,这个参数会掩盖测试扫描失败的真实错误,直接执行:
mvn clean test -Dtest=ExamplesTest
验证结果
命令执行后控制台会正常输出Karate的特征文件加载日志,显示扫描到的.feature文件数量、并行执行线程数,最终统计的测试用例数和你写的特征文件场景数一致,不会再出现Tests run: 0的结果。
内容的提问来源于stack exchange,提问作者Itumeleng
相关产品推荐
相关产品推荐

