我尝试按照this thread的说明操作,但它们无法为我工作。基本上我需要弄清楚如何从DataProvider输入动态设置TestNG测试名称,如HTML报告中所示。
我创建了a GitHub project that re-creates the problem I am experiencing和我希望有人可以帮我解决?我创建了一个CustomReport类,它在HTML报告中显示“测试名称”,但测试名称尚未正确显示。
要解决这个问题,我需要的是修改CustomReport类,以便在测试完成后以某种方式从ITestContext对象中读取名称值,并在报告中正确报告。
到目前为止,我能够在我的GitHub测试项目中显示我可以将正确的个人名称打印到控制台,但我只需要弄清楚如何在报告中打印它们。
答案 0 :(得分:2)
此处,创建属性名称,但不增加名称。这会导致属性列表增长,然后丢失哪个属性属于哪个测试的上下文。出于所有意图和目的,我们只想识别一个测试名称:
@Test( dataProvider = "dp" )
public void testSample1( int num, String name, String desc, ITestContext ctx ) {
//ctx.setAttribute( "testName" + num, name );
//ctx.setAttribute( "testDesc" + num, desc );
ctx.setAttribute("testName", name);
ctx.setAttribute("testDesc", desc);
assertTrue( true );
}
现在创建自定义侦听器,这里我们将方法名称设置为等于属性名称,并将反映在testng-results.xml文件中。注意,我们是硬编码" testName"参数名称。
public class CustomListener extends TestListenerAdapter {
@Override
public void onTestSuccess(ITestResult tr) {
setTestNameInXml(tr);
super.onTestSuccess(tr);
}
...
private void setTestNameInXml(ITestResult tr) {
try
{
ITestContext ctx = tr.getTestContext();
Set<String> attribs = ctx.getAttributeNames();
for ( String x : attribs ) {
if (x.contains("testName")) {
Field method = TestResult.class.getDeclaredField("m_method");
method.setAccessible(true);
method.set(tr, tr.getMethod().clone());
Field methodName = BaseTestMethod.class.getDeclaredField("m_methodName");
methodName.setAccessible(true);
methodName.set(tr.getMethod(), ctx.getAttribute( x ));
break;
}
}
}
catch (Exception e)
{
e.printStackTrace();
}
}
}
这将自动替换&#34;方法名称&#34;中的实际方法名称。在属性中设置测试用例名称的列。
更新testng-results.xml文件并不理想,但它是基于您的代码的最简单的解决方案,而且我认为它对我有用!