Есть ли способ "быстро потерпеть неудачу" для junit с плагином maven surefire? - PullRequest
35 голосов
/ 17 декабря 2009

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

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

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

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

Ответы [ 7 ]

33 голосов
/ 18 сентября 2015

По состоянию на 6 сентября 2015 года представляется, что есть , -Dsurefire.skipAfterFailureCount=1.

По состоянию на 19 октября 2015 г. выпущена версия 2.19 .

13 голосов
/ 18 декабря 2009

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

11 голосов
/ 18 октября 2011

Может быть подходящий обходной путь , но это зависит от ваших требований, и вам нужно использовать CI-сервер, который может обрабатывать коды возврата процесса jvm.

Основная идея заключается в том, чтобы полностью остановить процесс JVM в Maven и сообщить ОС, что процесс неожиданно остановился. Затем сервер непрерывной интеграции, такой как 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);
        }
}

Затем вам нужно настроить этот класс, чтобы верный регистратор зарегистрировал его в JUnit 4 Runner. Отредактируйте pom.xml и добавьте свойство конфигурации listener в подключаемый модуль maven-surefire-plugin. Вам также нужно будет настроить верный запуск, чтобы не создавать новый процесс 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 провайдера.

Кстати, модульные тесты, по определению, должны выполняться быстрее, чем 0,1 секунды. Если ваша сборка действительно занимает много времени из-за модульных тестов, вам придется заставить их работать быстрее в будущем.

2 голосов
/ 11 октября 2017

Вы можете запустить maven с опцией --fail-fast:

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

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

mvn clean test -ff

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

1 голос
/ 16 ноября 2015

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

Гораздо проще увидеть, где находится первая ошибка сбоя.

1 голос
/ 20 декабря 2010

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

0 голосов
/ 17 марта 2010

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

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

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

...