Karate 0.9.3升级至1.2.0后两批测试结果无法合并问题
Karate 1.2.0多批次测试运行结果无法合并问题解决方案
问题表现
- Karate版本从V0.9.3升级至V1.2.0后,分两批执行的测试用例结果无法自动合并到同一份测试报告
- 测试执行逻辑:第一批任务完成后执行第一组API测试(Runner 1),第二批任务完成后执行第二组API测试(Runner 2,对应新增特性文件)
- V0.9.3版本行为:两次
Runner.parallel指向同一输出目录时,测试结果自动累加,最终报告包含两个批次的所有测试内容 - V1.2.0版本行为:每次测试执行前会自动清空目标输出目录下已有的Karate JSON结果文件,最终报告仅保留最后一次运行的测试结果
V0.9.3版本原有实现代码
Results results1 = Runner.parallel( Arrays.asList("@tag1,@tag2", "@ignore"), Collections.singletonList("classpath:features"), 5, "target/sources-rapports"); int totalFailCount = results1.getFailCount(); Results results2 = Runner.parallel(Arrays.asList("@tag3,@tag4", "@ignore"),Collections.singletonList("classpath:features"),5,"target/sources-rapports"); totalFailCount += results2.getFailCount(); generateReport(results2.getReportDir());
V1.2.0版本默认Builder写法
Runner.path("classpath:features") .tags(Arrays.asList("@tag1,@tag2", "@ignore")) .outputCucumberJson(true) .parallel(5);
可行解决方案
方案一:分目录存储结果后手动聚合
- 两次测试运行分别指定独立的输出目录,避免后一次运行清空前一次的结果文件
- 两次执行全部完成后,将两个目录下所有
karate-*.json结果文件复制到统一的汇总目录,再基于该目录生成全量报告
示例代码:
// 第一批测试,指定独立输出目录 Results results1 = Runner.path("classpath:features") .tags(Arrays.asList("@tag1,@tag2", "@ignore")) .outputCucumberJson(true) .reportDir("target/sources-rapports/batch1") .parallel(5); int totalFailCount = results1.getFailCount(); // 第二批测试,指定另一个独立输出目录 Results results2 = Runner.path("classpath:features") .tags(Arrays.asList("@tag3,@tag4", "@ignore")) .outputCucumberJson(true) .reportDir("target/sources-rapports/batch2") .parallel(5); totalFailCount += results2.getFailCount(); // 通过Java IO将batch1、batch2目录下所有JSON结果文件复制到target/sources-rapports/final目录 // 基于汇总目录生成最终报告 generateReport("target/sources-rapports/final");
方案二:使用内置Results合并API(推荐)
- V1.2.0版本提供了
Results.of()方法,支持直接合并多个批次运行返回的Results对象,无需手动处理文件复制,代码改动量最小
示例代码:
// 执行第一批测试 Results results1 = Runner.path("classpath:features") .tags(Arrays.asList("@tag1,@tag2", "@ignore")) .outputCucumberJson(true) .parallel(5); // 执行第二批测试 Results results2 = Runner.path("classpath:features") .tags(Arrays.asList("@tag3,@tag4", "@ignore")) .outputCucumberJson(true) .parallel(5); // 合并两个批次的测试结果 Results mergedResults = Results.of(results1, results2); int totalFailCount = mergedResults.getFailCount(); // 基于合并后的结果生成全量报告 generateReport(mergedResults.getReportDir());
版本差异说明:V1.2.0默认新增输出目录预清理逻辑,目的是避免历史测试残留的脏数据干扰本次运行结果,因此不再支持旧版本同目录直接追加写入结果的行为,上述两种方案均可完全复现旧版本的报告合并效果。
内容的提问来源于stack exchange,提问作者Alexis G.
相关产品推荐
相关产品推荐

