Есть ли способ "быстро потерпеть неудачу" для junit с плагином maven surefire?
в настоящее время я работаю над проектом java с использованием maven. Мы используем плагин maven surefire для запуска нашего JUnit suite как часть процесса сборки.
наш набор тестов быстро растет, как по охвату, так и по времени выполнения. Время выполнения очень неприятно и занимает много времени, когда вы в конечном итоге ждать десять минут, чтобы узнать, что тест не удалось в первую минуту тестирования.
Я хотел бы найти способ сделать процесс сборки не на первом ошибка/сбой в наборе тестов. Я знаю, что это возможно для других инструментов сборки, но я не смог найти способ сделать это с maven surefire.
Я знаю, что есть нерешенный билет для этой функции в surefire jira, но я надеюсь, что для этого есть существующее решение.
7 ответов
по состоянию на 6 сентября 2015 года это, -Dsurefire.skipAfterFailureCount=1
.
по состоянию на 19 октября 2015 версия 2.19 была выпущена.
насколько я знаю, нет, и это действительно требует решения SUREFIRE-580. Если вы хотите, чтобы это произошло быстрее, вы должны, по крайней мере, проголосовать за вопрос и, необязательно, отправить патч ;)
может быть подходящий решение, но это зависит от ваших требований, и вам нужно использовать сервер CI, который может обрабатывать коды возврата процесса jvm.
основная идея состоит в том, чтобы полностью остановить процесс JVM Maven и сообщить ОС, что процесс неожиданно остановился. Затем сервер непрерывной интеграции, такой как Jenkins/Hudson должен иметь возможность проверить ненулевой код выхода и пусть вы знаете, что тест не удался.
в первый шаг-сделать surefire выход из 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 -. Вам также нужно будет настроить 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 provider.
Btw, модульные тесты, по определению, должны работать быстрее 0,1 секунды. Если ваша сборка действительно занимает так много времени из-за модульных тестов, вам придется заставить их работать быстрее в будущем.
несколько способов его ускорить, если не совсем то, что вам нужно:
Если это сборка нескольких модулей, добавьте -- fail-быстро в командной строке, чтобы выпадать после первого модуля.
посмотрите в failsafe для того чтобы двинуть длиной запуск интеграционных тестов на разная фаза жизненного цикла.
посмотрите на решение на основе профиля для быстрых и медленных тестов - есть ли способ сказать surefire пропустить тесты в определенном посылка?.
это не прямой ответ на вопрос, но также может быть полезно кормить выход 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
с :
на
-ff
опция очень полезна для разработчиков, работающих в интерактивном режиме строит, кто хочет иметь быструю обратную связь во время цикла разработки.
пример:
mvn clean test -ff
http://books.sonatype.com/mvnref-book/reference/running-sect-options.html
Это не решает вопрос точно, но решение, которое мое рабочее место в конечном итоге придумало, состояло в том, чтобы использовать Клевер Atlassian для запуска специализированных сборок только тестов, относящихся к измененному коду.
У нас есть сборка Clover, которая запускает тесты для измененного кода и, в свою очередь, запускает полную тестовую сборку.
Это оказалось удовлетворительным решением.