Параллельное выполнение тестов junits для максимизации производительности через jenkins / intellij - PullRequest
0 голосов
/ 25 апреля 2019

У меня есть проект, который содержит около 50 тестов Junit.Каждый тест занимает около 5-6 минут, так как он пытается утвердить некоторые данные, которые требуют примерно того времени, чтобы быть доступными в красном смещении (тест ищет данные в красном смещении).Теперь я пытаюсь запустить их все параллельно и ожидаю, что все тесты будут выполнены максимум через 15-20 минут.Я пытался использовать параметр test.runWith () {maxParallelForks}, но тестирование занимает больше часа.Эти тесты все независимы.Есть ли эффективный способ их распараллеливания?

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

Спасибо

Вот что я использую:

tasks.withType(Test) {
    maxParallelForks = 50
}

Наше ограничение заключается в том, чтобы заставить их работать максимум через 20-25 минут, но это займет больше часа.

1 Ответ

0 голосов
/ 25 апреля 2019
  1. Создайте файл с именем junit-platform.properties в папке test/resources со следующими данными:
junit.jupiter.execution.parallel.enabled=false
junit.jupiter.execution.parallel.config.strategy=fixed
junit.jupiter.execution.parallel.config.fixed.parallelism=4

У меня 4 ядра (без гиперпоточности).Вы также можете попробовать опцию dynamic.

Аннотируйте свой класс с помощью @Execution(ExecutionMode.CONCURRENT)

Вот отличная статья по теме.Также один здесь .

Я также экспериментировал с параллельным выполнением теста и сделал следующие выводы:

  • Если тесты короткие (не так, как в вашем случае, хотя), это того не стоит.При работе с короткими тестами попытка настроить всю многопоточную среду тестирования и последующее переключение контекста не привели к увеличению производительности.(У меня было около 150+ юнит-тестов)
  • При работе со Spring тесты должны быть настроены правильно.Когда вы запускаете контейнеры параллельно, они не должны пытаться использовать один и тот же порт и т. Д. Также вы должны знать о кешировании контекста.(Даже если для теста B не требовался компонент XYZ, я попросил Spring его инициализировать, и затем он понял, что тест A уже имел ту же конфигурацию, поэтому контекст, использованный повторно, привел к значительному увеличению производительности, чем два разныхконтейнеры, начинающиеся в нескольких потоках.)
  • Если ваши тесты содержат код (как в вашем случае), где вы «ожидаете» событие, чтобы завершить тест, используйте несколько потоков.
  • Наконец: «Звучит хорошо, не работает».- На моей локальной машине параллельное выполнение привело к некоторому увеличению производительности (IntelliJ, maven), но на нашем CI-сервере у нас есть одно виртуальное ядро, и запрос на фиксированные 4 потока привел к значительному падению производительности.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...