求助:Karate中Feature文件无法生成预期Cucumber报告
搞定Karate无法生成预期Cucumber报告的问题
先帮你把代码里截断的部分补全,然后一步步排查问题:
先修复你代码里的截断部分
你的generateReport方法里代码没写完,补全后应该是这样:
private static void generateReport(String karateOutputPath) { Collection<File> jsonFiles = FileUtils.listFiles(new File(karateOutputPath), new String[] {"json"}, true); List<String> jsonPaths = new ArrayList<String>(jsonFiles.size()); jsonFiles.forEach(file -> jsonPaths.add(file.getAbsolutePath())); // 配置报告生成路径和项目名称 Configuration config = new Configuration(new File("target/cucumber-reports"), "你的Karate测试项目"); ReportBuilder reportBuilder = new ReportBuilder(jsonPaths, config); reportBuilder.generateReports(); }
接下来排查几个常见的坑
1. 你的CucumberOptions配置缺了关键项
你现在只加了tags = "~@ignore",但没指定Feature文件的位置,Karate根本找不到要执行的用例,自然不会生成报告。得加上features路径,还得指定生成json格式的报告(这是生成Cucumber报告的基础):
@CucumberOptions( features = "classpath:Mav_demo/RunnerFunction", // 指向Feature文件所在的包(classpath下的路径,不用加src/test/java) tags = "~@ignore", plugin = {"pretty", "json:target/surefire-reports/cucumber.json"} // 强制生成json报告文件 )
2. 检查pom依赖是否匹配
Karate和cucumber-reporting的版本得兼容,给你一份靠谱的依赖配置:
<dependencies> <!-- Karate核心依赖,用最新稳定版 --> <dependency> <groupId>com.intuit.karate</groupId> <artifactId>karate-junit4</artifactId> <version>1.4.1</version> <scope>test</scope> </dependency> <!-- Cucumber报告生成工具 --> <dependency> <groupId>net.masterthought</groupId> <artifactId>cucumber-reporting</artifactId> <version>5.7.0</version> <scope>test</scope> </dependency> <!-- 文件操作需要的commons-io --> <dependency> <groupId>commons-io</groupId> <artifactId>commons-io</artifactId> <version>2.11.0</version> <scope>test</scope> </dependency> </dependencies>
3. Feature文件的位置要对
你的测试类在Mav_demo.RunnerFunction包下,Feature文件最好放在src/test/resources/Mav_demo/RunnerFunction目录下(maven会把resources下的内容放到classpath里),或者如果放在src/test/java的对应包下,也要确保maven能识别为资源文件。
4. 确认测试真的跑起来了
如果测试没执行,肯定没报告。运行testParallel方法后,看看控制台输出,有没有显示Feature文件里的场景被执行。要是没执行,检查:
- Feature文件是不是以
.feature结尾 - Feature里的标签是不是和你
@CucumberOptions里的tags匹配(比如你排除了@ignore,那没被标记的场景应该被执行)
给你一份完整的Runner类参考
package Mav_demo.RunnerFunction; import com.intuit.karate.cucumber.CucumberRunner; import com.intuit.karate.cucumber.KarateStats; import net.masterthought.cucumber.Configuration; import net.masterthought.cucumber.ReportBuilder; import org.apache.commons.io.FileUtils; import org.junit.Test; import static org.junit.Assert.assertTrue; import java.io.File; import java.util.ArrayList; import java.util.Collection; import java.util.List; import cucumber.api.CucumberOptions; @CucumberOptions( features = "classpath:Mav_demo/RunnerFunction", tags = "~@ignore", plugin = {"json:target/surefire-reports/cucumber.json"} ) public class Looping { @Test public void testParallel() { String karateOutputPath = "target/surefire-reports"; KarateStats stats = CucumberRunner.parallel(getClass(), 5, karateOutputPath); generateReport(karateOutputPath); assertTrue("有测试场景失败", stats.getFailCount() == 0); } private static void generateReport(String karateOutputPath) { Collection<File> jsonFiles = FileUtils.listFiles(new File(karateOutputPath), new String[] {"json"}, true); List<String> jsonPaths = new ArrayList<>(jsonFiles.size()); jsonFiles.forEach(file -> jsonPaths.add(file.getAbsolutePath())); // 配置报告的输出目录和项目名称,还可以加一些自定义分类 Configuration config = new Configuration(new File("target/cucumber-reports"), "我的Karate API测试"); config.addClassifications("环境", "QA"); config.addClassifications("类型", "接口测试"); ReportBuilder reportBuilder = new ReportBuilder(jsonPaths, config); reportBuilder.generateReports(); } }
最后看报告的方法
运行测试后,打开target/cucumber-reports/index.html就能看到完整的Cucumber报告了,里面会有Feature文件的执行详情、步骤结果、失败原因这些内容。
内容的提问来源于stack exchange,提问作者Preethi Ravi
相关产品推荐
相关产品推荐

