Selenide+Junit+Maven параллельный запуск

pom.xml
maven
junit
java
selenide
webdriver
Теги: #<Tag:0x00007fedb84e7b60> #<Tag:0x00007fedb84e7a20> #<Tag:0x00007fedb84e78e0> #<Tag:0x00007fedb84e77a0> #<Tag:0x00007fedb84e7638> #<Tag:0x00007fedb84e74f8>

(Gordon Freeman) #1

Всем привет! Тема не новая, нашел только эту Параллельный запуск тестов junit + Maven

В общем создал черновик чтобы отладить процесс и понять как maven-surefire-plugin работает, класс выглядит так:

public class TestThreads {

    @Before
    public void setup() {
        BrowserConfiguration.setUpLocale("chrome", "1400x800", true);
    }

    @Test
    public void test1() {
        open("https://mvnrepository.com/artifact/log4j/log4j/1.2.17");
        $("#maincontent > table > tbody > tr:nth-child(1) > th").waitUntil(Condition.appears, 120000);
        $("#maincontent > table > tbody > tr:nth-child(1) > th").shouldBe(Condition.text("License"));
        assertEquals("Maven Repository: log4j » log4j » 1.2.17", title());
        out.println("test1 Passed");
    }

    @Test
    public void test2() {
        open("https://mvnrepository.com/");
        $("#maincontent > h1").waitUntil(Condition.appears, 120000);
        $("#maincontent > h1").shouldBe(Condition.text("What's New in Maven"));
        assertEquals("Maven Repository: Search/Browse/Explore", title());
        out.println("test2 Passed");
    }

    @Test
    public void test3() {
        open("https://mvnrepository.com/artifact/log4j/log4j/1.2.17");
        $("#maincontent > table > tbody > tr:nth-child(1) > th").waitUntil(Condition.appears, 120000);
        $("#maincontent > table > tbody > tr:nth-child(1) > th").shouldBe(Condition.text("License"));
        assertEquals("Maven Repository: log4j » log4j » 1.2.17", title());
        out.println("test3 Passed");
    }

    @Test
    public void test4() {
        open("https://mvnrepository.com/artifact/log4j/log4j/1.2.17");
        $("#maincontent > table > tbody > tr:nth-child(1) > th").waitUntil(Condition.appears, 120000);
        $("#maincontent > table > tbody > tr:nth-child(1) > th").shouldBe(Condition.text("License"));
        assertEquals("Maven Repository: log4j » log4j » 1.2.17", title());
        out.println("test4 Passed");
    }

    @Test
    public void test5() {
        open("https://mvnrepository.com/");
        $("#maincontent > h1").waitUntil(Condition.appears, 120000);
        $("#maincontent > h1").shouldBe(Condition.text("What's New in Maven"));
        assertEquals("Maven Repository: Search/Browse/Explore", title());
        out.println("test5 Passed");
    }

    @Test
    public void test6() {
        open("https://mvnrepository.com/artifact/log4j/log4j/1.2.17");
        $("#maincontent > table > tbody > tr:nth-child(1) > th").waitUntil(Condition.appears, 120000);
        $("#maincontent > table > tbody > tr:nth-child(1) > th").shouldBe(Condition.text("License"));
        assertEquals("Maven Repository: log4j » log4j » 1.2.17", title());
        out.println("test6 Passed");
    }

    @Test
    public void test7() {
        open("https://mvnrepository.com/artifact/log4j/log4j/1.2.17");
        $("#maincontent > table > tbody > tr:nth-child(1) > th").waitUntil(Condition.appears, 120000);
        $("#maincontent > table > tbody > tr:nth-child(1) > th").shouldBe(Condition.text("License"));
        assertEquals("Maven Repository: log4j » log4j » 1.2.17", title());
        out.println("test7 Passed");
    }

    @Test
    public void test8() {
        open("https://mvnrepository.com/");
        $("#maincontent > h1").waitUntil(Condition.appears, 120000);
        $("#maincontent > h1").shouldBe(Condition.text("What's New in Maven"));
        assertEquals("Maven Repository: Search/Browse/Explore", title());
        out.println("test8 Passed");
    }

    @Test
    public void test9() {
        open("https://mvnrepository.com/artifact/log4j/log4j/1.2.17");
        $("#maincontent > table > tbody > tr:nth-child(1) > th").waitUntil(Condition.appears, 120000);
        $("#maincontent > table > tbody > tr:nth-child(1) > th").shouldBe(Condition.text("License"));
        assertEquals("Maven Repository: log4j » log4j » 1.2.17", title());
        out.println("test9 Passed");
    }}

В pom.xml

<plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-surefire-plugin</artifactId>
                <version>${maven.surefire.plugin}</version>
                <configuration>
                    <forkCount>2</forkCount>
                    <reuseForks>true</reuseForks>
                    <parallel>all</parallel>
                    <threadCount>2</threadCount>
                    <redirectTestOutputToFile>true</redirectTestOutputToFile>
                </configuration>
            </plugin>
        </plugins>

В итоге если из терминала запускать

mvn -Dtest=TestThreads test

То открывется 9 копий браузера, на каждый тест по копии.

Как можно ограничить кол-во запускаемых браузеров, например я хочу только 4 копии ?


(asolntsev) #2

Вопрос, конечно, к селениду не имеет отношения.
Селенид открывает по браузеру на поток. Раз у вас открывается 9 браузеров - значит, тестовые фреймворк запускает 9 потоков. Чтобы было 4 потока, вам нужно поиграться с настройками maven-surefire-plugin (видимо, forkCount и threadCount). Например, threadCount вообще убрать и прописать forkCount=4.


(Gordon Freeman) #3

Попробовал

<forkCount>4</forkCount>
<reuseForks>true</reuseForks>
<parallel>all</parallel>

Получил

[ERROR] Failed to execute goal org.apache.maven.plugins:maven-surefire-plugin:2.22.0:test (default-test) on project WebUIAut
omatedTestingFramework: Use useUnlimitedThreads=true, or only threadCount > 0, or (threadCountSuites > 0 and threadCountClas
ses > 0 and threadCountMethods > 0), or every thread-count is specified, or (threadCount > 0 and threadCountSuites > 0 and t
hreadCountClasses > 0 and threadCount > threadCountSuites + threadCountClasses) for parallel='all' -> [Help 1]

И даже не понятно, что еще из предложенных вариантов надо изменить. Неужели ни у кого не было подобной задачи?!

Меня просто уверяли, что такие параметры (как изначально в pom.xml были) 100% работают…

Еще пробовал просто

<forkCount>4</forkCount>
<reuseForks>true</reuseForks>

Но тогда все тесты выполняются последовательно в 1м браузере.


(asolntsev) #4

Ну так и спросите у тех, кто уверял. :slight_smile:

Можно попробовать наоборот: убрать forkCount и оставить только threadCount=4.


(Dmitry Klymenchuk) #5

Юзал немного другой раннер, для параметризированных тестов, но с ним паралельные тесты работали на ура, может и тебе пригодится:

            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-surefire-plugin</artifactId>
                <version>2.19.1</version>
                <configuration>
                    <systemProperties>
                        <property>
                            <name>maxParallelTestThreads</name>
                            <value>8</value>
                        </property>
                    </systemProperties>
                </configuration>
          </plugin>

Тест выглядел так:

import com.googlecode.junittoolbox.ParallelParameterized;

@RunWith(ParallelParameterized.class)
public class Test {
    //parameter for test
    @Parameterized.Parameter
    public String param;
    @Test
    public void Test () {
...
    }
}

(Gordon Freeman) #6

Спасибо большое! Попробую.
Еще обнаружил, что следующие настройки нормально создают заданное кол-во потоков.

<parallel>all</parallel>
<perCoreThreadCount>true</perCoreThreadCount>
<threadCount>4</threadCount>
<perCoreThreadCount>false</perCoreThreadCount>

И при запуске

mvn -Dtest=TestThreads test

Будет создано ровно 4 потока.


JUnit5 + Maven Параллельный запуск тестов и запуск по тегам