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

Cucumber/Jira/Xray集成:截图附件无法在Jira测试执行中显示

Cucumber JSON报告附件适配Xray格式的解决方案

问题背景

我在集成Cucumber/Jira/Xray时,用Cucumber JSON格式化插件生成测试报告,再通过Xray Maven插件导入结果到Jira/Xray。Runner配置如下:

@ConfigurationParameter(
    key = "cucumber.plugin",
    value = "json:target/cucumber-reports/cucumber.json"
)
public class RunnerPttas {
}

无附件时导入正常,但通过@AfterStep钩子添加截图附件后:

@AfterStep
public void takeScreenshots(Scenario scenario) throws IOException {
    byte[] data = Files.readAllBytes(Paths.get(screenshotPath+"evidence.png"));// 获取截图
    scenario.attach(data, "image/png", "Evidence");
}

生成的JSON中,截图被嵌套在步骤的after对象内,而Xray要求附件必须直接位于step对象下,导致Jira测试执行工单无法显示附件。

可行解决方案

方案1:在步骤定义内直接添加附件

Cucumber中,在步骤定义方法里调用scenario.attach()添加的附件,会直接关联到当前步骤,生成的JSON里embeddings字段会直接属于step对象,完全符合Xray的格式要求。示例:

@Given("打开系统登录页面")
public void openLoginPage(Scenario scenario) throws IOException {
    // 执行页面操作逻辑
    byte[] screenshotData = Files.readAllBytes(Paths.get(screenshotPath+"login_page.png"));
    scenario.attach(screenshotData, "image/png", "登录页面初始截图");
}

这种方式无需修改报告格式,是最直接的适配方案。

方案2:自定义脚本修改生成的JSON报告

如果必须保留@AfterStep钩子的方式,可以在生成JSON报告后,通过脚本修改结构,把after块中的embeddings移动到所属的step对象下。

以下是Java版的修改逻辑示例:

import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.core.type.TypeReference;
import java.io.File;
import java.util.List;
import java.util.Map;
import java.util.ArrayList;

public class CucumberJsonModifier {
    public static void main(String[] args) throws Exception {
        ObjectMapper mapper = new ObjectMapper();
        // 读取原始Cucumber JSON报告
        List<Map<String, Object>> report = mapper.readValue(
            new File("target/cucumber-reports/cucumber.json"),
            new TypeReference<List<Map<String, Object>>>(){}
        );

        // 遍历报告结构,移动embeddings
        for (Map<String, Object> feature : report) {
            List<Map<String, Object>> elements = (List<Map<String, Object>>) feature.get("elements");
            if (elements == null) continue;

            for (Map<String, Object> element : elements) {
                List<Map<String, Object>> steps = (List<Map<String, Object>>) element.get("steps");
                if (steps == null) continue;

                for (Map<String, Object> step : steps) {
                    List<Map<String, Object>> afterBlocks = (List<Map<String, Object>>) step.get("after");
                    if (afterBlocks == null || afterBlocks.isEmpty()) continue;

                    // 收集所有after块中的embeddings
                    List<Map<String, Object>> embeddings = new ArrayList<>();
                    for (Map<String, Object> after : afterBlocks) {
                        List<Map<String, Object>> afterEmbeddings = (List<Map<String, Object>>) after.get("embeddings");
                        if (afterEmbeddings != null) {
                            embeddings.addAll(afterEmbeddings);
                        }
                    }

                    // 将embeddings放到step对象下
                    if (!embeddings.isEmpty()) {
                        step.put("embeddings", embeddings);
                    }
                    // 移除原有的after块(可选,不影响导入)
                    step.remove("after");
                }
            }
        }

        // 写入修改后的JSON文件
        mapper.writeValue(new File("target/cucumber-reports/cucumber-xray.json"), report);
    }
}

修改完成后,配置Xray Maven插件使用修改后的cucumber-xray.json文件进行导入即可。

注意:Cucumber原生JSON插件无法通过配置改变@AfterStep附件的存放位置,因为这是它的固定格式设计。

内容的提问来源于stack exchange,提问作者Obaid Maroof

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 19:23:10