Java 如何将功能对象传递给TestNG ITestlistener(或在类中引用ITestlistener方法)?
我们目前正在使用硒、TestNG和Saucelabs。我试图覆盖Java 如何将功能对象传递给TestNG ITestlistener(或在类中引用ITestlistener方法)?,java,selenium,listener,testng,saucelabs,Java,Selenium,Listener,Testng,Saucelabs,我们目前正在使用硒、TestNG和Saucelabs。我试图覆盖onTestSuccess和onTestFailure侦听器方法,以便根据方法的结果将功能设置为true/false 我试过几种方法都没有成功。简要总结: MainSauceLabsClass.java public class MainSauceLabsClass { // ..... public static DesiredCapablities desiredCapabilities; // ....
onTestSuccess
和onTestFailure
侦听器方法,以便根据方法的结果将功能设置为true/false
我试过几种方法都没有成功。简要总结:
MainSauceLabsClass.java
public class MainSauceLabsClass {
// .....
public static DesiredCapablities desiredCapabilities;
// ....
@BeforeMethod
//set a whole range of parameters for Saucelabs here,e.g.:
desiredCapabilities = DesiredCapabilities.iphone();
desiredCapabilities.setCapabilities("idleTimeout",300);
// etc...
}
public class CustomTestListener implements ITestListener {
// ...
@Override
public void onTestSuccess(ITestResult result) {
// I want to pass to saucelabs pass/fail result via "passed" capability. something like
// desiredCapabilities.setCapabilities("passed",true);
}
}
@Listeners(CustomTestListener.class)
public class MainSauceLabsClass {
public static final ThreadLocal<DesiredCapabilities> CURRENT_DESIRED_CAPABILITIES =
new InheritableThreadLocal<>();
@BeforeMethod
public void setDesiredCapabilities() {
DesiredCapabilities desiredCapabilities = DesiredCapabilities.iphone();
desiredCapabilities.setCapability("idleTimeout", 300);
CURRENT_DESIRED_CAPABILITIES.set(desiredCapabilities);
}
}
public class CustomTestListener implements ITestListener {
// ...
@Override
public void onTestSuccess(ITestResult result) {
DesiredCapabilities desiredCapabilities =
MainSauceLabsClass.CURRENT_DESIRED_CAPABILITIES.get();
desiredCapabilities.setCapability("passed", true);
}
}
CustomTestListener.java
public class MainSauceLabsClass {
// .....
public static DesiredCapablities desiredCapabilities;
// ....
@BeforeMethod
//set a whole range of parameters for Saucelabs here,e.g.:
desiredCapabilities = DesiredCapabilities.iphone();
desiredCapabilities.setCapabilities("idleTimeout",300);
// etc...
}
public class CustomTestListener implements ITestListener {
// ...
@Override
public void onTestSuccess(ITestResult result) {
// I want to pass to saucelabs pass/fail result via "passed" capability. something like
// desiredCapabilities.setCapabilities("passed",true);
}
}
@Listeners(CustomTestListener.class)
public class MainSauceLabsClass {
public static final ThreadLocal<DesiredCapabilities> CURRENT_DESIRED_CAPABILITIES =
new InheritableThreadLocal<>();
@BeforeMethod
public void setDesiredCapabilities() {
DesiredCapabilities desiredCapabilities = DesiredCapabilities.iphone();
desiredCapabilities.setCapability("idleTimeout", 300);
CURRENT_DESIRED_CAPABILITIES.set(desiredCapabilities);
}
}
public class CustomTestListener implements ITestListener {
// ...
@Override
public void onTestSuccess(ITestResult result) {
DesiredCapabilities desiredCapabilities =
MainSauceLabsClass.CURRENT_DESIRED_CAPABILITIES.get();
desiredCapabilities.setCapability("passed", true);
}
}
显然,问题是我无法在CustomTestListener.java
中引用对象desiredCapabilities
,因为它是在MainSauceLabsClass
中设置的。我的问题是,实施这一计划的最佳方式是什么。要么:
- 在
中以某种方式引用相同的CustomTestListener
对象来调用desiredCapabilities
方法setCapabilities
- 在
中访问MainSauceLabsClass
,并在onTestSuccess
中设置它,以便可以在同一类中引用@AfterMethod
所需的功能
- 替代方案
CustomTestListener.java
中引用对象desiredCapabilities
,因为它是在MainSauceLabsClass
中设置的
由于您的desiredCapabilities
是一个公共静态
变量,因此您可以从CustomTestListener
中“引用”它。e、 g:
public class CustomTestListener implements ITestListener {
// ...
@Override
public void onTestSuccess(ITestResult result) {
MainSauceLabsClass.desiredCapabilities.setCapabilities("passed",true);
}
}
但是,如果在MainSauceLabsClass
中的@before方法
之前调用CustomTestListener.onTestSuccess(ITestResult)
,则您将得到一个NullPointerException
(这可能就是您所说的“无法引用……因为它是在MainSauceLabsClass
中设置的”)
如果您正在尝试存储与每个测试相关联的数据,那么您可以在每个测试及其配置(before/after)方法在各自的线程中运行时使用。然后可以设置并获取当前测试的值。e、 g:
MainSauceLabsClass.java
public class MainSauceLabsClass {
// .....
public static DesiredCapablities desiredCapabilities;
// ....
@BeforeMethod
//set a whole range of parameters for Saucelabs here,e.g.:
desiredCapabilities = DesiredCapabilities.iphone();
desiredCapabilities.setCapabilities("idleTimeout",300);
// etc...
}
public class CustomTestListener implements ITestListener {
// ...
@Override
public void onTestSuccess(ITestResult result) {
// I want to pass to saucelabs pass/fail result via "passed" capability. something like
// desiredCapabilities.setCapabilities("passed",true);
}
}
@Listeners(CustomTestListener.class)
public class MainSauceLabsClass {
public static final ThreadLocal<DesiredCapabilities> CURRENT_DESIRED_CAPABILITIES =
new InheritableThreadLocal<>();
@BeforeMethod
public void setDesiredCapabilities() {
DesiredCapabilities desiredCapabilities = DesiredCapabilities.iphone();
desiredCapabilities.setCapability("idleTimeout", 300);
CURRENT_DESIRED_CAPABILITIES.set(desiredCapabilities);
}
}
public class CustomTestListener implements ITestListener {
// ...
@Override
public void onTestSuccess(ITestResult result) {
DesiredCapabilities desiredCapabilities =
MainSauceLabsClass.CURRENT_DESIRED_CAPABILITIES.get();
desiredCapabilities.setCapability("passed", true);
}
}
您已将DesiredCapabilities对象声明为public和static。那么,是什么阻止您使用该对象,如“MainSauceLabsClass.DesiredCapabilities”?在listener类内部