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
相关产品推荐
相关产品推荐

