Удаленка для jenkins+selenide+selenoid+allure+docker спецов на 2-3 часа в день. 100% remote! Присоединиться к проекту

Помогите с параллелизацией тестов Maven + TestNG

maven
testng
parallel
execution
webdriver
java
maven-surefire-plugin
Теги: #<Tag:0x00007fedb9ddd638> #<Tag:0x00007fedb9ddd4a8> #<Tag:0x00007fedb9ddd368> #<Tag:0x00007fedb9ddd228> #<Tag:0x00007fedb9ddd098> #<Tag:0x00007fedb9ddcd78> #<Tag:0x00007fedb9ddcc10>

#1

Здравствуйте, я уже весь запарился. Как правильно настроить параллелизацию.

Имею такой Pom.xml

  <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-surefire-plugin</artifactId>
                <version>2.20.1</version>
   <configuration>
                    <forkMode>perthread</forkMode>
                    <threadCount>4</threadCount>
                    <parallel>methods</parallel>
                    <!--  <testFailureIgnore>true</testFailureIgnore> -->
                    <groups>${groups}</groups>
                    <!--<suiteXmlFiles>${fileTestNGSuite}</suiteXmlFiles>-->
                    <skipTests>false</skipTests>
                    <argLine>
                        -javaagent:"${settings.localRepository}/org/aspectj/aspectjweaver/${aspectj.version}/aspectjweaver-${aspectj.version}.jar"
                    </argLine>


                    <!--<threadCount>4</threadCount>-->
                </configuration>

Пробовал уже все возможные варианты в forMode, threadCount, parallel, forkCount.
Изнрачально было :

 <configuration>

                    <parallel>methods</parallel>
                    <threadCount>4</threadCount> 
 </configuration>

Но у драйвера было очень странное поведение. Хоть и тесты запускались в отдельных контейнерах. Но они все равно как-то взаимодействовали друг с другом т.к ексепшены выпадали как будто 1 тест смотрит в окно другого.

Драйвер создаю вот так:

  private static WebDriver driver;
    public static String BROWSER = System.getProperty("browser");
    private static WebDriverEventListener events = new WebDriverEventHandler();
  private static ThreadLocal<WebDriver> webDriver= new ThreadLocal<>();

    public static void setupDriver(String browser) throws MalformedURLException {
        if (BROWSER == null) {
            BROWSER = browser;
        }
        URL url = new URL("http://url:4444/wd/hub");

        if (browser.equalsIgnoreCase(CHROME)) {
            System.setProperty("webdriver.chrome.driver", CHROME_DRIVER_PATH);
            DesiredCapabilities cap = DesiredCapabilities.chrome();
            cap.setBrowserName("chrome");
            cap.setVersion("63.0");
            cap.setCapability("enableVNC", true);
            cap.setCapability("enableVideo", true);

            driver = new EventFiringWebDriver(new RemoteWebDriver(url,cap)).register(events);
            webDriver.set(driver);

Везде к драйверу обращаюсь через этот метод :

public static WebDriver getDriver() {
    return webDriver.get();
}
 Сам драйвер создаю в @BeforeMethod в классе от которого потом наследуются классы с тестами.

Тесты запускаю командой mvn clean test -Dgroups=auth

Так же переносил обьявление вебрдрайвера в метод setupDriver, где убирал у него статику.

(Ruslan Semerenko) #2

Поле events является общим для всех потоков. Видимо на этом уровне у вас проявляется мешанина. В остальном же параллельность должна работать.


(Igno) #3

Тебе нужен тест-сьют c параметром parallel который хранится внутри xml-файла в корне проекта:
http://testng.org/doc/documentation-main.html#testng-xml


#4

это тоже самое что запускать из под мавена без testng.xml


#5

перетянул внуть setupDriver всё еще не помогло


#6

Повыводил потоки и хеши браузеров. Вроде все разные но все равно какая-то не понятная зависимость у тестов. Если в одном контейнере вспылвающее окно уже закрыто то в другом контейнере драйвер говорит что окно уже закрыто и ничего с этим поделать не может.


(Mr Ds Low) #7

Разве речь не про конфиг в TestNG с параллельностью идет?


(Ruslan Semerenko) #8

Я все еще думаю, что проблема в events. Покажите код после модификации.


#9
public static String BROWSER = System.getProperty("browser");

  //  private static ThreadLocal webDriver= new ThreadLocal<RemoteWebDriver>();
  private static ThreadLocal<WebDriver> webDriver= new ThreadLocal<>();

    public static WebDriver setupDriver(String browser) throws MalformedURLException {
        WebDriverEventListener events = new WebDriverEventHandler();
       WebDriver driver=null;
        if (BROWSER == null) {
            BROWSER = browser;
        }
        URL url = new URL("http://url:4444/wd/hub");

        if (browser.equalsIgnoreCase(CHROME)) {
            System.setProperty("webdriver.chrome.driver", CHROME_DRIVER_PATH);
            DesiredCapabilities cap = DesiredCapabilities.chrome();
            cap.setBrowserName("chrome");
            // cap.setPlatform(Platform.WINDOWS);
            cap.setVersion("63.0");
            cap.setCapability("enableVNC", true);
            cap.setCapability("enableVideo", true);

            driver = new EventFiringWebDriver(new RemoteWebDriver(url,cap)).register(events);
return driver;

(Ruslan Semerenko) #10

Да, я не прав.
Есть еще подозрение на поле driver. Возможно где-то драйвер берется не через метод getDriver(), а напрямую через поле driver, а оно указывает на последний созданный вебдрайвер. Попробуйте отследить, используется ли это поле где-то, а лучше его вообще затащить внутрь, как и events.


#11

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