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

如何通过Java利用Karate报告的JSON数据生成图表

Karate报告JSON(txt后缀)读取解析+图表生成实现方案

整个流程分3步走,不需要对txt后缀做特殊处理,本质就是纯文本存储的JSON结构:

1. 读取文件内容

直接用Java NIO读取全量文本即可,不用关心文件后缀:

import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.io.IOException;

public class KarateReportUtil {
    public static String readReportFile(String filePath) throws IOException {
        // 指定UTF-8编码避免乱码
        return new String(Files.readAllBytes(Paths.get(filePath)), StandardCharsets.UTF_8);
    }
}

2. 解析JSON提取图表所需字段

选Jackson或者Gson这类成熟JSON处理库都可以,推荐用树模型遍历,不用提前定义全量的报告映射类,只提取你做图表需要的字段就行,适配Karate报告的默认结构:

import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import java.util.*;

public class ReportDataParser {
    private static final ObjectMapper MAPPER = new ObjectMapper();

    public static Map<String, Object> parseForChart(String jsonContent) throws IOException {
        JsonNode root = MAPPER.readTree(jsonContent);
        Map<String, Object> result = new HashMap<>();

        // 提取汇总指标:场景总数、成功/失败数,用来做通过率饼图
        JsonNode summaryNode = root.path("summary");
        result.put("totalScenarios", summaryNode.path("scenariosTotal").asInt());
        result.put("passedScenarios", summaryNode.path("scenariosPassed").asInt());
        result.put("failedScenarios", summaryNode.path("scenariosFailed").asInt());
        result.put("totalDurationMs", summaryNode.path("durationMillis").asLong());

        // 提取单场景明细:名称、耗时、状态,用来做耗时对比柱状图
        List<Map<String, Object>> scenarioDetails = new ArrayList<>();
        JsonNode scenarioNodes = root.path("scenarios");
        for (JsonNode scenario : scenarioNodes) {
            Map<String, Object> item = new HashMap<>();
            item.put("name", scenario.path("name").asText());
            item.put("costMs", scenario.path("durationMillis").asLong());
            item.put("status", scenario.path("status").asText());
            scenarioDetails.add(item);
        }
        result.put("scenarioList", scenarioDetails);
        return result;
    }
}

不同版本Karate生成的报告字段层级可能有差异,先打开txt文件核对下实际字段名,调整代码里的path取值即可。

3. 生成对应数据图表

根据你的输出需求选对应的图表库即可:

  • 输出PNG/JPG等静态图片:用JFreeChart,传入上一步提取的结构化数据,可直接生成通过率饼图、场景耗时柱状图、步骤通过率条形图等
  • 输出可交互的HTML报告:把提取到的数据填充到提前写好的前端图表模板里,生成HTML文件后打开即可查看带悬浮、筛选效果的交互图表
    以JFreeChart生成通过率饼图为例,核心代码如下:
import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartUtils;
import org.jfree.chart.JFreeChart;
import org.jfree.data.general.DefaultPieDataset;
import java.io.File;
import java.io.IOException;
import java.util.Map;

public class ChartBuilder {
    public static void buildPassRatePie(Map<String, Object> chartData, String outputImgPath) throws IOException {
        DefaultPieDataset<String> dataset = new DefaultPieDataset<>();
        dataset.setValue("执行成功", (Integer) chartData.get("passedScenarios"));
        dataset.setValue("执行失败", (Integer) chartData.get("failedScenarios"));

        JFreeChart chart = ChartFactory.createPieChart(
                "Karate自动化测试场景通过率",
                dataset,
                true,
                true,
                false
        );
        // 输出800*600分辨率的PNG图片
        ChartUtils.saveChartAsPNG(new File(outputImgPath), chart, 800, 600);
    }
}

完整调用示例

public class App {
    public static void main(String[] args) throws IOException {
        // 传入你的txt格式JSON报告路径
        String reportContent = KarateReportUtil.readReportFile("./karate-reports/karate-summary.txt");
        Map<String, Object> data = ReportDataParser.parseForChart(reportContent);
        // 生成饼图到指定路径
        ChartBuilder.buildPassRatePie(data, "./test-pass-rate.png");
    }
}

常见问题处理

  • 如果解析报错,先把读取出的文件内容打印前100个字符,确认没有多余的日志前缀、文件截断问题,保证内容是合法JSON
  • 如果字段取值为空,核对当前Karate版本生成的报告实际层级,调整path()方法里的字段名即可
  • 生成其他类型图表只需要替换对应数据集构造逻辑,传入提取好的明细数据即可

内容的提问来源于stack exchange,提问作者Abhyuday Shukla

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 20:36:20