Подтвердить что ты не робот

Плагин Maven surefire запускает тесты с использованием нескольких потоков?

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

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

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

4b9b3361

Ответ 1

По умолчанию 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")); 

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

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

Ответ 2

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

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

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

Ответ 3

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

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

<forkMode> всегда </forkMode>

Ответ 4

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

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