Параллельные тесты JUnit и Surefire - ForkCount & ThreadCount

Я запускаю тесты Selenium на селеновой сетке, используя плагин Surefire для выполнения тестов. Что касается моего теста, у меня есть несколько классов, некоторые из которых имеют 1 тест и несколько тестов.

Итак, на моей Grid у меня есть 30 хром-веб-драйверов, и я хочу выполнять все тесты внутри всех классов параллельно.

Я читал, как это сделать, используя параметр parallel, который я установил как:

            <plugin>
                <artifactId>maven-surefire-plugin</artifactId>
                <version>2.17</version>
                <configuration>
                    <includes>
                        <include>${testSuite}</include>
                    </includes>
                    <parallel>all</parallel>
                    <useSystemClassLoader>false</useSystemClassLoader>
                    <perCoreThreadCount>false</perCoreThreadCount>
                    <threadCount>20</threadCount>
                    <browser>${browser_type}</browser>
                </configuration>
            </plugin>

Однако это, похоже, не заполняет все доступные мне веб-браузеры Chrome.

Если я затем использовать forkCount, например:

<forkCount>20</forkCount>
<reuseForks>true</reuseForks>

Затем, когда сначала запускается тестовое исполнение, все веб-драйверы заполняются, однако он быстро начинает падать и вести себя по очереди.

Итак, мои вопросы:

  • Есть ли связь между forkCount и threadCount
  • Есть ли что-то дополнительное, что мне нужно сделать, чтобы действительно запустить эту параллельную работу?

Спасибо.

Ответ 1

Вы должны предоставить явный поставщик тестов junit:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-surefire-plugin</artifactId>
    <version>2.18.1</version>
    <dependencies>
        <dependency>
            <groupId>org.apache.maven.surefire</groupId>
            <artifactId>surefire-junit47</artifactId>
            <version>2.18.1</version>
        </dependency>
    </dependencies>
    <configuration>
        <parallel>all</parallel>
        <useUnlimitedThreads>true</useUnlimitedThreads>
        <useSystemClassLoader>false</useSystemClassLoader>
        <includes>
            <include>${testSuite}</include>
        </includes>
        <systemPropertyVariables>
            <browser>${browser_type}</browser>
        </systemPropertyVariables>
     </configuration>
</plugin>

И вы должны использовать JUnit 4.7+, поскольку более старые версии не работают с параллельным тестированием правильно.

Также вы можете опустить параметры, зависящие от fork, если ваши тесты НЕ влияют на время выполнения JVM (обычно это не так).

Или перенесите свои тесты на TestNG - это более элегантная структура, и она работает с параллельным тестированием намного лучше, затем JUnit (imo).

Ответ 2

Существует так много настроек для параллельного запуска теста.

Согласно документации:

forkCount

Параметр forkCount определяет максимальное количество процессов JVM, которые Surefire будет выдавать одновременно для выполнения тестов. Он поддерживает тот же синтаксис, что и -T в maven-core: если вы завершаете значение с помощью C, это значение будет умножаться на количество доступных ядер процессора в вашей системе. Например, forkCount=2.5C в четырехъядерной системе приведет к расширению до десяти параллельных процессов JVM, выполняющих тесты.

...

Значение по умолчанию - forkCount=1/reuseForks=true, что означает, что Surefire создает один новый процесс JVM для выполнения всех тестов в одном модуле maven.

THREADCOUNT

При использовании значений reuseForks=true и forkCount, превышающих один, тестовые классы передаются раздвоенному процессу один за другим. Таким образом, parallel=classes ничего не изменит. Однако вы можете использовать parallel=methods: классы выполняются в forkCount параллельных процессах, каждый из процессов может затем использовать потоки threadCount для одновременного выполнения методов одного класса.

Насколько я понимаю, threadCount похож на подпоточку для каждой вилки.

Вы можете настроить эти параметры, чтобы улучшить производительность теста, например, вы можете:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-surefire-plugin</artifactId>
    <version>2.17</version>
    <configuration>
         <includes>
              <include>${testSuite}</include>
         </includes>
         <parallel>all</parallel>
         <useSystemClassLoader>false</useSystemClassLoader>
         <perCoreThreadCount>false</perCoreThreadCount>
         <forkCount>2.0C</forkCount>
         <reuseForks>true</reuseForks>
         <threadCount>20</threadCount>
         <browser>${browser_type}</browser>
    </configuration>
</plugin>

Вы можете найти более подробную информацию на своем сайте:

https://maven.apache.org/surefire/maven-surefire-plugin/examples/fork-options-and-parallel-execution.html