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

Проблемы при настройке параллельного запуска тестов с помощью maven-surefire плагина

maven-surefire-plugin
parallel
maven
junit
java
Теги: #<Tag:0x00007f7b644710d0> #<Tag:0x00007f7b64470f40> #<Tag:0x00007f7b64470dd8> #<Tag:0x00007f7b64470bf8> #<Tag:0x00007f7b64470a18>

(Irina Kotovich) #1

Доброго времени суток, коллеги!
Столкнулась с проблемой во время оптимизации тестов, надеюсь что кто-то сможет помочь советом, возможно кому-то уже приходилось с таким сталкиваться.
Суть следующая: есть большой проект, очень много тестов, разбитых по классам, в итоге имею примерно 10 классов в которых от 2-15 тестов. Появилась проблема в длительном выполнении.
Решила попробовать оптимизировать при помощи плагинов maven, потому что с его помощью сейчас организован запуск. Нашла плагин который называется maven-surefire-plugin . В нем есть такой параметр как parallel и настройки all, classes, methods, threadCount, threadCountClasses, threadCountMethods…
оф. документация плагина http://maven.apache.org/surefire/maven-surefire-plugin/test-mojo.html
Пробовала много вариантов, по методам, по классам, по методам и классам.
Но каждый раз я сталкивалась с одной и той же проблемой - создается намного больше потоков чем я указываю.
Например я указываю распараллелить по методам (это в моем случае был бы лучший вариант, потому что по классам не будет такого эффекта, так как в одном классе может быть 1-2 теста в другом 15)
Я настраиваю запуск так

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

Пробовала с параметром threadCountMethods, аналогично и с классами…
Использую Junit 4.12
Но каждый раз запускается не 4 экземпляра, а штук 12. Компьютер виснет и ни о каком ускорении тестов естественно не идет и речи…
Не могу понять что я делаю не так, что я упускаю? возможно я не так поняла принцип? Почему запускается такое большое количество тестов?
Если кто-то сталкивался с таким помогите пожалуйста разобраться!
Заранее спасибо!!


(Дмитрий Кравчук) #2

Я сталкивался с похожей проблемой. Не могу сказать, что ваша проблема идентична моей.
При вот таких настройках:

<configuration>
<perCoreThreadCount>false</perCoreThreadCount>
<parallel>methods</parallel>
<threadCount>6</threadCount>
</configuration>

Запуск тестов через maven test приводил запуску порядка 15 экземпляров хрома(в моем случае). При этом пока не отрабатывали все 15 запущенных тестовых метода, следующие методы не запускались. Т.е. тесты отрабатывали пачками по 15 в параллели. Параллельный запуск по методам у меня так и не получился.
Позже выяснилось, что параллельный запуск по методам не допустим для тестируемого приложения. В итоге я пришел к такой настройке:

<configuration>
<perCoreThreadCount>false</perCoreThreadCount>
<parallel>classes</parallel>
<threadCount>8</threadCount>
</configuration>

Если у вас эта проблема еще актуальна, попробуйте параллельный запуск по классам в один поток.


#3

А threadCountMethods не пробовали?

If your tests specify any value for the parallel attribute and your project uses JUnit 4.7+, your request will be routed to the concurrent JUnit provider, which uses the JUnit JUnitCore test runner.

This is particularly useful for slow tests that can have high concurrency.

As of Surefire 2.7, no additional dependencies are needed to use the full set of options with parallel. As of Surefire 2.16, new thread-count attributes are introduced, namely threadCountSuites, threadCountClasses and threadCountMethods

http://maven.apache.org/surefire/maven-surefire-plugin/examples/junit.html


(Irina Kotovich) #4

Пробовала threadCountMethods , но результат был такой же.


(Irina Kotovich) #5

Да, я пробовала распараллелить так же как и у вас, но у меня не получилось. По методам. Когда пробовала по классам у меня так же создавалось намного больше экземпляров чем я указывала.
Потом мне посоветовали попробовать форки. Это по сути то же распараллеливание по классам.
В итоге pom файл у меня стал выглядеть след. образом

<forkCount>5</forkCount>
<reuseForks>false</reuseForks>
<skip>false</skip>

И тогда получилось что у меня запусккается по 5 экземпляров. Но к сожалению это все жже по классам. Хотелось по методам, но пока это самый подходящий вариант


#6

Хм, у меня работает распараллеливание по методам:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-surefire-plugin</artifactId>
    <version>2.19.1</version>
    <configuration>
        <parallel>methods</parallel>
        <threadCount>3</threadCount>
    </configuration>
</plugin>

Но важно чтобі класс содержащий методі аннотированніе @Test не наследовался от JUnit класса TestCase

В этом случае у меня, как и ожидается, не запускается больше 3 (см. віше значение threadCount) браузеров.


(Jet Free) #7

Июнь 2018, проблема всё ещё актуальна, если кто нибудь найдёт решение или причину по которой именно так происходит. Напишите обязательно.

Стэк: Serenity, Junit.


#8

a v chem imenno problema s serenity?

kak naschet mechanizma serenity: http://thucydides.info/docs/serenity-staging/#_running_serenity_tests_in_parallel_batches ?


(Gordon Freeman) #9

Аналогично, взял простой класс для примера, в нем

@Test
@Test
@Test
@Test
@Test
@Test
@Test
@Test
@Test

Запускаю из консоли:
mvn -Dtest=TestThreads test -Dthreads=4 - открывается 9 окон
mvn -Dtest=TestThreads test -Dthreads=1 - открывается 9 окон
mvn -Dtest=TestThreads test - открывается 9 окон

Хотя в pom.xml стоит

<parallel>methods</parallel>
<threadCount>1</threadCount>

#10

В serenity или нет? А то тут уже все в кучу пошло :slight_smile:

Без serenity у меня работало: http://olyv-qa.blogspot.com/2017/04/run-junit-tests-in-parallel-using-maven.html

В serenity я пользовался только serenity-cucmber и там авторы фреймворка утверждают что параллелизм работает через threadCoint и работает только для junit. Хотя в serenity-cucmber тоже можно запускать параллельно тесты, только делать это приходится через forks, что является более ресурсоемким подходом


(Gordon Freeman) #11

Ой нет, извиняюсь. У меня Selenide+Junit+Maven


#12

За selenide не скажу, не знаю что там понакручено :smiley: