Запустите тест maven параллельно, не дожидаясь зависимостей родственного модуля

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

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

Мой вопрос: учитывая, что мои модули уже скомпилированы, могу ли я сказать maven, чтобы они запускали тесты параллельно, используя эти предварительно скомпилированные классы, и не ждали, пока зависимые модули сначала запустят свои тесты? Например. в настоящее время, если у меня есть модуль A, зависящий от модуля B, модуль B сначала выполнит все свои тесты, прежде чем A сможет запуститься. Поскольку у меня уже есть A и B, мне не нужно сохранять это ограничение.

В настоящее время я запускаю тесты примерно так: mvn -f project-parent/pom.xml surefire:test где родительский проект — это модуль, являющийся родительским для всех моих других модулей. Я опустил профили и другие параметры для краткости.

Спасибо!

Изменить: на данный момент я пытаюсь избежать параллелизации на уровне класса/набора, используя junit или surefire, и просто хотел бы тестировать модули параллельно.


person Alex A    schedule 28.07.2020    source источник
comment
Почему вы сначала создаете свои модули, прежде чем запускать тесты? Почему бы просто не построить все с помощью mvn clean install?   -  person J Fabian Meier    schedule 28.07.2020
comment
@JFabianMeier Я делаю что-то вроде чистой установки, но сначала пропускаю тесты, чтобы потом запускать тесты параллельно с другими инструментами анализа кода.   -  person Alex A    schedule 28.07.2020
comment
Если они сильно зависят друг от друга, либо реорганизуйте зависимые биты, либо удалите зависимости, если они не используются. Как вы уже сказали, стремление парализовать сборку реактора, которая по сути является List, а не несколько сбалансированной Tree, не работает.   -  person Glains    schedule 02.08.2020
comment
Это фича, а не баг. Если модуль B не проходит тесты, модуль A, вероятно, также не пройдет тесты, потому что модуль B не работает. У вас будет дополнительный шум в результатах теста, который может затруднить вам или вашей команде определение истинной проблемы.   -  person John Brandli    schedule 06.08.2020
comment
@JohnBrandli полностью понятно, и я уверен, что это полезно во многих сценариях, но можно ли это отключить? :)   -  person Alex A    schedule 03.09.2020


Ответы (2)


Child тесты могут пройти, но Parent тесты не пройдены. Это может быть связано с тем, что Child требует Parent, но большинство его тестов имитируют Parent в предположении, что это работает! Если это произойдет параллельно и вне последовательности, я не думаю, что Maven знает, что делать. Вы надеетесь, что Maven может быть целым конвейером CI, когда на самом деле это просто инструмент сборки.

Однако:

Если ваши тесты достаточно медленные, чтобы вы могли поднять этот вопрос, то это могут быть интеграционные тесты, которые можно извлечь в новые модули (<module>-tests).

A -> A-tests
A -> B
     B -> B-tests
     B -> C
          C -> C-tests

Это означает, что A, B и C src/test/* выполняются быстро и могут выполняться как обычно, а более медленные <module>-tests не зависят друг от друга, что означает, что Maven может распараллелить их только с помощью mvn test -TC.

person drekbour    schedule 03.08.2020

Если вам это абсолютно необходимо, вы также можете использовать свойство maven.test.skip, чтобы пропустить компиляцию тестов. maven.test.skip отмечен Surefire, Failsafe и плагином Compiler.

   mvn -T 8 -f project-parent/pom.xml surefire:test -Dmaven.test.skip=true
person Kavithakaran Kanapathippillai    schedule 30.07.2020
comment
Ну, все дело в том, чтобы не пропускать тесты :) Я хочу запустить их, но не дожидаясь, пока зависимые модули сначала запустят свои тесты. Хотя, возможно, я неправильно интерпретирую ваш ответ. Если я это сделаю, будут ли мои тесты выполняться параллельно, не заботясь о межмодульных зависимостях? - person Alex A; 31.07.2020
comment
Ваше требование: не компилировать и запускать тесты параллельно. Работают ли все 8 потоков над одним и тем же модулем или над разными модулями, не имеет значения, поскольку работа, выполняемая 8 потоками, одинакова. - person Kavithakaran Kanapathippillai; 31.07.2020
comment
Насколько я понимаю (и тестировал), конфигурация параметра -T, описанная выше, никогда не будет собирать/тестировать один модуль на 8 потоках, это позволит создавать независимые модули/модули с уже заполненными зависимостями, по 1 на поток. Согласно: cwiki.apache.org/confluence/display /MAVEN/, где указано: Этот режим сборки анализирует граф зависимостей вашего проекта и планирует модули, которые можно собирать параллельно, в соответствии с графом зависимостей вашего проекта. - person Alex A; 31.07.2020