【问题标题】:How to pass a capabilities object to TestNG ITestlistener (Or reference ItestListener methods inside a class)?如何将功能对象传递给 TestNG ITestlistener(或在类中引用 ItestListener 方法)?
【发布时间】:2016-02-17 06:27:54
【问题描述】:

我们目前正在使用 Selenium、TestNG 和 Saucelabs。我正在尝试覆盖onTestSuccessonTestFailure 侦听器方法,以便我可以根据方法的结果将功能设置为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...
}

CustomTestListener.java

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);
    }
}

显然问题是我无法在CustomTestListener.java 中引用对象desiredCapabilities,因为它设置在MainSauceLabsClass 中。我的问题是实现这一点的最佳方式是什么。要么:

  • 以某种方式在CustomTestListener 中引用相同的desiredCapabilities 对象来调用setCapabilities 方法?
  • MainSauceLabsClass 中访问onTestSuccess 并将其设置在@AfterMethod 中以便可以在同一类中引用desiredCapabilities
  • 替代方案?

如果需要,很乐意提供更多信息。感谢您的帮助。

【问题讨论】:

  • 您已将您的 DesiredCapabilities 对象声明为 public 和 static..那么是什么阻止您使用像“MainSauceLabsClass.desiredCapabilities”这样的对象?在监听器类中

标签: java selenium listener testng saucelabs


【解决方案1】:

显然问题是我无法在CustomTestListener.java 中引用对象desiredCapabilities,因为它设置在MainSauceLabsClass 中。

由于Mrunal Gosar points out 您的desiredCapabilities 是一个public static 变量,因此您可以从CustomTestListener“引用”它。例如:

public class CustomTestListener implements ITestListener {
    // ...
    @Override
    public void onTestSuccess(ITestResult result) {
        MainSauceLabsClass.desiredCapabilities.setCapabilities("passed",true);
    }
}

但是,如果在MainSauceLabsClass 中的@BeforeMethod 之前调用CustomTestListener.onTestSuccess(ITestResult),那么您将得到一个NullPointerException(这可能是您所说的“无法引用......因为它设置在@ 987654335@")。

如果您尝试存储与每个测试关联的数据,那么您可以使用ThreadLocal<T>,因为每个测试及其配置(之前/之后)方法都在各自的线程中运行。然后,您可以设置和获取当前测试的值。例如:

MainSauceLabsClass.java

@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);
    }
}

CustomTestListener.java

public class CustomTestListener implements ITestListener {
    // ...
    @Override
    public void onTestSuccess(ITestResult result) {
        DesiredCapabilities desiredCapabilities =
                MainSauceLabsClass.CURRENT_DESIRED_CAPABILITIES.get();
        desiredCapabilities.setCapability("passed", true);
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-08
    • 2022-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多