Параллельные тесты 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