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

基于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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 17:17:22