You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 13:51:04