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

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

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

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

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

Ответ 1

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

<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 и только surefire, а не отказоустойчивость, тесты будут пропущены; он также выполнит все другие необходимые фазы, включая предварительную интеграцию и пост-интеграцию, а также выполнит цель verify, которая необходима для фактического отказа от сборки maven, если ваши интеграционные тесты не удались.

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

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

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

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

Ответ 2

Обходным решением было бы вызвать:

mvn clean test-compile failsafe:integration-test

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


Или (другой взлом):

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

Справка:

Ответ 3

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

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

-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>

Ответ 4

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

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

mvn failsafe:integration-test

И если вы хотите использовать только SureFire (плагин для модульного тестирования)

mvn surefire:test

или один тест за раз с:

mvn -Dtest=MyUnitlTest

Ответ 5

Мне нравится, так что каждая фаза обычно выполняется:

 mvn -Dtest=foo -DfailIfNoTests=false verify

Ответ 6

Подробнее о комментариях от @danidemi и @GuillaumeHusta:

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

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

mvn verify -DskipTests

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

Ответ 7

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