如何通过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
相关产品推荐
相关产品推荐

