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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 17:22:50