从HTML报告中可以看到,从DataProvider输入动态设置TestNG测试名称?

时间:2014-07-08 22:48:32

标签: testng functional-testing

我尝试按照this thread的说明操作,但它们无法为我工作。基本上我需要弄清楚如何从DataProvider输入动态设置TestNG测试名称,如HTML报告中所示。

我创建了a GitHub project that re-creates the problem I am experiencing我希望有人可以帮我解决?我创建了一个CustomReport类,它在HTML报告中显示“测试名称”,但测试名称尚未正确显示。

要解决这个问题,我需要的是修改CustomReport类,以便在测试完成后以某种方式从ITestContext对象中读取名称值,并在报告中正确报告。

到目前为止,我能够在我的GitHub测试项目中显示我可以将正确的个人名称打印到控制台,但我只需要弄清楚如何在报告中打印它们。

1 个答案:

答案 0 :(得分:2)

djangofan,不确定你是否找到了方法,但我想出了一种方法来使用你的repro,虽然有点hacky,其中一部分我从这个post中抓住了。

此处,创建属性名称,但不增加名称。这会导致属性列表增长,然后丢失哪个属性属于哪个测试的上下文。出于所有意图和目的,我们只想识别一个测试名称:

@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文件并不理想,但它是基于您的代码的最简单的解决方案,而且我认为它对我有用!

enter image description here