如何将功能对象传递给TestNG ITestlistener(或者在类中引用ItestListener方法)?

时间:2016-02-17 06:27:55

标签: java selenium listener testng saucelabs

我们目前正在使用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);
    }
}

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

  • 以某种方式引用desiredCapabilities内的同一个CustomTestListener对象来调用setCapabilities方法?
  • onTestSuccess内访问MainSauceLabsClass并将其设置为@AfterMethod,以便在同一课程中引用desiredCapabilities
  • 替代?

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

1 个答案:

答案 0 :(得分:0)

  

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

作为Mrunal Gosar points outdesiredCapabilitiespublic static变量,因此您可以从CustomTestListener“引用”它。 e.g:

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

但是,如果在CustomTestListener.onTestSuccess(ITestResult)中的@BeforeMethod之前调用MainSauceLabsClass,那么您将获得NullPointerException(这可能是您的意思“无法参考......因为它设置在MainSauceLabsClass“)内。

如果你要做的是存储与每个测试相关的数据,那么你可以使用ThreadLocal<T>作为每个测试,并在其自己的线程中运行其配置(之前/之后)方法。然后,您可以设置并获取当前测试的值。 e.g:

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