如何将参数传递给TestNG侦听器

时间:2014-12-15 12:32:14

标签: java listener testng

我有一个TestNG文件demo.java和一个监听器DemoListener.java

Demo.java

import org.testng.*;
@Listeners(DemoListener.class)
public class Demo{
public static String testName = "DemoName" 

@Test(priority = 1)
public void demoTest() {
    Assert.assertEquals(some_value,value, "message");
  }
}

DemoListener.java

import org.testng.ITestListener;
Public class DemoListener implements ITestListener {

@Override
public void onTestSuccess(ITestResult arg0) {
    System.out.println("On test Success:- ");
    // Here I want to access **variable(testName)** declared in Demo class.
    // Or is there anyway that I can pass that variable.
  }
}

现在,我希望在每次测试执行后访问DemoListener类中Demo类中声明的变量testName。我会在DemoListener中声明它,但我有很多像Demo这样的类,每个文件都有不同的testName。

感谢您的帮助!

2 个答案:

答案 0 :(得分:2)

我不完全确定你为什么要这样做,也许一点背景会有所帮助。

但是,要回答这个问题,你有几个选择:

  1. 在TestNG的XML中定义变量。如果将其放在属性构造中,则System.getProperty()可以使用它。
  2. 由于testName是公共静态,因此您只需在Demo.testName内引用DemoListener
  3. 我有点困惑为什么你不能简单地使用ITestResult.getName()但是......

    编辑:为清楚起见,在Demo.java中,在每种方法中,您都可以执行以下操作:

    ITestResult tr = Reporter.getCurrentTestResult();
    tr.setName( "whatever name you want to give your test step" );
    

    然后你可以完成剩下的测试(断言等)。之后,在DemoListener.java中,您已经传递了一个ITestResult实例,您可以通过调用arg0.getName()

    简单地询问它的名称(您在上面的代码中设置的名称)。

答案 1 :(得分:1)

得到了我的问题的答案,使用了java反射。像魅力一样工作。 我在DemoListener类中编写了以下方法。感谢我的朋友Kailas!

public static void getTestSuiteName(ITestResult arg0){
 Class<?> clazz = arg0.getTestClass().getRealClass(); //Demo class
    Field field = null;
    try {
        field = clazz.getField("testSuiteName");
    } catch (NoSuchFieldException | SecurityException e1) {
        e1.printStackTrace();
    }
    field.setAccessible(true);
    if(String.class.isAssignableFrom(field.getType())) {
        try {
            testSuiteName =  (String) field.get(null); //I can get value of testSuiteName set in Demo class
        } catch (IllegalArgumentException | IllegalAccessException e) {
            e.printStackTrace();
        }
    }
}