Есть ли способ "сбой быстро" для junit с плагином maven surefire?

В настоящее время я работаю над проектом java с использованием maven. Мы используем плагин maven surefire для запуска нашего пакета junit как часть процесса сборки.

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

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

Я знаю, что есть неразрешенный билет для этой функции в surefire jira, но я надеюсь, что для этого существует существующее решение.

Ответ 2

Насколько я знаю, нет, и это действительно требует разрешения SUREFIRE-580. Если вы хотите, чтобы это произошло быстрее, вы должны хотя бы проголосовать за эту проблему и, необязательно, отправить патч;)

Ответ 3

Может быть подходящий обходной путь, но это зависит от ваших требований, и вам нужно использовать сервер 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 секунды. Если ваша сборка действительно занимает очень много времени из-за модульных тестов, вам нужно будет ускорить их работу в будущем.

Ответ 4

Несколько способов ускорить его, если не совсем то, что вам нужно:

  • Если это сборка нескольких модулей, добавьте --fail-fast для командной строки, которая выпадает после первого модуля.

  • Взгляните в безопасное, чтобы двигаться долго проведение интеграционных тестов на различные фазы жизненного цикла.

  • Посмотрите на основанное на профиле решение для быстрых и медленных тестов - Есть ли способ сказать, что surefire пропускает тесты в определенном пакете?.

Ответ 5

Это не решит вопрос точно, но решение, которое в конечном итоге на моем рабочем месте появилось, было использование Atlassian Clover для запуска специализированных сборок только тестов, связанных с измененным кодом.

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

Это оказалось удовлетворительным решением.

Ответ 6

Это не прямой ответ на вопрос, но также может быть полезно подавать вывод 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

Намного легче увидеть, где первая ошибка сбоя.

Ответ 7

Вы можете запустить maven с помощью параметра --fail-fast:

Параметр -ff очень полезен для разработчиков, выполняющих интерактивные которые хотят иметь быструю обратную связь в течение цикла разработки.

пример может быть:

mvn clean test -ff

http://books.sonatype.com/mvnref-book/reference/running-sect-options.html