К счастью, Maven имеет встроенную поддержку для этого точного сценария со следующими фазами жизненного цикла сборки по умолчанию (из документации Maven):
- предварительный интеграционный тест : выполнение необходимых действий перед выполнением интеграционных тестов. Это может включать такие вещи, как настройка требуемой среды.
- Интеграционный тест : при необходимости обработайте и разверните пакет в среде, где можно проводить интеграционные тесты.
- post-интеграционный тест : выполнение действий, необходимых после выполнения интеграционных тестов. Это может включать в себя очистку окружающей среды.
Сначала настраивается подключаемый модуль maven-surefire, чтобы интеграционные тесты исключались из стандартного жизненного цикла сборки:
|
01
02
03
04
05
06
07
08
09
10
|
<plugin> <groupId>org.apache.maven.plugins<groupId> <artifactId>maven-surefire-plugin<artifactId> <version>2.10<version> <configuration> <excludes> <exclude>***IntegrationTest.java<exclude> <excludes> <configuration><plugin> |
Исключения выполняются с помощью выражений пути в стиле муравья, поэтому все интеграционные тесты должны следовать этому шаблону и заканчиваться «IntegrationTest.java ».
Затем используется плагин cargo-maven2 , так как Cargo поставляется с первоклассной поддержкой встроенных веб-серверов. Конечно, если серверная среда требует особой конфигурации, Cargo также знает, как создать сервер из архивированного пакета, а также развернуть его на внешнем сервере.
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
|
<plugin> <groupId>org.codehaus.cargo<groupId> <artifactId>cargo-maven2-plugin<artifactId> <version>1.1.3<version> <configuration> <wait>true<wait> <container> <containerId>jetty7x<containerId> <type>embedded<type> <container> <configuration> <properties> <cargo.servlet.port>8080<cargo.servlet.port> <properties> <configuration> <configuration><plugin> |
Определен встроенный веб-сервер Jetty 7, прослушивающий порт 8080. Обратите внимание, что для флага ожидания установлено значение true — это связано с тем, что для более новых версий cargo (1.1.0 и выше) значение флага по умолчанию изменилось с из-за этой ошибки . Мы хотим иметь возможность запустить проект, просто запустив mvn cargo: start , особенно на этапе разработки, поэтому флаг должен быть активным. Однако при запуске интеграционных тестов мы хотим, чтобы сервер запускался, позволял тестам запускаться, а затем останавливаться, поэтому флаг будет переопределен позже.
Для того чтобы на этапе maven пакета был создан развертываемый файл war , упаковка проекта должна быть: <package> war </ packaging> .
Затем создается новый профиль интеграции Maven, позволяющий запускать интеграционные тесты только тогда, когда этот профиль активен, а не является частью стандартного жизненного цикла сборки.
|
01
02
03
04
05
06
07
08
09
10
11
12
|
<profiles> <profile> <id>integration<id> <build> <plugins> ... <plugins> <build> <profile><profiles> |
Именно этот профиль будет содержать все оставшиеся настройки.
Теперь сервер Jetty настроен на запуск на этапе тестирования перед интеграцией и останов на этапе тестирования после интеграции .
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
<plugin> <groupId>org.codehaus.cargo<groupId> <artifactId>cargo-maven2-plugin<artifactId> <configuration> <wait>false<wait> <configuration> <executions> <execution> <id>start-server<id> <phase>pre-integration-test<phase> <goals> <goal>start<goal> <goals> <execution> <execution> <id>stop-server<id> <phase>post-integration-test<phase> <goals> <goal>stop<goal> <goals> <execution> <executions><plugin> |
Это гарантирует, что груз: начальная цель и груз: конечные цели будут выполнены до и после фазы интеграционных испытаний . Обратите внимание, что, поскольку существует два отдельных определения выполнения , элемент id должен присутствовать (и различаться) в обоих, чтобы Maven мог принять конфигурацию.
Затем, конфигурация maven-surefire-plugin должна быть переопределена внутри профиля интеграции , чтобы теперь включались и запускались интеграционные тесты, которые были исключены из жизненного цикла по умолчанию:
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
|
<plugins> <plugin> <groupId>org.apache.maven.plugins<groupId> <artifactId>maven-surefire-plugin<artifactId> <executions> <execution> <phase>integration-test<phase> <goals> <goal>test<goal> <goals> <configuration> <excludes> <exclude>none<exclude> <excludes> <includes> <include>***IntegrationTest.java<include> <includes> <configuration> <execution> <executions> <plugin><plugins> |
Есть несколько вещей, на которые стоит обратить внимание:
1. Цель тестирования подключаемого модуля maven-surefire выполняется на этапе интеграционных испытаний ; на этом этапе Jetty уже запущен с развернутым проектом, поэтому интеграционные тесты должны выполняться без проблем.
2. Интеграционные тесты теперь включены в выполнение. Чтобы достичь этого, исключения также переопределяются — это потому, что Maven обрабатывает переопределение конфигураций плагинов внутри профилей. Базовая конфигурация не полностью переопределена, а дополнена новыми элементами конфигурации внутри профиля. Из-за этого исходная конфигурация <exclude> , которая в первую очередь исключала интеграционные тесты, все еще присутствует в профиле и должна быть переопределена, либо она будет конфликтовать с конфигурацией <include>, а тесты все равно не будут запустить.
3. Обратите внимание, что поскольку существует только один элемент <execute> , нет необходимости определять идентификатор .
Теперь весь процесс может выполняться:
|
1
|
mvn clean install -Pintegration |
Вывод
Пошаговая настройка Maven охватывает весь процесс настройки процесса интеграции как части жизненного цикла проекта.
Обычно это настроено для работы в среде непрерывной интеграции, предпочтительно после каждой фиксации. Если на сервере CI уже есть сервер, работающий и использующий порты, то конфигурация груза должна будет соответствовать этому сценарию, о котором я расскажу в следующем посте.
Ссылка: Как настроить интеграционное тестирование с помощью плагина Maven Cargo от нашего партнера JCG Юджина Параскива в блоге baeldung .