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

如何修改TestNG报告移除末尾追加的参数化测试用例ID

解决TestNG报告自动追加参数化测试用例后缀的问题

我之前也碰到过一模一样的情况——哪怕通过ITest接口自定义了测试名称,TestNG还是会自动给参数化测试的名称加上类似(TC_7)的后缀。下面给你两种靠谱的解决方法:

方法一:用IAnnotationTransformer完全掌控测试名称

这种方法能从根源上覆盖TestNG的默认命名逻辑,让你完全自定义测试名称,不会出现额外后缀。

  1. 先创建一个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("");
    }
}
  1. 修改你的测试类,在@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(){ 
        // 你的测试逻辑
    } 
}
  1. 在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 03:50:51