如何修改TestNG报告移除末尾追加的参数化测试用例ID
解决TestNG报告自动追加参数化测试用例后缀的问题
我之前也碰到过一模一样的情况——哪怕通过ITest接口自定义了测试名称,TestNG还是会自动给参数化测试的名称加上类似(TC_7)的后缀。下面给你两种靠谱的解决方法:
方法一:用IAnnotationTransformer完全掌控测试名称
这种方法能从根源上覆盖TestNG的默认命名逻辑,让你完全自定义测试名称,不会出现额外后缀。
- 先创建一个Transformer类,实现
IAnnotationTransformer接口:
import java.lang.reflect.Constructor; import java.lang.reflect.Method; import org.testng.IAnnotationTransformer; import org.testng.annotations.ITestAnnotation; public class TestNameTransformer implements IAnnotationTransformer { @Override public void transform(ITestAnnotation annotation, Class testClass, Constructor testConstructor, Method testMethod) { // 清空默认的testName,避免TestNG自动生成带后缀的名称 annotation.setTestName(""); } }
- 修改你的测试类,在
@BeforeMethod里直接修改测试结果的名称:
import org.testng.ITest; import org.testng.ITestResult; import org.testng.annotations.BeforeMethod; import org.testng.annotations.DataProvider; import org.testng.annotations.Test; import java.lang.reflect.Method; public class Test_suite implements ITest { private String testInstanceName=""; @Override public String getTestName() { return testInstanceName; } private void setTestName(String anInstanceName) { this.testInstanceName = anInstanceName; } @DataProvider() public Object[][] Unit() throws Exception { Object[][] testObjArray = Excel.getTableArray("./Test Data/Test.xlsx","Unit"); return testObjArray; } @BeforeMethod(alwaysRun=true) public void before(Method method, Object[] parameters, ITestResult result) { String testCaseId = parameters[0].toString(); System.out.println(testCaseId); setTestName(testCaseId); // 直接覆盖测试结果的名称,彻底去掉自动追加的后缀 result.setName(testCaseId); } @Test(dataProvider="Unit") public void Test(){ // 你的测试逻辑 } }
- 在TestNG的xml配置文件中添加这个Transformer(如果是代码启动TestNG,就在TestNG实例里注册):
<suite name="Your Test Suite"> <listeners> <listener class-name="com.yourpackage.TestNameTransformer"/> </listeners> <test name="Your Test Case"> <classes> <class name="com.yourpackage.Test_suite"/> </classes> </test> </suite>
方法二:简化版 - 手动截断后缀
如果不想写Transformer,也可以在getTestName()里手动切掉自动追加的后缀。不过这种方法通用性稍差,只适用于你当前遇到的括号格式后缀:
@Override public String getTestName() { // 检测到括号后缀就截取前面的内容 if (testInstanceName.contains("(")) { return testInstanceName.substring(0, testInstanceName.indexOf("(")).trim(); } return testInstanceName; }
问题根源说明
TestNG默认会给参数化测试的实例追加后缀,用来区分不同的参数用例——哪怕你通过ITest自定义了名称,它还是会在这个基础上补加后缀。所以要么用Transformer彻底覆盖默认逻辑,要么直接修改ITestResult的名称来强制替换。
内容的提问来源于stack exchange,提问作者aviral
相关产品推荐
相关产品推荐

