在 testNG ITestListener 中获取测试方法的注释

Posted

技术标签:

【中文标题】在 testNG ITestListener 中获取测试方法的注释【英文标题】:get Annotation of test method in testNG ITestListener 【发布时间】:2013-04-24 10:42:23 【问题描述】:

我正在尝试将 TestLink 与 TestNG 集成 方法如下

1>使用 onTestFailure 和 onTestSuccess 编写 ITestListner

2> 获取变量中失败/成功的方法的注释(如 testName,相当于 testlink 中的测试名称)

3>使用可用 API 与 TestLink 建立连接并更新测试用例。

但是我很难在 ITestListner 中找到方法注释值,并且要求仅在 ITestListner 中获取注释值,以便可以在 Test_link 中更新正确的测试用例

有人可以帮我如何在 ITestListner 中获取测试方法注释值或任何其他我可以将 testlink 更新与 TestNG 集成的方法

【问题讨论】:

【参考方案1】:

您好,感谢 niharika 的帮助 ,首先你在解释使用 TestNG 时是正确的,但是我们正在使用 TestNG for Selenium,并且已经有大约 1000 个测试用例编写在测试方法中,我们必须忍受它

我想出了一些解决方案,我们仍然可以使用两个侦听器获取测试方法的 testName 这只是解决方法我不确定这是否是最好的方法,但截至目前解决我的目的

package com.automation.testng.listner;
import org.testng.*;


public class MyIInvokeMethodListner_TestName_TestLink implements IInvokedMethodListener    

public static String testName;


public void afterInvocation(IInvokedMethod arg0, ITestResult arg1) 
    // TODO Auto-generated method stub



public void beforeInvocation(IInvokedMethod m, ITestResult tr) 
    // TODO Auto-generated method stub
    //This give the Annotation Test object
    org.testng.annotations.Test t=m.getTestMethod().getMethod().getAnnotation(org.testng.annotations.Test.class);

    MyIInvokeMethodListner_TestName_TestLink.testName = t.testName().toString();





MyITestListner 如下所示

package com.automation.testng.listner;
import org.testng.*;
public class MyITestListner_TestLink extends TestListenerAdapter  

/*IAnnotationTransformer at;
public Listner_1()

    this.at = new Annotation_listner();
*/
@Override
public void onTestFailure(ITestResult tr)

    System.out.println("Hurray !I am being inboked from Test listner");
    MyIInvokeMethodListner_TestName_TestLink a = new MyIInvokeMethodListner_TestName_TestLink();
    System.out.println(MyIInvokeMethodListner_TestName_TestLink.testName);

    

public void onTestSuccess(ITestResult tr)

    MyIInvokeMethodListner_TestName_TestLink a = new MyIInvokeMethodListner_TestName_TestLink();
    System.out.println(MyIInvokeMethodListner_TestName_TestLink.testName);



基本上我们获取方法,然后使用测试注释类设置可在 MyITestListner 中使用的静态变量

【讨论】:

【参考方案2】:

ITestListener 是在<test> 标记之后使用的那个。要获取方法名和注解细节,需要实现IInvokedMethodListener,并在该接口的after/before方法中,使用method.getTestMethod().getMethodName()之类的东西来获取正在执行的方法名。

如果你在方法级别添加testName,我认为你做错了,因为testng的帮助提到了这个“这个测试类应该放在的测试的名称。如果@Test不是,这个属性被忽略在班级层面。”

如果您确实在班级级别指定了@Test,那么您可以按以下方式获取它:

method.getTestMethod().getTestClass().getTestName()

【讨论】:

但是在使用 IInvokedMethodListener 之后,我也无法获得像 @Test(testName = "TestCaseID") 这样的测试方法的注释值,我想获得 testName 值,即变量中的 TestCaseID 对不起,如果我是 TestNG 的新手,让您感到困惑,我想您仍然没有得到我的问题,可以说我有一个类,它有 4 个测试方法和 @Test(testName = "TestCaseID ") 注释(这是唯一的测试方法)并且我想在 ITestListner 中获取注释,有一个 IAnnotationTransformer 列表器可以选择获取它的注释值,但我想要特定方法的注释通过/失败 不应在方法级别使用 testName。如果您在方法级别使用它,您将无法通过代码获取它,因为 testName 并不意味着在方法级别使用。仅当您在班级级别拥有 @Test 时, testName 才有意义。例如。如果类 A 有 4 个测试,从 test1 到 test4(),那么除了在每个方法级别进行注释之外,您还可以对类进行注释,即 \@Test \n public void classA..test1() 到 test4()..。现在在这个“@Test”注释中,testName 是有意义的。但不是在方法级别的“@Test”。 一些我如何使用注释类(测试)将在站点不允许新用户发布问题的解决方案时立即发布解决方案:org.testng.annotations.Test t = m。 getTestMethod().getMethod().getAnnotation(org.testng.annotations.Test.class); 嗯..很高兴这对你有用。似乎 getMethod 已被弃用..您可以尝试使用 method.getTestMethod().getConstructorOrMethod().getMethod().getAnnotation(org.testng.annotations.Test.class)【参考方案3】:

有点难看,您可能希望将这些部分包装在代码中的空检查中,但这是您从 ITestResult 获取注释中指定的 testName 的方式:

iTestResult.getMethod().getConstructorOrMethod().getMethod().getAnnotation(Test.class).testName()

【讨论】:

以上是关于在 testNG ITestListener 中获取测试方法的注释的主要内容,如果未能解决你的问题,请参考以下文章

TestNG与ExtentReport集成

TestNG - 如何在 testng 自定义电子邮件报告中打印运行时 testng 参数?

TestNG 入门教程

TestNG 入门教程

testNG框架从入门到精通

TestNG 入门教程