Запретить юнит-тесты, но разрешить интеграционные тесты в 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 крошечного различия».

Bacar
источник
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

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

meustrus
источник
-3

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

Стивен
источник
Может быть, добавить родительский пом, в котором вы определяете профиль, который работает только IT? все подмодули проекта могут наследовать от этого pom, поэтому вам не нужно менять каждый pom или запускать модули с помощью специальных переключателей (так как вы можете активировать профиль при отсутствии свойства).
yoosiba