Ответ 1
По состоянию на 6 сентября 2015 года он появляется там, -Dsurefire.skipAfterFailureCount=1
.
По состоянию на 19 октября 2015 года версия 2.19 была выпущена.
В настоящее время я работаю над проектом java с использованием maven. Мы используем плагин maven surefire для запуска нашего пакета junit как часть процесса сборки.
Наш тестовый пакет быстро растет как по охвату, так и по времени выполнения. Время выполнения очень расстраивает и занимает много времени, когда вы в ожидании десяти минут, чтобы узнать, что тест не прошел в первую минуту тестирования.
Я хотел бы найти способ сделать процесс сборки неудачным при первой ошибке/ошибке в наборе тестов. Я знаю, что это возможно для других инструментов сборки, но я не смог найти способ сделать это с помощью maven surefire.
Я знаю, что есть неразрешенный билет для этой функции в surefire jira, но я надеюсь, что для этого существует существующее решение.
По состоянию на 6 сентября 2015 года он появляется там, -Dsurefire.skipAfterFailureCount=1
.
По состоянию на 19 октября 2015 года версия 2.19 была выпущена.
Насколько я знаю, нет, и это действительно требует разрешения SUREFIRE-580. Если вы хотите, чтобы это произошло быстрее, вы должны хотя бы проголосовать за эту проблему и, необязательно, отправить патч;)
Может быть подходящий обходной путь, но это зависит от ваших требований, и вам нужно использовать сервер CI, который может обрабатывать коды возврата jvm.
Основная идея состоит в том, чтобы полностью остановить процесс Maven JVM и позволить ОС знать, что процесс неожиданно остановился. Затем сервер непрерывной интеграции, такой как Jenkins/Hudson , должен иметь возможность проверить ненужный код выхода и сообщить вам, что тест не сработал.
Первым шагом является обеспечение выхода из JVM при первом сбое теста. Вы можете сделать это с помощью JUnit 4.7 или выше, используя пользовательский RunListener
(поместите его в src/test/java):
package org.example
import org.junit.runner.notification.Failure;
import org.junit.runner.notification.RunListener;
public class FailFastListener extends RunListener {
public void testFailure(Failure failure) throws Exception {
System.err.println("FAILURE: " + failure);
System.exit(-1);
}
}
Затем вам нужно настроить этот класс, чтобы surefire зарегистрировал его с помощью JUnit 4 Runner. Измените свой pom.xml
и добавьте свойство конфигурации listener
в maven-surefire-plugin. Вам также необходимо настроить surefire, чтобы не разблокировать новый процесс JVM для выполнения тестов. В противном случае, это будет продолжаться со следующими тестовыми примерами.
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.10</version>
<configuration>
<forkMode>never</forkMode>
<properties>
<property>
<name>listener</name>
<value>org.example.FailFastListener</value>
</property>
</properties>
</configuration>
</plugin>
Если это не поможет, я попытаюсь разблокировать плагин провайдера maven surefire junit.
Btw, модульные тесты, по определению, должны работать быстрее 0,1 секунды. Если ваша сборка действительно занимает очень много времени из-за модульных тестов, вам нужно будет ускорить их работу в будущем.
Несколько способов ускорить его, если не совсем то, что вам нужно:
Если это сборка нескольких модулей, добавьте --fail-fast для командной строки, которая выпадает после первого модуля.
Взгляните в безопасное, чтобы двигаться долго проведение интеграционных тестов на различные фазы жизненного цикла.
Посмотрите на основанное на профиле решение для быстрых и медленных тестов - Есть ли способ сказать, что surefire пропускает тесты в определенном пакете?.
Это не решит вопрос точно, но решение, которое в конечном итоге на моем рабочем месте появилось, было использование Atlassian Clover для запуска специализированных сборок только тестов, связанных с измененным кодом.
У нас есть сборка Clover, которая запускает тесты для измененного кода и, в свою очередь, запускает полную тестовую сборку.
Это оказалось удовлетворительным решением.
Это не прямой ответ на вопрос, но также может быть полезно подавать вывод maven через grep, чтобы вырезать большинство материалов и помочь вам увидеть, где находятся тестовые сбои.
Вот так:
mvn test | grep -w 'Running\|Tests'
Что производит вывод (для моего кода) следующим образом:
Running scot.mygov.pp.test.dashboard.DashboardJsonSerDesCRUDTest
Tests run: 26, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.029 sec
Running scot.mygov.pp.test.dashboard.DashboardBaselineCRUDTest
Tests run: 26, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.026 sec
Running scot.mygov.pp.test.dashboard.DashboardDatabaseValidationTest
Tests run: 7, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 2.264 sec
Running scot.mygov.pp.test.dashboard.DashboardServiceWebServiceIsolationCRUDTest
Tests run: 26, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.032 sec
Намного легче увидеть, где первая ошибка сбоя.
Вы можете запустить maven
с помощью параметра --fail-fast
:
Параметр
-ff
очень полезен для разработчиков, выполняющих интерактивные которые хотят иметь быструю обратную связь в течение цикла разработки.
пример может быть:
mvn clean test -ff
http://books.sonatype.com/mvnref-book/reference/running-sect-options.html