如何覆盖TestNG报告中显示的测试方法名称?

时间:2014-01-02 17:02:27

标签: unit-testing testng

如何覆盖TestNG报告中显示的测试名称?我想覆盖中间列中显示的名称(当前显示为方法名称)。 这可能吗?

enter image description here

我尝试这样做,但它没有用。

public class EchApiTest1 extends TestBase {
  ...
@BeforeTest
public void setUp() {
    restClient = new RestClientPost();
    this.setTestName( "ech: XXXXXX" );
}

而且,基类:

import org.testng.ITest;    
public class TestBase implements ITest {        
    String testName = "";    
    @Override
    public String getTestName() {
        return this.testName;
    }           
    public void setTestName( String name ) {
        this.testName = name;
    }    
}

注意:当我在Jenkins TestNG插件报告中查看报告详细信息时,上面的代码确实有效,该报告在Reporter日志输出的开头显示了被覆盖的测试名称,称为“实例名称:”字符串。为什么,在这种情况下,为什么“setTestName()”方法会更改报告中标有“实例名称”的字符串?

我找到的一个答案有这样的建议,但我不知道如何将ITestResult arg传递给AfterMethod方法:

@AfterMethod
public void setResultTestName( ITestResult result ) {
  try {
    BaseTestMethod bm = (BaseTestMethod)result.getMethod();
    Field f = bm.getClass().getSuperclass().getDeclaredField("m_methodName");
    f.setAccessible(true);
    f.set( bm, bm.getMethodName() + "." + your_customized_name );        
  } catch ( Exception ex ) {
  Reporter.log( "ex" + ex.getMessage() );
 }

思想?

3 个答案:

答案 0 :(得分:1)

请在TestNG报告中找到以下代码来设置testcase的自定义名称。

此代码中提供了以下功能。

  • 多次在同一测试用例上动态执行
  • 为报告设置自定义测试用例名称
  • 设置多个测试用例执行的并行执行

    import java.lang.reflect.Field;
    import org.testng.ITest;
    import org.testng.ITestResult;
    import org.testng.Reporter;
    import org.testng.annotations.AfterMethod;
    import org.testng.annotations.DataProvider;
    import org.testng.annotations.Factory;
    import org.testng.annotations.Test;
    import org.testng.internal.BaseTestMethod;
    import com.test.data.ServiceProcessData;
    
    public class ServiceTest implements ITest {
    
    protected ServiceProcessData serviceProcessData;
    protected String testCaseName = "";
    
    @Test
    public void executeServiceTest() {
        System.out.println(this.serviceProcessData.toString());
    }
    
    @Factory(dataProvider = "processDataList")
    public RiskServiceTest(ServiceProcessData serviceProcessData) {
        this.serviceProcessData = serviceProcessData;
    }
    
    @DataProvider(name = "processDataList", parallel = true)
    public static Object[] getProcessDataList() {
    
        Object[] serviceProcessDataList = new Object[0];
        //Set data in serviceProcessDataList
        return serviceProcessDataList;
    }
    
    @Override
    public String getTestName() {
    
        this.testCaseName = "User custom testcase name";
        // this.testCaseName = this.serviceProcessData.getTestCaseCustomName();
        return this.testCaseName;
    }
    
    @AfterMethod(alwaysRun = true)
    public void setResultTestName(ITestResult result) {
        try {
            BaseTestMethod baseTestMethod = (BaseTestMethod) result.getMethod();
            Field f = baseTestMethod.getClass().getSuperclass().getDeclaredField("m_methodName");
            f.setAccessible(true);
            f.set(baseTestMethod, this.testCaseName);
        } catch (Exception e) {
            ErrorMessageHelper.getInstance().setErrorMessage(e);
            Reporter.log("Exception : " + e.getMessage());
        }
    }}
    

    由于

答案 1 :(得分:0)

我找到了“解决方法”,但我希望得到更好的答案。我希望能够在HTML报告上显示这个“测试名称”或“实例名称”值(不仅仅是在Reporter.log输出中),我开始认为它不可能:

@Test(dataProvider = "restdata2")
public void testGetNameFromResponse( TestArguments testArgs ) {
    this.setTestName( "ech: " + testArgs.getTestName() );
    Reporter.log( getTestName() );  // this magic shows test name on report
    ....

通过这种解决方法,用户现在可以通过查看Reporter.log输出来确定它是哪个测试,但我仍然希望这个名称更为突出。

我怀疑答案在于编写一个以某种方式覆盖ITestResult.getTestNameMethod()方法的TestListenerAdapter?这是我正在寻找的圣杯。

答案 2 :(得分:0)

'result'对象将自动传入setResultTestName方法(ITestResult结果) 如果在测试类中定义了组,请确保将alwaysRun = true设置为如下,否则“AfterMethod”将不会被执行。 @AfterMethod(alwaysRun = true)