Запретить юнит-тесты, но разрешить интеграционные тесты в Maven


157

У меня есть сборка Maven, в которой я использую плагин SureFire для запуска некоторых модульных тестов и плагин FailSafe для запуска некоторых интеграционных тестов. Я хотел бы запустить только тесты плагина FailSafe.

Для меня это плохое решение - добавлять разные профили или что-то еще в pom, потому что это многомодульная сборка, и я не хочу редактировать pom каждого модуля.

Есть skip.testsи maven.test.skipи skipTestsкоторые останавливаются все тесты, и skipITs, которые останавливают только отказоустойчивый плагин.

Итак, есть ли флаг командной строки для Maven skipITs, но вместо этого с функциональностью «onlyITs»?


Ты пробовал maven.test.skipили skipTests?
— Томас

1
@ Khmarbaise в теории, да. Но в большинстве проектов, над которыми я работал, были «модульные тесты», где на самом деле тесты интеграции с базой данных в памяти (если вам повезло)
— Шон Патрик Флойд,

9
@khmarbaise Много юнит-тестов. Они бегут пару минут, и нам не нужно, чтобы они бегали в таких условиях. В частности, мы запускаем модульные тесты перед созданием артефакта (конечно), но мы хотим запустить ИТ в нескольких средах. Нет смысла перезапускать модульные тесты на этом этапе.
— Мэтью Джиллиард

2
Привет @ Khmarbaise, в моей настройке skipTestsпропускает только верные тесты, а не тест на отказоустойчивость! Может быть, это новая функция?
— Данидеми

2
К вашему сведению: skipTests больше не поддерживается в Failsafe Plugin 3.0.0-M3 ( SUREFIRE-1611 )
— Гийом

Ответы:


171

Я обнаружил, что самый простой способ пропустить только верные тесты - это настроить верный ( но не безотказный ) следующим образом:

<plugin>
    <artifactId>maven-surefire-plugin</artifactId>
    <version>2.14</version>
    <configuration>
        <!-- skips surefire tests without skipping failsafe tests.
                 Property value seems to magically default to false -->
        <skipTests>${skip.surefire.tests}</skipTests>
    </configuration>
</plugin>

Это позволяет вам запускать mvn verify -Dskip.surefire.testsи пропускает только верные, но не безопасные тесты; он также выполнит все другие необходимые фазы, включая предварительную интеграцию и постинтеграцию, а также выполнит verifyзадачу, которая необходима для фактического сбоя сборки maven в случае сбоя тестов интеграции.

Обратите внимание, что это переопределяет свойство, используемое для указания того, что тесты должны быть пропущены, поэтому, если вы предоставите канонический -DskipTests=true , surefire проигнорирует его, но отработает отказоустойчивое, что может быть неожиданным, особенно если у вас уже есть существующие сборки / пользователи, которые уже указали этот флаг. Простой обходной путь, кажется, по умолчанию skip.surefire.testsк значению skipTestsв вашем <properties>разделе pom:

<properties>
    <skip.surefire.tests>${skipTests}</skip.surefire.tests>
</properties>

Если вам нужно, вы можете предоставить аналогичный параметр, называемый skip.failsafe.testsотказоустойчивым, однако я не нашел в этом необходимости - поскольку модульные тесты обычно выполняются на более ранней стадии, и если я хочу запускать модульные тесты, но не интеграционные тесты, я бы запустил testфазы вместо verifyфазы. Ваш опыт может отличаться!

Эти skip.(surefire|failsafe).testsсвойства, вероятно, должны быть интегрированы в сам верный / отказоустойчивый код, но я не уверен, насколько сильно он нарушит принцип «они точно такой же плагин, за исключением 1 крошечного различия».


4
Используя это решение, я смог настроить мой фреймворк так, чтобы -DskipUnitTests пропускал плагин surefire, -DskipIntegrationTests пропускал плагин failsafe, а DskipTests пропускал оба. Именно то, что было нужно!
— Алекс Янсен

2
моя среда разработки жалуется на «не удается разрешить символ« skipTests »», решение было добавить строку, которая по- <skipTests>false</skipTests>прежнему работает с любой комбинацией -DskipTests или -Dskip.surefire.tests, поскольку аргументы командной строки, кажется, перезаписывают свойства stackoverflow.com/questions/13708738 /… Вы можете добавить это к своему решению
— globalworming

<skipTests>${skip.surefire.tests}</skipTests>не работает с maven-surefire-pluginверсией 3.0.0-M3. Все верные тесты все еще работают. Кто-нибудь еще нашел это? Приведенное ниже решение Шона Патрика Флойда работает.
— Джон Мейер

120

Обходной путь будет вызывать:

mvn clean test-compile failsafe:integration-test

Правда, это некрасиво, но может решить вашу проблему.


Или (еще один взлом):

mvn clean integration-test -Dtest=SomePatternThatDoesntMatchAnything -DfailIfNoTests=false

Ссылка:


1
Второе предложение сработало для меня. пре-интеграционный тест был успешно назван
— Лоуренс Тирни

7
Это хорошая идея? Не приведет ли это к успешной сборке, даже если ваши интеграционные тесты не пройдут? В этом вся суть отказоустойчивости, если вы также не запускаете цель проверки . Цитата: «Плагин Failsafe не завершит сборку на этапе тестирования интеграции». Вам нужно запустить цель проверки, чтобы фактически сказать вам, успешно ли прошли интеграционные тесты!
— Бакар

2
@bacar прав, но просто используйте verifyвместо integration-testвторого решения.
— Мэтью Джиллиард

1
Вы должны увидеть ответ @bacar для лучшего решения.
— FBB

12
Если вы добавите failsafe:verifyв конец первого hack ( mvn clean test-compile failsafe:integration-test failsafe:verify), сборка будет неудачной, если один из тестов интеграции не пройден.
— Shadow Man

73

Я использую код из блога Антонио Гонсалвеса , который отлично работает.

Вы можете использовать следующие свойства:

-DskipUTs=true для пропуска верных тестов.

-DskipITs=true за пропуск безотказных тестов.

-DskipTests=true за пропуск всех тестов.

Это pom.xmlвыглядит следующим образом:

<properties>
    <skipTests>false</skipTests>
    <skipITs>${skipTests}</skipITs>
    <skipUTs>${skipTests}</skipUTs>
</properties>
<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-surefire-plugin</artifactId>
            <version>2.19.1</version>
            <configuration>
                <skipTests>${skipUTs}</skipTests>
            </configuration>
        </plugin>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-failsafe-plugin</artifactId>
            <version>2.19.1</version>
            <executions>
                <execution>
                    <id>run-integration-tests</id>
                    <phase>integration-test</phase>
                    <goals>
                        <goal>integration-test</goal>
                        <goal>verify</goal>
                    </goals>
                </execution>
            </executions>
            <configuration>
                <skipTests>${skipTests}</skipTests>
                <skipITs>${skipITs}</skipITs>
            </configuration>
        </plugin>
    </plugins>
</build>

2
спасибо, отличный подход! также полезно переопределить выполнение по умолчанию surefire (default-test), см .: stackoverflow.com/questions/11935181/…
— пожалуйста,

1
По этой причине иногда приходится прокручивать страницу вниз и искать хорошее рабочее решение со всей необходимой информацией. Спасибо за обмен
— Атул Чаудхари

Действительно хорошее решение. Тем не менее, отказоустойчивая конфигурация является избыточной, как skipITsэто используется по умолчанию.
— тимомейнен

SkipITs является пользовательской опцией в этой конфигурации. Вы правы в реализации по умолчанию, но это был не вопрос ОП.
— Мартейн Бургер

Престижность, вы гуру Maven! Это должно быть в Maven Superpom.
— Адам

22

Надеюсь это поможет!

Попробуйте запустить тестирование только с FailSafe (плагин для интеграционного теста - он позволит вам запускать только интеграционные тесты с такими именами, по умолчанию: * / IT .java, ** / IT.java, * /*ITCase.java ;, но вы можете легко изменить это из файла pom)

mvn failsafe:integration-test

А когда вы хотите использовать только SureFire (плагин для юнит-тестирования)

mvn surefire:test

или один тест одновременно с:

mvn -Dtest=MyUnitlTest

9

Мне так нравится, поэтому все фазы обычно выполняются:

 mvn -Dtest=foo -DfailIfNoTests=false verify

1
Это самое простое (и, честно говоря, самое блестящее) решение!
— Titulum

не требует добавления чего-либо в pom в соответствии с запросом OP и выполняет все фазы, как указано. отличный ответ.
— jnichols959

1

Чтобы расширить комментарии от @danidemi и @GuillaumeHusta:

К вашему сведению: skipTests больше не поддерживается в Failsafe Plugin 3.0.0-M3 ( SUREFIRE-1611 )

Таким образом, чтобы пропустить юнит-тесты, но не интеграционные тесты, вы можете сделать это, если вы используете последнюю версию плагина Failsafe:

mvn verify -DskipTests

(пожалуйста, дайте упомянутые комментарии, если это поможет вам)


-3

Попробуйте запустить интеграцию или юнит-тесты в отдельном профиле. Тогда вы можете просто включить / отключить профиль.


Может быть, добавить родительский пом, в котором вы определяете профиль, который работает только IT? все подмодули проекта могут наследовать от этого pom, поэтому вам не нужно менять каждый pom или запускать модули с помощью специальных переключателей (так как вы можете активировать профиль при отсутствии свойства).
— yoosiba
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.