Статьи

Плагин Maven Cargo для тестирования интеграции

Очень распространенная потребность в жизненном цикле проекта — настройка интеграционного тестирования.

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