В моем проекте у меня есть набор очень быстрых модульных тестов, а также набор более медленных тестов интеграции, 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
?
Да. Для этого и нужен тег исполнения .
Чтобы связать 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).
для будущих читателей: goals
должен содержать <goal>test</goal>
, как задокументировано здесь
ах, если я привязываю выполнение к фазе deploy
, он запускает медленные тесты после фактического развертывания :( ... и deploy
сразу после install
(согласно документации maven), поэтому я не могу выполнить привязку, где мне нужно это, кажется :( есть идеи для обходного пути?
хорошо, решено: выполнения выполняются в том порядке, в котором они определены в pom.xml, поэтому размещение surefire перед nexus-staging сделало свое дело (престижность этому посту)
@morgwai В мой ответ добавлена информация о отказоустойчивом плагине.
чтобы обобщить все комментарии к ответу 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 запускаются каждый раз, когда я это делаю mvn install
, а это именно то, чего я не хочу: мои slow
тесты занимают около 10 минут каждый раз, и у меня есть другие проекты, основанные на этом, над которыми я работаю в то же время. Мне особенно нужно, чтобы некоторые тесты выполнялись только в начале фазы deploy
, и приведенный выше xml делает именно это. Тем не менее, может быть проще использовать для этого плагин отказоустойчивости, чтобы мне не нужно было перенастраивать default-test
выполнение surefire: я попробую это, когда у меня будет минутка: большое спасибо за предложение! :)
это почти сработало, однако это привело к 3 тестовым запускам из-за «привязки по умолчанию» на этапе
test
, на котором выполнялись все тесты;-] чтобы перенастроить его, мне пришлось добавить выполнение с идентификаторомdefault-test
. После этого я убрал "сохранение установочных тестов"deploy-tests
и теперь все работает как задумано :) Большое спасибо!!