Maven: как запустить некоторые тесты после фазы «установки», во время «выпуска: подготовка»?

#java #maven

#java #maven

Вопрос:

У меня есть несколько сложных тестов, которые используют автономные проекты Maven для проверки некоторого кода. Эти проекты Maven программно упаковываются тестами, и затем используются полученные .jar файлы. В этих проектах используются артефакты из моего основного многомодульного проекта в текущей версии, в их pom.xml . Другими словами, тестовые проекты Maven должны иметь возможность находить артефакты, предоставляемые моим основным проектом.

В IDE все работает нормально, поскольку текущие артефакты из моего основного проекта разрешаются динамически (локальный репозиторий не требуется) при запуске тестов. Кроме того, я могу установить эти версии МОМЕНТАЛЬНЫХ СНИМКОВ перед запуском тестов. Но когда я хочу выпустить новую версию своего проекта, мне нужно release:prepare :

  • Обновите версии (удалите все «-SNAPSHOT»).
  • Запускает все тесты, которые не заканчиваются на *.PostInstallTest.java .
  • Упакуйте артефакты и установите их локально.
  • ЗАТЕМ запускаются тесты, которые заканчиваются на *.PostInstallTest.java , поскольку для этих тестов требуется доступ к ранее установленным артефактам! Если тесты завершатся неудачей, никакие коммиты не будут нажаты release:prepare .

Я знаю, что это не идеально, поскольку «плохая» версия артефактов может быть установлена локально, когда тесты «PostInstallTest» завершаются неудачей. Но я бы предпочел, чтобы эти тесты вообще не запускались!

В настоящее время моя единственная рабочая идея — установить системное свойство при использовании release профиля и отключить *.PostInstallTest.java файлы, если это свойство существует. Таким образом, эти тесты все равно будут работать при запуске внутри моей IDE (без release профиля), но вообще не будут выполняться во время release:prepare команды. Но, опять же, я хотел бы, чтобы они были выполнены.

Я просмотрел конфигурацию целей подготовки плагина Maven Release, но я не уверен, как это может мне помочь. Я также посмотрел на Maven Failsafe Plugin, но, похоже, он не поддерживает этап «установки».

Итак, мой вопрос: есть ли способ запустить некоторые тесты после фазы «установки», когда release:prepare используется (или на этапе «установки», но после плагина по умолчанию)?

ОБНОВЛЕНИЕ: Вот краткая схема, если она может помочь понять, что происходит:

введите описание изображения здесь

ОБНОВЛЕНИЕ 2: в конце концов, я не тестировал отказоустойчивость должным образом. Это работает на этапе «установки»! Посмотрите на ответ df778899.

Комментарии:

1. Будет ли приемлема дополнительная команда перед выпуском mvn: подготовка?

2. Я думаю, это действительно может быть решением! Я бы предпочел, если бы что-то было возможно без этого.

3.@Lesiak Какую команду вы бы предложили? Потому что тесты также выполняются release:prepare после того, как все -SNAPSHOT были удалены из версий моих основных документов… Как я мог бы установить эти версии без моментальных снимков перед запуском release:prepare , чтобы тесты без моментальных снимков могли их найти?

4. Хорошо, я думаю, что теперь я понимаю проблему. Вы пробовали перенести отказоустойчивый плагин на этап установки? У плагина Failsafe есть фаза по умолчанию, но ее можно переопределять для каждого выполнения с помощью тега <phase>. Maven выполняет плагины для каждой фазы в порядке, в котором они определены в pom. Возможно, вам придется явно включить maven-install-plugin для принудительного упорядочивания на этапе установки

5. Как я уже говорил в своем описании, я пытался использовать Failsafe на этапе «установки», но он не хочет … 🙁

Ответ №1:

Проверьте следующую настройку. Он полагается на preparationGoals для выполнения установки. В конфигурации плагина failsafe я настроил его для запуска на этапе установки.

Я полагаю, что варианты этого подхода также будут работать нормально — вы можете попробовать отменить привязку failsafe с любой фазы (для фазы установлено значение None) и явно вызвать ее в preparationGoals (вероятно, для этого требуется дополнительная конфигурация, такая как идентификатор выполнения, но я думаю, что вы можете продолжить с этого момента).

 <build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
        </plugin>
        <plugin>
            <artifactId>maven-failsafe-plugin</artifactId>
            <executions>
                <execution>
                    <phase>install</phase>
                    <goals>
                        <goal>integration-test</goal>
                        <goal>verify</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-release-plugin</artifactId>
            <version>2.5.3</version>
            <configuration>
                <preparationGoals>clean verify install</preparationGoals>
            </configuration>
            <dependencies>
                <dependency>
                    <!-- Specify the version of maven-scm-plugin to avoid https://issues.apache.org/jira/browse/SCM-682
                    (Maven release fails when releasing from a named branch)
                    -->
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-scm-plugin</artifactId>
                    <version>1.9.5</version>
                </dependency>
            </dependencies>
        </plugin>
    </plugins>
</build>
  

Вывод (немного отредактированный для уменьшения шума) показывает, что проверки, запущенные preparationGoals , выполняются после установки.

 [INFO] --- maven-release-plugin:2.5.3:prepare (default-cli) @ demo ---
...
[INFO] Checking dependencies and plugins for snapshots ...
What is the release version for "demo"? (com.example:demo) 0.0.1: :
What is SCM release tag or label for "demo"? (com.example:demo) demo-0.0.1: :
What is the new development version for "demo"? (com.example:demo) 0.0.2-SNAPSHOT: :
[INFO] Transforming 'demo'...
[INFO] Not generating release POMs
[INFO] Executing goals 'clean verify install'...
[WARNING] Maven will be executed in interactive mode, but no input stream has been configured for this MavenInvoker instance.
[INFO] [INFO] Scanning for projects...
[INFO] [INFO]
[INFO] [INFO] --------------------------< com.example:demo >--------------------------
[INFO] [INFO] Building demo 0.0.1
[INFO] [INFO] --------------------------------[ jar ]---------------------------------
[INFO] [INFO]
[INFO] [INFO] --- maven-clean-plugin:3.1.0:clean (default-clean) @ demo ---
[INFO] [INFO] --- maven-resources-plugin:3.1.0:resources (default-resources) @ demo ---
[INFO] [INFO] --- maven-compiler-plugin:3.8.0:compile (default-compile) @ demo ---
[INFO] [INFO] --- maven-resources-plugin:3.1.0:testResources (default-testResources) @ demo ---
[INFO] [INFO] --- maven-compiler-plugin:3.8.0:testCompile (default-testCompile) @ demo ---
[INFO] [INFO] --- maven-surefire-plugin:2.22.1:test (default-test) @ demo ---
[INFO] [INFO] --- maven-jar-plugin:3.1.1:jar (default-jar) @ demo ---
[INFO] [INFO] --- spring-boot-maven-plugin:2.1.4.RELEASE:repackage (repackage) @ demo ---
[INFO] [INFO] --- maven-resources-plugin:3.1.0:resources (default-resources) @ demo ---
[INFO] [INFO] --- maven-compiler-plugin:3.8.0:compile (default-compile) @ demo ---
[INFO] [INFO] --- maven-resources-plugin:3.1.0:testResources (default-testResources) @ demo ---
[INFO] [INFO] --- maven-compiler-plugin:3.8.0:testCompile (default-testCompile) @ demo ---
[INFO] [INFO] --- maven-surefire-plugin:2.22.1:test (default-test) @ demo ---
[INFO] [INFO] --- maven-jar-plugin:3.1.1:jar (default-jar) @ demo ---
[INFO] [INFO] Building jar: demo-0.0.1.jar

[INFO] [INFO] --- maven-install-plugin:2.5.2:install (default-install) @ demo ---
[INFO] [INFO] Installing demo-0.0.1.jar to 

[INFO] [INFO] --- maven-failsafe-plugin:2.22.1:integration-test (default) @ demo ---
[INFO] [INFO]
[INFO] [INFO] --- maven-failsafe-plugin:2.22.1:verify (default) @ demo ---
[INFO] [INFO] ------------------------------------------------------------------------
[INFO] [INFO] BUILD SUCCESS
[INFO] [INFO] ------------------------------------------------------------------------
[INFO] [INFO] Total time: 13.784 s

[INFO] Checking in modified POMs...
  

Ответ №2:

Я не думаю, что это ответ на данный момент, но, чтобы расширить точку зрения @Lesiak, плагин Failsafe сам по себе отлично выглядит на этапе установки. Например:

 <plugin>
    <artifactId>maven-failsafe-plugin</artifactId>
    <executions>
        <execution>
            <phase>install</phase>
            <goals>
                <goal>integration-test</goal>
                <goal>verify</goal>
            </goals>
        </execution>
    </executions>
</plugin>
  

Результаты в этом выводе:

 ...
[INFO] --- maven-install-plugin:2.4:install (default-install) @ it-test ---
[INFO] Installing ...targetit-test-0.0.1-SNAPSHOT.jar to ....m2repositorygroupit-test0.0.1-SNAPSHOTit-test-0.0.1-SNAPSHOT.jar
[INFO] Installing ...pom.xml to ....m2repositorygroupit-test0.0.1-SNAPSHOTit-test-0.0.1-SNAPSHOT.pom
[INFO]
[INFO] --- maven-failsafe-plugin:3.0.0-M3:integration-test (default) @ it-test ---
[INFO]
[INFO] -------------------------------------------------------
[INFO]  T E S T S
[INFO] -------------------------------------------------------
[INFO] Running TheIT
[INFO] Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.093 s - in TheIT
[INFO]
[INFO] Results:
[INFO]
[INFO] Tests run: 1, Failures: 0, Errors: 0, Skipped: 0
[INFO]
[INFO]
[INFO] --- maven-failsafe-plugin:3.0.0-M3:verify (default) @ it-test ---
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
  

Обратите внимание, как цели maven-failsafe-plugin:3.0.0-M3:integration-test и maven-failsafe-plugin:3.0.0-M3:verify выполняются в конце — на install этапе.

Комментарии:

1. Фаза «проверки» находится перед фазой «установки»: maven.apache.org/guides/introduction/… . Отказоустойчивый плагин не поддерживает этап «установки», выдается ошибка.

2. Как вы говорите, по умолчанию verify цель в отказоустойчивом плагине обычно выполняется на verify этапе жизненного цикла Maven. Настройка <phase>install</phase> на отказоустойчивый плагин должна переместить verify цель (и integration-test цель, если на то пошло) в install фазу. Я обновил ответ, чтобы, надеюсь, сделать это более понятным. Можете ли вы подробнее рассказать об ошибке, которая выдается?

3. Я исправлен. Отказоустойчивость действительно работает должным образом на этапе «установки»! Я думаю, что я тестировал с чем-то глупым, например, <role>install</role> вместо <phase>install</phase> . Я все равно оставлю свой вопрос на случай, если это поможет кому-то в будущем. Наслаждайтесь щедростью и большой благодарностью от меня!