Есть ли способ "быстро потерпеть неудачу" для 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, которая запускает тесты для измененного кода и, в свою очередь, запускает полную тестовую сборку.

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