如何用Karate、Cucumber和Java生成多份测试报告?修复单报告问题
如何用Karate、Cucumber和Java生成多份测试报告?
当前我写的代码只生成了第二次test2运行的测试报告,正确的实现方法是什么?
原代码
class ApiMockRunner { private static List<String> jsonPaths = new ArrayList<>(); @Test public void testSample() { Results test1Results = Runner.path("classpath:Karate/test1.feature") .outputCucumberJson(true) .karateEnv(System.getProperty("karate.env")) .parallel(5); addJsonFiles(test1Results.getReportDir()); Results test2results = Runner.path("classpath:Karate/test2results.feature") .outputCucumberJson(true) .karateEnv(System.getProperty("karate.env")) .parallel(5); addJsonFiles(test2results.getReportDir()); } public void addJsonFiles(String karateOutputPath) { Collection<File> jsonFiles = FileUtils.listFiles(new File(karateOutputPath), new String[] {"json"}, true); for (File jsonFileItem : jsonFiles) { jsonPaths.add(jsonFileItem.getAbsolutePath()); } } @AfterAll public static void createConfig() { String testProjectName = "finalData"; Configuration config = new Configuration(new File("target/"+testProjectName), testProjectName); ReportBuilder reportBuilder = new ReportBuilder(jsonPaths, config); reportBuilder.generateReports(); } }
问题原因
两次Runner调用默认使用同一个输出目录(target/surefire-reports),第二次运行时会覆盖或清空第一次生成的Cucumber JSON文件,导致最终收集到的只有第二次测试的结果。
正确实现方法
方法一:为每个测试任务指定独立输出目录
给每个Runner实例通过reportDir()指定专属输出目录,避免文件覆盖:
class ApiMockRunner { private static List<String> jsonPaths = new ArrayList<>(); @Test public void testSample() { // 为test1指定独立报告目录 Results test1Results = Runner.path("classpath:Karate/test1.feature") .outputCucumberJson(true) .karateEnv(System.getProperty("karate.env")) .reportDir("target/test1-reports") // 指定独立目录 .parallel(5); addJsonFiles(test1Results.getReportDir()); // 为test2指定独立报告目录 Results test2results = Runner.path("classpath:Karate/test2results.feature") .outputCucumberJson(true) .karateEnv(System.getProperty("karate.env")) .reportDir("target/test2-reports") // 指定独立目录 .parallel(5); addJsonFiles(test2results.getReportDir()); } public void addJsonFiles(String karateOutputPath) { Collection<File> jsonFiles = FileUtils.listFiles(new File(karateOutputPath), new String[] {"json"}, true); for (File jsonFileItem : jsonFiles) { jsonPaths.add(jsonFileItem.getAbsolutePath()); } } @AfterAll public static void createConfig() { String testProjectName = "finalData"; Configuration config = new Configuration(new File("target/"+testProjectName), testProjectName); ReportBuilder reportBuilder = new ReportBuilder(jsonPaths, config); reportBuilder.generateReports(); } }
方法二:一次性运行所有Feature文件(更推荐)
如果多个Feature文件可以批量执行,直接通过Runner.path()传入多个路径,Karate会自动统一收集所有测试结果,无需手动处理多目录:
class ApiMockRunner { private static List<String> jsonPaths = new ArrayList<>(); @Test public void testSample() { // 一次性运行多个feature文件 Results allResults = Runner.path("classpath:Karate/test1.feature", "classpath:Karate/test2results.feature") .outputCucumberJson(true) .karateEnv(System.getProperty("karate.env")) .parallel(5); addJsonFiles(allResults.getReportDir()); } public void addJsonFiles(String karateOutputPath) { Collection<File> jsonFiles = FileUtils.listFiles(new File(karateOutputPath), new String[] {"json"}, true); for (File jsonFileItem : jsonFiles) { jsonPaths.add(jsonFileItem.getAbsolutePath()); } } @AfterAll public static void createConfig() { String testProjectName = "finalData"; Configuration config = new Configuration(new File("target/"+testProjectName), testProjectName); ReportBuilder reportBuilder = new ReportBuilder(jsonPaths, config); reportBuilder.generateReports(); } }
额外注意事项
- 若使用JUnit 4,需把
@AfterAll替换为@AfterClass,且方法必须为静态。 - 确保
FileUtils依赖正确引入(来自Apache Commons IO)。
内容的提问来源于stack exchange,提问作者mattsmith5
相关产品推荐
相关产品推荐

