如何在cucumber-js中获取场景失败步骤以生成自定义报告?
在cucumber-js中获取场景的失败步骤
要获取失败步骤的信息,核心是要访问执行后的步骤实例,而非原始的pickle步骤(后者无执行结果)。以下是针对不同cucumber-js版本的可行方案:
针对cucumber-js v8+版本
在After hook中,直接遍历scenario.steps集合,筛选出result.status为FAILED的步骤,提取其文本内容:
const fs = require('fs').promises; After(async function (scenario) { // 仅处理失败的场景 if (scenario.result.status !== 'FAILED') return; // 筛选失败步骤 const failedSteps = scenario.steps.filter(step => step.result?.status === 'FAILED' ); // 格式化为目标文本(如"Then status should be 400") const formattedSteps = failedSteps.map(step => step.pickleStep.text); // 写入failed.json try { let failedData = JSON.parse(await fs.readFile('failed.json', 'utf8')); // 匹配当前场景并添加失败步骤 const targetEntry = failedData.find(item => item.scenarioId === scenario.id); if (targetEntry) { targetEntry.failedSteps = formattedSteps; await fs.writeFile('failed.json', JSON.stringify(failedData, null, 2)); } } catch (err) { console.error('更新失败报告时出错:', err); } });
关键说明:
scenario.steps:包含场景执行后的所有步骤实例,每个实例携带result属性记录执行状态。step.pickleStep.text:直接获取步骤的纯文本描述,无需处理额外的标记或路径信息。- 用可选链
step.result?.status避免因步骤未执行完成(如前置步骤失败)导致的undefined错误。
针对cucumber-js v7及更早版本
旧版本API中,需使用getSteps()方法获取步骤集合,通过isFailed()判断状态:
const fs = require('fs'); After(function (scenario) { if (!scenario.isFailed()) return; const failedSteps = scenario.getSteps().filter(step => step.isFailed()); const formattedSteps = failedSteps.map(step => step.getText()); // 写入failed.json的逻辑(同步示例) try { let failedData = JSON.parse(fs.readFileSync('failed.json', 'utf8')); const targetEntry = failedData.find(item => item.scenarioId === scenario.getId()); if (targetEntry) { targetEntry.failedSteps = formattedSteps; fs.writeFileSync('failed.json', JSON.stringify(failedData, null, 2)); } } catch (err) { console.error('更新失败报告时出错:', err); } });
常见问题排查
- 若仍出现
result为undefined:确认你遍历的是scenario.steps(执行后实例)而非scenario.pickle.steps(原始未执行步骤)。 - 场景ID匹配问题:确保你在failed.json中存储了场景的唯一标识(如
scenario.id或scenario.pickle.id),用于精准匹配待更新的条目。
内容的提问来源于stack exchange,提问作者mr. Luvji
相关产品推荐
相关产品推荐

