Почему для отказоустойчивого плагина требуется как интеграционное тестирование, так и проверка целей?

У меня есть следующий pom.xml

<project>
   ...
     <plugin>
            <artifactId>maven-failsafe-plugin</artifactId>
            <version>2.6</version>
            <executions>
                <execution>
                    <id>integration-test</id>
                    <goals>
                        <goal>integration-test</goal>
                        <goal>verify</goal>
                    </goals>
                    <configuration>
                        <argLine>${failsafeArgLine}</argLine>
                        <includes>
                            <include>**/dmg/*IT.java</include>
                        </includes>
                        <skipTests>${skipTests}</skipTests>
                    </configuration>
                </execution>
            </executions>
        </plugin>
    ...
</project>

Проблема в том, что когда я снимаю цель verify, сборка каждый раз проходит успешно, даже если были неудачные тесты.

И когда я снимаю цель integration-test, интеграционные тесты просто не запускаются.

Почему для отказоустойчивого плагина требуется как интеграционное тестирование, так и проверка целей?


person gokareless    schedule 10.10.2014    source источник
comment
Что вы используете такую ​​экстремально старую версию maven-failsafe-plugin. Текущая версия 2.17... Кроме того, включение не обязательно, потому что это значения по умолчанию.   -  person khmarbaise    schedule 11.10.2014
comment
Это включает в себя это необходимо, потому что мне нужно запустить только то, что находится в пакете dmg и спасибо... я не знал о версии))   -  person gokareless    schedule 13.10.2014


Ответы (2)


В справочнике плагинов Maven Failsafe вы можете найти простой ответ, почему сборка всегда успешна.

failsafe:integration-test runs the integration tests of an application.
  failsafe:verify verifies that the integration tests of an application passed.

Без цели verify результаты теста вообще не проверяются (но они выполняются), поэтому для отказоустойчивого плагина требуется цель интеграции-теста для запуска тестов и проверка для «проверки» их результатов.

person FilMiOs    schedule 10.10.2014
comment
но разве этап проверки не включает этап интеграционного тестирования? Почему я должен писать оба? Спецификация говорит, что проверка выполняется после интеграционного теста... - person gokareless; 13.10.2014
comment
Плагин не имеет собственного lifecycle. Он настроен на выполнение goals. Эти goals привязаны к phases. phases имеют место в default lifecycle. Таким образом, maven знает, какой goal идет первым. Зачем нужны два goals? Потому что два лучше, чем один. Мне может потребоваться выполнить тесты, а затем запустить какую-то процедуру для публикации результатов, даже если тесты не пройдены. Я не определяю verify выполнение, и оно уже сделано. - person Krzysztof Jabłoński; 13.10.2014

В Maven есть два типа плагинов для запуска тестов: Surefire и Failsafe, и оба они служат разным целям. (Я упомянул Surefire здесь, потому что мне кажется, что это помогает объяснить и сопоставить различные типы сбоев в сборках.)

Надежный

Surefire — это подключаемый модуль, разработанный для ваших тестов перед развертыванием, таких как модульные и компонентные тесты. Surefire гарантированно вернет ошибку (и, следовательно, сломает вашу сборку), если какой-либо из тестов не пройден. Вам нужно такое поведение в тестах перед развертыванием, потому что вы хотите завершить сборку раньше, если ваши тесты не пройдут, а поскольку модульные и компонентные тесты не имеют (или не должны) каких-либо внешних зависимостей, это безопасно провалить сборку тут же.

Отказоустойчивость

Failsafe — это подключаемый модуль, предназначенный для тестов после развертывания, таких как функциональные и дымовые тесты. Failsafe, как следует из названия, обрабатывает сбои безопасно, всегда возвращая успешный код выхода (как вы испытали в своей сборке). Причина этого заключается в том, что для тестов после развертывания вы не хотите, чтобы сбои тестов немедленно нарушали сборку, потому что вы, возможно, развернули инфраструктуру или загрузили некоторые тестовые данные в система, которая нуждается в очистке перед сбоем сборки. Поэтому Failsafe разделяет проверку отказов на цель failsafe:verify, которая происходит на этапе verify.

Если вы запустите Maven без параметров (при нормальном жизненном цикле jar), вы заметите фазу между integration-test и verify, называемую post-integration-test. Это этап, который был разработан для удаления любой инфраструктуры или тестовых данных, которые вы могли ввести в систему для запуска тестов.

... pre-integration-test, integration-test, post-integration-test, verify, ...

Фаза до integration-test, pre-integration-test предназначена для указанного посева и создания инфраструктуры.

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

Принимая во внимание, что в тестах после развертывания часто есть внешние зависимости, которые необходимо очистить, прежде чем вы завершите сборку. Например, в Kubernetes вы можете захотеть выполнить откат развертывания, поэтому failsafe:integration всегда возвращает успешную сборку, чтобы гарантировать, что вы сможете выполнить очистку перед сбоем сборки, проверив статус с помощью failsafe:verify.

(Принятый в настоящее время ответ просто цитирует руководство и не объясняет, почему есть две команды и есть различия, поэтому я считаю, что этот ответ необходим.)

person Elven Spellmaker    schedule 08.08.2020