Как разделить модульные и интеграционные тесты с помощью Maven


В теории, модульные тесты не должны зависеть от окружения. Для проверки работоспособности системы в приближенных к реальности условиях, пишутся интеграционные тесты. Для них в maven предусмотрена отдельная фаза сборки проекта.

В этой статье хотелось бы поделиться опытом ее использования.
Прежде всего надо отметить, что поумолчанию мавен считает тестами классы, чьи имена заканчиваются на Test. Интеграционные тесты принято именовать с суффиксом IT.

Стандартная структура мавен-проекта не предусматривает отдельной директории  для интеграционных тестов. Тем не менее, удобно хранить интеграционные и модульные тесты в разных директориях. Для реализации этой идеи существует плагин build-helper-maven-plugin.

Для интеграционных тестов я использую директорию integration-test, которая, по аналогии с директорией test, находится в папке src:
src
   |-- integration-test
   |   |-- java
   |-- main
   |   |-- java
   |   `-- resources
   `-- test
       |-- java
       `-- resources
Чтобы мавен понимал, что делать с этой директорией, воспользуемся плагином:
<plugin>
   <groupid>org.codehaus.mojo</groupid>
   <artifactid>build-helper-maven-plugin</artifactid>
   <version>1.7</version>
   <executions>
      <execution>
         <id>add-test-source</id>
         <phase>generate-test-sources</phase>
         <goals>
            <goal>add-test-source</goal>
         </goals>
         <configuration>
            <sources>
               <source>src/integration-test/java</source>
            </sources>
         </configuration>
      </execution>
   </executions>
</plugin>

Если следовать конвенции об именовании тестов (заканчивать имена модульных тестов *Test, а интеграционных *IT), то проблем с интеграционными тестами на этапе модульного тестирования у вас не возникнет.

Но на этапе непосредственно интеграционного тестирования счастья тоже не произойдет. Для счастья придется потрудиться:
<plugin>
   <groupId>org.apache.maven.plugins</groupId>
   <artifactId>maven-failsafe-plugin</artifactId>
   <executions>
      <execution>
         <id>integration-tests</id>
         <phase>integration-test</phase>
         <goals>
            <goal>integration-test</goal>
            <goal>verify</goal>
         </goals>
         <configuration>
            <skip>false</skip>
            <includes>
               <include>**/*IT.java</include>
            </includes>
         </configuration>
      </execution>
   </executions>
</plugin>

Плагин maven-failsafe-plugin специально предназначен для конфигурирования интеграционных тестов. Приведенный пример конфигурации этого плагина вряд ли требует пояснений.

Кстати, по аналогии существует плагин и для конфигурирования модульных тестов. Называется maven-surefire-plugin. И для порядка, можно явно воспользоваться им:
<plugin>
   <groupId>org.apache.maven.plugins</groupId>
   <artifactId>maven-surefire-plugin</artifactId>
   <executions>
      <execution>
         <id>unit-tests</id>
         <phase>test</phase>
         <goals>
            <goal>test</goal>
         </goals>
         <configuration>
            <excludes>
               <exclude>**/*IT.java</exclude>
            </excludes>
         </configuration>
      </execution>
   </executions>
</plugin>

Очевидно, последние два плагина позволяют формировать собственные договоренности по поводу именования тестовых классов.

Комментариев нет: