在运行多个不同线程的情况下传递静态变量-TestNG

时间:2018-07-05 15:28:58

标签: java multithreading static testng appium

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

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

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

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

我知道我可以通过将所有这些代码放在与TestNG XML文件进行通信的单个类中来绕过此操作,但这很麻烦,我更愿意为功能的不同部分使用单独的类。

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

但是,这始终会打印出最后一个正在运行的线程的驱动程序。

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

1 个答案:

答案 0 :(得分:1)

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

您需要按如下所示修改您的侦听器类,它将正确提供驱动程序详细信息。我们需要从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);
     }
}

编辑:

您可以在所有必需的类(至少@BeforeTest方法类中)中扩展AppiumSetUp类。因此,您可以直接访问以下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); 
    }

}