Интеграционное тестирование с плагином 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 для лучших практик структурирования проекта и организации модульных и интеграционных тестов.