Тестирование интеграции с плагином Maven Cargo

Интеграционное тестирование с плагином Maven Cargo

Очень распространенная потребность в жизненном цикле проекта - настройка интеграционного тестирования. К счастью, Maven имеет встроенную поддержку именно для этого сценария со следующими этапами жизненного цикла сборки по умолчанию (из Mavendocumentation): [more-134] #

  • pre-integration-test:Perform actions required before integration tests are executed. This may involve things such as setting up the required environment.

  • integration-test:Process and deploy the package if necessary into an environment where integration tests can be run.

  • post-integration-test:Perform actions required after integration tests have been executed. This may including cleaning up the environment.

Во-первых,maven-surefire-plugin настроен так, чтобыintegration tests are excluded из стандартного жизненного цикла сборки:


   org.apache.maven.plugins
   maven-surefire-plugin
   2.17
   
      
         **/*IntegrationTest.java
      
   

Exclusions выполняются с помощью выражений пути в стиле муравьев, поэтому все интеграционные тесты должны следовать этому шаблону и заканчиваться“IntegrationTest.java “.

Затем используетсяcargo-maven2-plugin, посколькуCargo поставляется с первоклассной готовой поддержкой встроенных веб-серверов. Конечно, если серверная среда требует особой конфигурации, Cargo также знает, как создать сервер из заархивированного пакета, а также развернуть его на внешнем сервере.


   org.codehaus.cargo
   cargo-maven2-plugin
   1.4.8
   
      
         jetty8x
         embedded
      
      
         
            8080
         
      
   

Определен встроенный веб-сервер Jetty 8, прослушивающий порт 8080.

В более новой версии Cargo (начиная с 1.1.0) значение по умолчаниюthe wait flag было изменено наfalse, дляcargo:start. Эта цель должна использоваться только для выполнения интеграционных тестов и связана с жизненным циклом Maven; для разработки вместо этого должна выполняться цельcargo:run - которая имеетwait=true.

Чтобы на этапе mavenpackage был сгенерирован файлdeployable war, упаковка проекта должна быть:<packaging>war</packaging>.

Затем создается новыйintegrationMaven profile, чтобы разрешить запуск интеграционных тестовonly, когда этот профиль активен, а не как часть стандартного жизненного цикла сборки.


   
      integration
      

         
            ...
         

      
   

Именно этот профиль будет содержать все оставшиеся настройки.

Теперь сервер Jetty настроен наstart в фазеpre-integration-test иstop в фазеpost-integration-test.


   org.codehaus.cargo
   cargo-maven2-plugin
   
      false
   
   
      
         start-server
         pre-integration-test
         
            start
         
      
      
         stop-server
         post-integration-test
         
            stop
         
      
   

Это гарантирует, что цельcargo:start и целиcargo:stop будут выполняться до и после фазыintegration-test. Обратите внимание, что, поскольку существует два отдельных определенияexecution, элементid должен присутствовать (и отличаться) в обоих, чтобы Maven мог принять конфигурацию.

Затем конфигурацияmaven-surefire-plugin должна быть переопределена в профилеintegration, чтобы интеграционные тесты, которые были исключены из жизненного цикла по умолчанию, теперь будутincluded и будут выполняться:


   
      org.apache.maven.plugins
      maven-surefire-plugin
      
         
            integration-test
            
               test
            
            
               
                  none
               
               
                  **/*IntegrationTest.java
               
            
         
      
   

Есть несколько вещей, на которые стоит обратить внимание:

1. Цельtest дляmaven-surefire-plugin выполняется в фазеintegration-test; на этом этапе Jetty уже запущен с развернутым проектом, поэтому интеграционные тесты должны выполняться без проблем.

2. Интеграционные тесты сейчас выполняютсяincluded. Чтобы достичь этого, исключения также переопределяются - это потому, что Maven обрабатывает переопределение конфигураций плагинов внутри профилей. Базовая конфигурация не полностью переопределена, а дополнена новыми элементами конфигурации внутри профиля. Из-за этого исходная конфигурация<excludes>, которая в первую очередь исключила тесты интеграции, все еще присутствует в профиле, и ее необходимо переопределить, иначе она будет конфликтовать с конфигурацией<includes> и тесты все равно не запускаются.

3. Обратите внимание: поскольку существует только один элемент<execution>, необходимо определитьno need for an id.

Теперь весь процесс может выполняться:

mvn clean install - интеграция

Заключение

Пошаговая настройка Maven охватывает весь процесс настройки процесса интеграции как части жизненного цикла проекта.

Обычно это настроено для работы в среде непрерывной интеграции, предпочтительно после каждой фиксации. Если на сервере CI уже есть сервер, работающий и использующий порты, то конфигурация груза должна будет соответствовать этому сценарию, о котором я расскажу в следующем посте.

Для полностью работающей конфигурации этого механизма проверьтеREST GitHub project.

Такжеcheck out this article для лучших практик структурирования проекта и организации модульных и интеграционных тестов.