Плагин Maven surefire запускает тесты, используя несколько потоков? - PullRequest
16 голосов
/ 18 февраля 2010

Мне интересно, если плагин Maven surefire запускает тесты многопоточными по умолчанию (и если да, то можно ли контролировать количество потоков?) Или он запускает тесты из классов Test в случайном или предсказуемом порядке, или если порядок может быть продиктован каким-то образом.

Я еще не проверил это (я сделаю это завтра, просто посмотрев несколько советов и проверок на данный момент), но похоже, что мои различные классы JUnit Test запускают тесты в некотором смешанном порядке , Что делает реальную боль организовывать создание тестовых ресурсов (которые в моем случае довольно здоровенные).

Вероятно, это классическая проблема: я запускаю свой пакет с Eclipse JUnit Runner, и все работает очень линейно и играет хорошо. Я перехожу на линию Maven cmd, и кажется, что все пересекается.

Ответы [ 4 ]

13 голосов
/ 18 февраля 2010

По умолчанию Maven запускает ваши тесты в отдельном («разветвленном») процессе, ничего более (это можно контролировать с помощью необязательного параметра forkMode).

Если вы используете TestNG или Junit 4.7+ (начиная с SUREFIRE-555 ), можно запускать тесты параллельно (см. parallel и threadCount (необязательные параметры), но это не значение по умолчанию.

Теперь, хотя я не уверен, что плагин surefire ведет себя так же, как JUnit, можно получить некоторый контроль, вручную создав TestSuite и указав порядок, в котором выполняются тесты:

TestSuite suite= new TestSuite();
suite.addTest(new MathTest("testAdd"));
suite.addTest(new MathTest("testDivideByZero")); 

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

P.S .: На всякий случай есть также этот запрос SUREFIRE-321 (для запуска тестов в алфавитном порядке), за который вы, возможно, захотите проголосовать.

3 голосов
/ 18 февраля 2010

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

Порядок выполнения определенно не случайный, хотя в JUnit он имеет тенденцию быть таким же (я бы предположил алфавитный порядок), но вы не должны строить на нем - он может измениться в любое время в Surefire порядок другой.

Вот хорошая ссылка о том, почему взаимодействующие тесты не очень хорошая идея.

2 голосов
/ 02 марта 2010

JUnit запускает тесты в порядке их появления в файле .java (не в алфавитном порядке).Maven-surefire запускает их в другом порядке, но не предсказуемо (насколько я могу судить).

В идеале тесты должны быть независимы друг от друга, но одиночные события и статический контекст могут усложнять ситуацию.Полезный способ получить новые статические контексты между выполнениями отдельных TestCase (но не отдельных тестов) - это установить переменную forkMode в вашем pom.xml ..

всегда

0 голосов
/ 07 июля 2015

Я обнаружил, что если вы используете опцию -T в своей команде maven, то Surefire затем преобразуется в forkCount * <specified number of threads by the -T option> число одновременных процессов.

Чтобы все они выполнялись в одном процессе, несмотря на наличие нескольких потоков, указанных в -T, вы можете установить для forkCount значение 0, добавив параметр -Dsurefire.forkCount = 0

...