Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/340.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 通过运行多个不同线程传递静态变量-TestNG_Java_Multithreading_Static_Testng_Appium - Fatal编程技术网

Java 通过运行多个不同线程传递静态变量-TestNG

Java 通过运行多个不同线程传递静态变量-TestNG,java,multithreading,static,testng,appium,Java,Multithreading,Static,Testng,Appium,我使用TestNG是为了使用Appium并行运行自动移动测试 我在一个类中有一个方法,用于启动AppiumDriver对象 我从TestNG类调用这个方法,以便每个线程创建自己的驱动程序实例。问题是,因为它是一个静态变量,当每个线程试图通过静态方法从另一个类访问驱动程序时: 始终存在冲突,因为每个线程只能访问AppiumDriver对象的单个实现 我知道我可以通过将所有这些代码放在TestNG XML文件通信的单个类中来绕过这一点,但这很混乱,我更喜欢为功能的不同部分使用单独的类 例如,我有一个

我使用TestNG是为了使用Appium并行运行自动移动测试

我在一个类中有一个方法,用于启动AppiumDriver对象

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

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

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

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

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


如何确保从
方法返回的驱动程序与在
方法中创建的驱动程序一致?

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

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

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 method类中)扩展AppiumSetUp类。因此,您可以直接访问下面的安装方法。出于示例目的,我将类名添加为
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); 
    }

}

我不知道为什么它是静态的,但是考虑一个<代码>地图驱动程序< /代码>,其中<代码>配置包含<代码>平台< /代码>,<代码> uDID等。
将以前设置的驱动程序从映射中删除。虽然这有助于获取每个线程的驱动程序详细信息,但仍会导致线程在执行过程中使用错误的驱动程序。我不确定是否遵循此操作。您正在强制转换设置对象吗?在我的例子中这是AppiumSetUp吗?在你的例子中这是AppiumSetUp。我已经更新了答案谢谢。问题是我需要setUp方法保持静态,因为它是从我的TestNg类调用来创建AppiumDriverLike so@BeforeTest(alwaysRun=true)@Parameters({“platform”、“udid”、“chromeDriverPort”、“chromeDriverPath”、“deviceName”})public void设置的(String platform,String udid,String chromeDriverPort,@Optional String chromeDriverPath,String deviceName)抛出异常{driver=AppiumSetUp(platform,udid,chromeDriverPort,deviceName);}我已经编辑了答案并添加了@BeforeTest方法