К счастью, 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 .