Перейти к основному содержимому

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

· 4 мин. чтения

Задача: Сумма двух чисел

Напишите функцию twoSum. Которая получает массив целых чисел nums и целую сумму target, а возвращает индексы двух чисел, сумма которых равна target. Любой набор входных данных имеет ровно одно решение, и вы не можете использовать один и тот же элемент дважды. Ответ можно возвращать в любом порядке...

ANDROMEDA

1. Обзор

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

2. Этапы сборки интеграционного теста Maven

К счастью, Maven имеет встроенную поддержку именно этого сценария со следующими фазами жизненного цикла сборки по умолчанию (из документации Maven ):

  • pre-integration-test : выполнить действия, необходимые перед выполнением интеграционных тестов. Это может включать в себя такие вещи, как настройка необходимой среды.
  • Integration-test : обработайте и при необходимости разверните пакет в среде, где можно запускать интеграционные тесты.
  • post-integration-test : выполнить действия, необходимые после выполнения интеграционных тестов. Это может включать очистку окружающей среды.

3. Настройте грузовой плагин

Давайте рассмотрим необходимые настройки шаг за шагом.

3.1. Исключить интеграционные тесты из подключаемого модуля Surefire

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

<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.22.2</version>
<configuration>
<excludes>
<exclude>**/*IntegrationTest.java</exclude>
</excludes>
</configuration>
</plugin>

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

3.2. Настройте грузовой плагин

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

<plugin>
<groupId>org.codehaus.cargo</groupId>
<artifactId>cargo-maven3-plugin</artifactId>
<version>1.9.9</version>
<configuration>
<configuration>
<properties>
<cargo.servlet.port>8080</cargo.servlet.port>
</properties>
</configuration>
</configuration>
</plugin>

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

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

Чтобы на этапе пакета maven был создан развертываемый военный файл, пакет проекта должен быть <packaging>war</packaging> .

3.3. Добавить новый профиль Maven

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

<profiles>
<profile>
<id>integration</id>
<build>

<plugins>
...
</plugins>

</build>
</profile>
</profiles>

Именно этот профиль будет содержать все остальные детали конфигурации.

Теперь сервер Jetty настроен на запуск на этапе тестирования перед интеграцией и остановку на этапе тестирования после интеграции .

<plugin>
<groupId>org.codehaus.cargo</groupId>
<artifactId>cargo-maven3-plugin</artifactId>
<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 мог принять конфигурацию.

3.4. Настройте интеграционные тесты в новом профиле

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

<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 уже запущен с развернутым проектом, поэтому интеграционные тесты должны пройти без проблем.
  1. Интеграционные тесты теперь включены в выполнение. Чтобы добиться этого, исключения также переопределяются — это связано с тем, как Maven обрабатывает переопределение конфигураций плагинов внутри профилей.

Базовая конфигурация не полностью переопределяется, а дополняется новыми элементами конфигурации внутри профиля.

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

  1. Обратите внимание, что, поскольку существует только один элемент <execution> , нет необходимости определять идентификатор .

Теперь весь процесс может работать:

mvn чистая установка -Pintegration

4. Вывод

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

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

Чтобы получить полностью работающую конфигурацию этого механизма, ознакомьтесь с проектом REST GitHub .

Кроме того, ознакомьтесь с этой статьей , чтобы узнать о передовых методах структурирования проекта и организации модульных и интеграционных тестов.