基于Gradle7+Cucumber7.11.0,如何合并多份Cucumber JSON测试报告?
合并Cucumber多Runner生成的JSON报告(Gradle 7 + Cucumber 7.11.0)
针对你用多个TestNG Runner类分别生成独立Cucumber JSON报告的场景,下面提供几种可行的合并方案,适配Gradle 7和Cucumber 7.11.0环境,最终生成可上传至Xray的单份JSON报告。
方案一:利用Cucumber官方CLI工具合并(推荐)
Cucumber 7.x内置了JSON报告合并的CLI功能,直接在Gradle中定义任务调用即可,无需额外依赖。
在build.gradle中添加以下任务配置:
task mergeCucumberReports(type: JavaExec) { // 使用测试代码的类路径,自动包含Cucumber相关依赖 classpath = sourceSets.test.runtimeClasspath // 指定Cucumber CLI主类 mainClass = 'io.cucumber.core.cli.Main' // 合并参数:--merge开启合并模式,后跟待合并的JSON文件,--output指定输出路径 args = [ '--merge', 'build/cucumber-reports/a.json', 'build/cucumber-reports/b.json', '--output', 'build/cucumber-reports/report.json' ] } // 配置测试任务完成后自动执行合并任务 test.finalizedBy(mergeCucumberReports)
优化:自动收集所有JSON报告
如果后续会新增更多Runner类,不想每次手动添加文件路径,可以修改任务,动态遍历目录下的所有JSON文件:
task mergeCucumberReports(type: JavaExec) { classpath = sourceSets.test.runtimeClasspath mainClass = 'io.cucumber.core.cli.Main' // 动态获取cucumber-reports目录下的所有.json文件 def reportDir = file('build/cucumber-reports') def jsonReports = reportDir.listFiles({ file -> file.name.endsWith('.json') } as FileFilter).collect { it.path } args = ['--merge'] + jsonReports + ['--output', 'build/cucumber-reports/report.json'] } test.finalizedBy(mergeCucumberReports)
方案二:自定义Java工具类合并
如果需要更灵活的报告处理逻辑(比如过滤某些feature、修改报告内容),可以编写自定义Java工具类完成合并。
1. 编写合并工具类
创建一个工具类(例如放在src/main/java/com/test/utils/目录下):
import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.node.ArrayNode; import java.io.File; import java.io.IOException; public class MergeCucumberReports { public static void main(String[] args) throws IOException { if (args.length < 2) { System.err.println("参数格式错误:java MergeCucumberReports <输出文件路径> <输入文件1> <输入文件2> ..."); System.exit(1); } ObjectMapper mapper = new ObjectMapper(); ArrayNode mergedFeatures = mapper.createArrayNode(); // 遍历所有输入的JSON报告文件 for (int i = 1; i < args.length; i++) { JsonNode singleReport = mapper.readTree(new File(args[i])); // Cucumber JSON报告顶层是feature数组,直接合并数组元素 if (singleReport.isArray()) { mergedFeatures.addAll(singleReport); } else { mergedFeatures.add(singleReport); } } // 将合并后的结果写入目标文件 mapper.writerWithDefaultPrettyPrinter().writeValue(new File(args[0]), mergedFeatures); } }
2. 在Gradle中配置调用任务
在build.gradle中添加任务调用上述工具类:
task mergeCucumberReports(type: JavaExec) { // 包含主代码输出和测试类路径,确保能找到工具类和Jackson依赖 classpath = sourceSets.test.runtimeClasspath + sourceSets.main.output mainClass = 'com.test.utils.MergeCucumberReports' // 指定输出文件和待合并的输入文件 args = [ 'build/cucumber-reports/report.json', 'build/cucumber-reports/a.json', 'build/cucumber-reports/b.json' ] } test.finalizedBy(mergeCucumberReports)
验证与上传
合并完成后,build/cucumber-reports/report.json就是符合Cucumber规范的单份报告,直接用Xray的API上传即可,无需额外格式调整。
内容的提问来源于stack exchange,提问作者Nitin
相关产品推荐
相关产品推荐

