Есть отличная удаленная работа для php+codeception+jenkins+allure+docker спецов. 100% remote! Присоединиться к проекту

Параллельный запуск тестов WebDriver + Maven + TestNG


(Alexey Panashchenko) #1

Привет всем!

Хочу настроить параллельный запуск тестов через TestNG, пробывал вот так  но в результате, запускается два браузера, но тесты проходят только в одном, во втором ничего не происходит(

Можете скинуть пример или кусок кода как правильно запускать тесты с вот таким сьютом:

<suite  name="UC 1 - Login/Setup Profile" verbose="1" parallel="tests" thread-count="2>
 
    <test name="UC 1.2 - Trainee Login">
        <classes>
            <class name="com.company.LoginTests"/>
        </classes>
    </test>
 
    <test name="UC 1.8 - Verify Info">
        <classes>
            <class name="com.company.VerifyInfoTests"/>
        </classes>
    </test>
 
   <test name="UC 1.10 - Web Set Password/Info/Photo">
       <classes>
            <class name="com.company.TraineeSetUpProfileTests"/>
        </classes>
   </test>
 
</suite>

(asolntsev) #2

Здесь-то всё правильно.

Вопрос в том, как вы создаётся WebDriver и передаётся его в тесты. Пришлите и этот кусочек кода?


(Alexey Panashchenko) #3

Там написан фреймворк, может немного запута но постараюсь обьяснить)

Есть класс ApplicationManager  он управляет запуском.

Сам драйвер создается так в конструтор класса WebDriverHelper  мы передаем инстанс  ApplicationManager  с выбраными пропертями для запуска (там ест ьпару обреток но не обращайте на них внимания, я пробывал и бзз них тот же результат):

public class WebDriverHelper implements BaseDataProvider {
 
    private static WebDriver driver;
    private StringBuffer verificationErrors = new StringBuffer();
    private final ApplicationManager manager;
 
    /**Init WebDriver*/
    public WebDriverHelper(ApplicationManager manager) {
        String browser = ApplicationManager.getBrowserType();
        switch (BrowserTypes.valueOf(browser)) {
            case FIREFOX: initLocalFireFox();
                break;
            case CHROME: initLocalChrome();
                break;
        }
        this.manager = manager;
 
private void initLocalChrome() {
        DesiredCapabilities capabilChrome = DesiredCapabilities.chrome();
        capabilChrome.setCapability("nativeEvents", true);
        driver = new CustomEventFiringWebDriver(new TracingWebDriver(new ChromeDriver(capabilChrome)));
        ((CustomEventFiringWebDriver) driver).register(new ActionListener(driver));
        driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
        driver.manage().window().maximize();
        driver.get(ApplicationManager.getServerSite());
    }
}
 
 
Класс-родитель для всех пейджей с методами WebDriver
 
public class BaseWebDriverHelper implements WebDriverBaseDataProviders {
 
    protected final ApplicationManager manager;
    private WebDriver driver;
 
    public BaseWebDriverHelper(ApplicationManager manager) {
        this.manager = manager;
        driver = manager.getWebDriverHelper().getDriver();
        PageFactory.initElements(new HtmlElementDecorator(driver), this);
    }
 
и потом все классы страниц наследуются от BaseWebDriverHelper, вот как то так))

 


(Sergey Korol) #4

private static WebDriver driver;

Распространенная ошибка. TestNG запускает тесты в параллельных потоках. Из определения статической переменной можно узнать то, что это переменные класса, а не его инстанса. Т.е. вы пытаетесь распараллелить то, что существует в единственном экземпляре. По факту картина вырисовывается следующая: вы запускаете 2 теста в параллельном режиме; оба создают инстанс драйвера, в этот же момент открывается 2 браузера; но исходя из статичности драйвера, он будет всегда хранить настройки последнего созданного экземпляра, направляя команды соответствующему браузеру. Избавьтесь от статики и будет вам счастье.


(Alexey Panashchenko) #5

Хорошо, я попробую и отпишусь))


(Alexey Panashchenko) #6

Избавлися от статики, но все равно, запускается два браузера и все действия выполняются в том, который запушен вторым(


(Sergey Korol) #7

Значит не везде избавились от статики. Покажите геттеры для хелпера и драйвера. А еще интересует процедура создания инстанса драйвера. Вы ведь в пейдж обджекты передаете уже созданный инстанс. В общем, нужно также увидеть код, связывающий пейдж обджекты с драйвером.


(Alexey Panashchenko) #8

Я написал в личку


(Alexey Panashchenko) #9

Вот репозиторий с проэктом


(vmaximv) #10

 

Я бы Вам посоветовал плюнуть пока на параллельный запуск, и заняться рефакторингом пока не поздно: у вас такой спаггети-код, мама не горюй, думаю и 0.5 будет маловато, что бы разобраться :)


(Alexey Panashchenko) #11

Ну так любой может написать, лучше бы сделали форк и добавили свои коменты, а не умничали тут.


(vmaximv) #12

Я не умничаю - просто даю совет.

На деле там работы не мало. Уберите филд  private static ApplicationManager applicationManager - увидите.


(Alexey Panashchenko) #13

Там есть ветка dev,  я в ней пробывал через ThreadLocal сделать сделал ThreadLocal<ApplicationManager> н овсе равно бока(


(vmaximv) #14

В WebDriverHelper статик у WebDriver уберите


(Alexey Panashchenko) #15

Уже все заработало, огромное спасибо ArtOfLife!!!


(Александр Таранков) #16

Я переместил(а) сообщение в новую тему: Как распараллелить работу тестов?