如何覆盖TestNG报告中显示的测试名称?我想覆盖中间列中显示的名称(当前显示为方法名称)。 这可能吗?
我尝试这样做,但它没有用。
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() );
}
思想?
答案 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)