如何在TestNg监听器中获取QAF的Scenario场景标签信息
最优实现方案
以下两种方案都可以避免把ID硬编码到场景名称中,解决ID暴露、用例名过长的问题:
方案1:Cucumber钩子+TestResult属性存储(适配Cucumber+TestNG技术栈,最推荐)
你使用的带Scenario的场景标签属于Cucumber语法,Cucumber原生提供了Scenario对象的标签获取能力,只需要在前置钩子中把解析好的标签值存入TestNG的测试结果属性,后续监听器直接读取即可:
- 编写Cucumber前置钩子,解析标签并存储
import io.cucumber.java.Before; import io.cucumber.java.Scenario; import org.testng.ITestResult; import org.testng.Reporter; public class ScenarioHook { @Before public void initScenarioMeta(Scenario scenario) { ITestResult currentTestResult = Reporter.getCurrentTestResult(); // 遍历标签提取指定字段存入TestResult属性 for (String tag : scenario.getTags()) { if (tag.startsWith("@TestcaseId:")) { currentTestResult.setAttribute("testcaseId", tag.replace("@TestcaseId:", "").trim()); } else if (tag.startsWith("@IntId:")) { currentTestResult.setAttribute("intId", tag.replace("@IntId:", "").trim()); } } // 存储原生场景名,报告直接使用即可 currentTestResult.setAttribute("scenarioName", scenario.getName()); } }
- TestNG自定义监听器中直接读取属性
import org.testng.ITestListener; import org.testng.ITestResult; public class CustomReportListener implements ITestListener { @Override public void onTestFinish(ITestResult result) { String testcaseId = (String) result.getAttribute("testcaseId"); String intId = (String) result.getAttribute("intId"); String scenarioName = (String) result.getAttribute("scenarioName"); // 直接用以上字段生成自定义报告即可 } }
该方案完全不需要修改场景名称,所有ID字段不会对外暴露,新增标签字段只需要在钩子中加一行解析逻辑即可,维护成本极低。
方案2:自定义TestNG注解(适配纯TestNG技术栈)
如果你的用例是纯TestNG编写、没有使用Cucumber,可以自定义元信息注解标注在用例上,监听器直接读取注解值:
- 定义用例元信息注解
import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; @Retention(RetentionPolicy.RUNTIME) public @interface TestCaseMeta { String testcaseId(); String intId(); int priority() default 1; }
- 用例上标注注解
import org.testng.annotations.Test; @Test @TestCaseMeta(testcaseId = "VFF-265", intId = "615d440932e941018806cfc5", priority = 1) public void testLoginSuccess() { // 测试逻辑 }
- 监听器读取注解值
@Override public void onTestFinish(ITestResult result) { TestCaseMeta meta = result.getMethod().getConstructorOrMethod().getMethod().getAnnotation(TestCaseMeta.class); if (meta != null) { String testcaseId = meta.testcaseId(); String intId = meta.intId(); // 生成报告逻辑 } }
内容的提问来源于stack exchange,提问作者Renish
相关产品推荐
相关产品推荐

