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

Cucumber+TestNG项目中Allure无法在onTestFailure()添加附件

问题分析

核心原因是Cucumber与TestNG的生命周期不兼容:当TestNG监听器的onTestFailure()触发时,Cucumber管理的当前测试场景/步骤的Allure上下文已经关闭,此时添加的附件无法关联到对应的Cucumber测试条目,仅能生成文件但不会在报告中显示关联关系。而纯TestNG项目中不存在这种生命周期错位的问题,因此可以正常工作。

解决方案

方案1:改用Cucumber钩子捕获失败(推荐)

利用Cucumber原生的@AfterStep或@AfterScenario钩子,在Cucumber自身的生命周期内处理失败并添加附件,此时Allure上下文仍有效,能正确关联到测试条目。

示例代码:

import io.cucumber.java.AfterStep;
import io.cucumber.java.Scenario;
import io.qameta.allure.Allure;
import org.openqa.selenium.OutputType;
import org.openqa.selenium.TakesScreenshot;

public class CucumberHooks {

    // 假设driver在BaseTest中是静态可访问的
    private static final TakesScreenshot driver = (TakesScreenshot) BaseTest.getDriver();

    @AfterStep
    public void attachScreenshotOnFailure(Scenario scenario) {
        if (scenario.isFailed()) {
            byte[] screenshotBytes = driver.getScreenshotAs(OutputType.BYTES);
            Allure.addAttachment(
                "步骤失败截图",
                "image/png",
                screenshotBytes,
                ".png"
            );
        }
    }
}

方案2:TestNG监听器中手动关联Cucumber上下文

如果必须使用TestNG监听器,需要从TestNG的ITestResult中提取Cucumber场景的ID,手动将附件关联到对应的Allure测试结果上。

示例代码:

import org.testng.ITestResult;
import org.testng.TestListenerAdapter;
import io.qameta.allure.Allure;
import org.openqa.selenium.OutputType;
import org.openqa.selenium.TakesScreenshot;
import java.util.UUID;

public class TestEventsListener extends TestListenerAdapter {

    @Override
    public void onTestFailure(ITestResult result) {
        // 从TestResult中获取Cucumber场景ID(Cucumber会将该信息存入attributes)
        String scenarioId = (String) result.getAttribute("cucumberScenarioId");
        if (scenarioId == null) return;

        // 获取对应的Allure测试结果对象
        Allure.getLifecycle().getTestResult(UUID.fromString(scenarioId))
            .ifPresent(testResult -> {
                byte[] screenshotBytes = ((TakesScreenshot) BaseTest.getDriver()).getScreenshotAs(OutputType.BYTES);
                // 手动关联附件到指定测试结果
                Allure.getLifecycle().addAttachment(
                    "场景失败截图",
                    "image/png",
                    ".png",
                    screenshotBytes,
                    testResult.getUuid()
                );
            });
    }
}

注意:该方法依赖Cucumber内部的属性存储逻辑,不同版本可能有变化,需结合使用的Cucumber版本验证。

方案3:验证版本兼容性

确保使用的Allure、Cucumber、TestNG版本相互兼容,推荐组合:

  • allure-cucumber7-jvm: 2.20.0+
  • cucumber-testng: 7.10.0+
  • testng: 7.8.0+
验证要点
  1. 生成报告时使用allure generate allure-results --clean命令,确保生成最新的报告文件
  2. 避免在onTestFailure()中直接调用无上下文的Allure.addAttachment(),否则附件会被关联到TestNG的测试套件而非Cucumber场景/步骤

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 18:38:01