我有一个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。
感谢您的帮助!
答案 0 :(得分:2)
我不完全确定你为什么要这样做,也许一点背景会有所帮助。
但是,要回答这个问题,你有几个选择:
System.getProperty()
可以使用它。testName
是公共静态,因此您只需在Demo.testName
内引用DemoListener
。我有点困惑为什么你不能简单地使用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();
}
}
}