首页 > 解决方案 > 传递一个运行多个不同线程的静态变量 - TestNG

问题描述

我正在使用 TestNG 以使用 Appium 并行运行自动化移动测试。

我在一个类中有一个方法可以启动一个 AppiumDriver 对象。

我从我的 TestNG 类中调用此方法,以便每个线程创建它自己的驱动程序实例。麻烦的是,因为它是一个静态变量,当每个线程尝试通过静态方法从另一个类访问驱动程序时:

总是存在冲突,因为每个线程只能访问 AppiumDriver 对象的单个实现。

我知道我可以通过将所有这些代码放在 TestNG XML 文件与之通信的单个类中来绕过这一点,但这很混乱,我更愿意为不同的功能部分使用单独的类。

例如,我有一个自定义的 TestNG 侦听器,我想在每个测试方法运行后打印每个线程正在使用的驱动程序详细信息。使用以下方法:

但是,这总是打印最后一个运行线程的驱动程序。

我该如何确保从该method is consistent to the driver that was created in the方法返回的驱动程序?

标签: javamultithreadingstatictestngappium

解决方案


如果您正在并行运行测试,那么我们需要使用非静态方法来避免冲突。以上所有方法都需要更改为非静态方法。

您需要如下修改您的侦听器类,它将正确地提供驱动程序详细信息。我们需要从ITestResult

监听代码:

public class ResultsListener implements ISuiteListener, IInvokedMethodListener {

    @Override
    public void afterInvocation(IInvokedMethod method, ITestResult testResult) {

        Object currentClass=testResult.getInstance();
        WebDriver driver = ((AppiumSetUp) currentClass).getDriver();
        System.out.println("Driver details:  " + driver);
     }
}

编辑:

您可以在所有必需的类中扩展 AppiumSetUp 类(至少在 @BeforeTest 方法类中)。因此,您可以直接访问 setup 方法,如下所示。出于示例目的,我将类名添加为BeforeTestSetup

   public class BeforeTestSetup extends AppiumSetUp{


    @BeforeTest(alwaysRun = true)
    @Parameters({"platform", "udid", "chromeDriverPort", "chromeDriverPath", "deviceName"}) 
    public void setUp(String platform, String udid, String chromeDriverPort, @Optional String chromeDriverPath, String deviceName) throws Exception { 

        driver = setUp(platform, udid, chromeDriverPort, deviceName); 
    }

}

推荐阅读