Запустить дополнительные тесты на этапе развертывания maven

В моем проекте у меня есть набор очень быстрых модульных тестов, а также набор более медленных тестов интеграции, end2end и тестов производительности (10 минут+). Я использую теги junit5 для их классификации и в моем pom.xml я настроил maven-surefire-plugin для запуска только быстрых (у меня есть другие проекты, основанные на этом, над которыми я работаю параллельно, поэтому я не хочу ждать 10 минут после каждого небольшое изменение в базовом проекте). Однако, когда я развертываю центральную систему с помощью nexus-staging-maven-plugin, я определенно хочу запускать и медленные. В настоящее время я делаю это, вручную переопределяя системное свойство groups в командной строке: mvn -Dgroups = "fast|slow" clean deploy. Однако это подвержено ошибкам, и мне интересно, есть ли способ автоматизировать это: например, возможно ли автоматически использовать другую конфигурацию для maven-surefire-plugin в зависимости от того, делаю ли я install или deploy?

Не удалось выполнить цель org.apache.maven.plugins
Не удалось выполнить цель org.apache.maven.plugins
Опишу, что когда я только начинал изучать Maven, у меня не получалось компилировать и упаковывать.
Blibli Automation Journey - Как захватить сетевой трафик с помощью утилиты HAR в Selenium 4
Blibli Automation Journey - Как захватить сетевой трафик с помощью утилиты HAR в Selenium 4
Если вы являетесь веб-разработчиком или тестировщиком, вы можете быть знакомы с Selenium, популярным инструментом для автоматизации работы...
2
0
57
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Да. Для этого и нужен тег исполнения .

Чтобы связать maven-surefire-plugin (или любой плагин в этом отношении), например, с фазой установки, вы должны настроить:

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-surefire-plugin</artifactId>
  <version>3.1.2</version>
  <executions>
    <execution>
      <id>execution1</id>
      <phase>install</phase>
      <configuration>
        <!-- include your configurations here -->
      </configuration>
      <goals>
        <!-- goals go here -->
      </goals>
    </execution>
  </executions>
</plugin>

Конечно, у вас может быть несколько записей execution, поэтому вы можете создать другую configuration для этапа развертывания.

Как упоминалось в комментарии @khmarbaise, maven-surefire-plugin является плагином по умолчанию, предназначенным для модульных тестов, и поэтому он уже имеет некоторые привязки по умолчанию в жизненном цикле Maven. Хотя эти значения по умолчанию можно отключить, лучшим решением будет рассмотреть возможность использования maven-failsafe-plugin. Этот плагин 1) не имеет никаких привязок по умолчанию, 2) предназначен специально для интеграционных тестов и 3) конфигурации >90% совместимы с плагином surefire (failsafe — это форк surefire).

это почти сработало, однако это привело к 3 тестовым запускам из-за «привязки по умолчанию» на этапе test, на котором выполнялись все тесты;-] чтобы перенастроить его, мне пришлось добавить выполнение с идентификатором default-test. После этого я убрал "сохранение установочных тестов" deploy-tests и теперь все работает как задумано :) Большое спасибо!!

morgwai 26.07.2023 18:39

для будущих читателей: goals должен содержать <goal>test</goal>, как задокументировано здесь

morgwai 26.07.2023 18:45

ах, если я привязываю выполнение к фазе deploy, он запускает медленные тесты после фактического развертывания :( ... и deploy сразу после install (согласно документации maven), поэтому я не могу выполнить привязку, где мне нужно это, кажется :( есть идеи для обходного пути?

morgwai 26.07.2023 19:02

хорошо, решено: выполнения выполняются в том порядке, в котором они определены в pom.xml, поэтому размещение surefire перед nexus-staging сделало свое дело (престижность этому посту)

morgwai 26.07.2023 20:24

@morgwai В мой ответ добавлена ​​информация о отказоустойчивом плагине.

SiKing 27.07.2023 18:04
Ответ принят как подходящий

чтобы обобщить все комментарии к ответу SiKing:

<plugins>
    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-surefire-plugin</artifactId>
        <version>3.1.2</version>
        <executions>
            <execution>
                <!-- reconfigure the default execution from test phase -->
                <id>default-test</id>
                <configuration>
                    <excludedGroups>slow</excludedGroups>
                </configuration>
                <goals>
                    <goal>test</goal>
                </goals>
            </execution>
            <execution>
                <!-- additional execution at the beginning of deploy phase -->
                <id>pre-deploy-test</id>
                <phase>deploy</phase>
                <configuration>
                    <groups>slow</groups>
                </configuration>
                <goals>
                    <goal>test</goal>
                </goals>
            </execution>
        </executions>
    </plugin>
    <plugin>
        <!-- nexus-staging must be placed *AFTER* surefire -->
        <groupId>org.sonatype.plugins</groupId>
        <artifactId>nexus-staging-maven-plugin</artifactId>
        <!-- nexus staging config here... -->
    </plugin>
    <!-- other plugins here... -->
</plugins>

обновление: согласно этого комментария, некоторые могут счесть вышеизложенное злоупотреблением верным файером, поэтому ниже приведена версия, которая использует maven-failsafe-plugin для тестов перед развертыванием, поэтому нет необходимости «взламывать» default-test выполнение верного огня.

<plugins>
    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-surefire-plugin</artifactId>
        <version>3.1.2</version>
        <configuration>
            <excludedGroups>slow</excludedGroups>
        </configuration>
    </plugin>
    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-failsafe-plugin</artifactId>
        <version>3.1.2</version>
        <executions>
            <execution>
                <id>pre-deploy-tests</id>
                <phase>deploy</phase>
                <configuration>
                    <includes>
                        <include>**/*Test.java</include>
                        <include>**/*Tests.java</include>
                    </includes>
                    <groups>slow</groups>
                </configuration>
                <goals>
                    <goal>integration-test</goal>
                    <goal>verify</goal>
                </goals>
            </execution>
        </executions>
    </plugin>
    <plugin>
        <!-- nexus-staging must be placed *AFTER* failsafe -->
        <groupId>org.sonatype.plugins</groupId>
        <artifactId>nexus-staging-maven-plugin</artifactId>
        <!-- nexus staging config here... -->
    </plugin>
    <!-- other plugins here... -->
</plugins>

Нет... плагин surefire предназначен для модульных тестов... если у вас есть своего рода интеграционные тесты, вам следует использовать отказоустойчивый плагин вместо этого.... если вы измените имена своих тестов (теги: медленные), например *IT.java, они будут выполняются на этапах до интеграционного тестирования, интеграционного тестирования и постинтеграционного тестирования, которые можно просто обработать, используя mvn verify только для модульных тестов mvn test, и если вы это сделаете mvn deploy, фаза проверки является ее частью, что означает, что они также выполняются ... как пожелаете... соблюдайте условности и т.д...

khmarbaise 27.07.2023 13:25

Интеграционные тесты @khmarbaise запускаются каждый раз, когда я это делаю mvn install, а это именно то, чего я не хочу: мои slow тесты занимают около 10 минут каждый раз, и у меня есть другие проекты, основанные на этом, над которыми я работаю в то же время. Мне особенно нужно, чтобы некоторые тесты выполнялись только в начале фазы deploy, и приведенный выше xml делает именно это. Тем не менее, может быть проще использовать для этого плагин отказоустойчивости, чтобы мне не нужно было перенастраивать default-test выполнение surefire: я попробую это, когда у меня будет минутка: большое спасибо за предложение! :)

morgwai 27.07.2023 19:52

Другие вопросы по теме

Насмешка над репозиторием, который возвращает необязательный, всегда возвращает необязательный.пустой в модульном тесте
Как сравнить объекты класса, содержащие дополнительное поле Instant, с помощью AssertJ с учетом разницы в точности между Java 8 и Java 11
Как сравнить объекты класса, содержащие дополнительное поле Instant, с помощью AssertJ с учетом разницы в точности между Java 8 и Java 11
Имитация статического метода в тесте интеграции с весенней загрузкой
Имеет ли @Description какое-либо отношение к тестам junit? Это просто ошибка chatGPT и нет аннотации для длинного описания, например. данный_когда_затем?
Intellij test не проходит: пожалуйста, обратитесь к ..target\surefire-reports за отдельными результатами теста
Требуется базовая аутентификация, но тестовый пример проходит без аутентификации в приложении Spring boot
Как я могу использовать Maven для запуска только ранее неудачных тестов JUnit 5?
Реализация BeforeEach в одном методе
Мок-объект имеет значение null в тесте JUnit