Передача статической переменной с несколькими запущенными потоками - TestNG - PullRequest
0 голосов
/ 05 июля 2018

Я использую TestNG для параллельного запуска автоматических мобильных тестов с использованием Appium.

У меня есть метод в одном классе, который инициирует объект AppiumDriver.

Я вызываю этот метод из своего класса TestNG, чтобы каждый поток создал свой собственный экземпляр драйвера. Проблема в том, что это статическая переменная, когда каждый из потоков пытается получить доступ к драйверу из другого класса статическим методом:

Всегда существуют конфликты, поскольку каждый поток имеет доступ только к одной реализации объекта AppiumDriver.

Я понимаю, что могу обойти это, имея весь этот код в одном классе, с которым общается XML-файл TestNG, но это грязно, и я бы предпочел иметь отдельные классы для разных частей функциональности.

Например, у меня есть пользовательский прослушиватель TestNG, который я хотел бы напечатать сведения о драйвере, который каждый поток использует после каждого метода тестирования. Следующим методом:

Однако, это всегда печатает драйвер последнего запущенного потока.

Как мне обеспечить возвращаемый драйвер методом method is consistent to the driver that was created in the?

1 Ответ

0 голосов
/ 05 июля 2018

Если вы выполняете тест параллельно, тогда нам нужно использовать нестатический метод, чтобы избежать конфликтов. Все вышеперечисленные методы должны быть изменены как нестатические.

Вам необходимо изменить класс прослушивателя, как показано ниже, и он будет правильно предоставлять информацию о драйвере. Нам нужно получить текущий экземпляр класса из 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);
     }
}

Edit:

Вы можете расширить класс AppiumSetUp во всех необходимых классах (по крайней мере, в классе методов @BeforeTest). Таким образом, вы можете напрямую получить доступ к методу настройки, как показано ниже. Для примера я добавил имя класса как 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); 
    }

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...