Статьи

Модульные и интеграционные тесты с категориями Maven и JUnit

Вступление

В этом примере показано, как разделить модульные и интеграционные тесты с использованием категорий Maven и JUnit.
Это особенно полезно для существующих наборов тестов и может быть реализовано за несколько минут за 3 простых шага.

Зачем использовать это?

В моем предыдущем посте было показано, как использовать профиль maven для разделения модульных и интеграционных тестов.
http://johndobie.blogspot.co.uk/2011/06/seperating-maven-unit-integration-tests.html
Это очень хорошо прочитанный пост, и мне нравится, как он использует отдельные каталоги.
Однако этот пример демонстрирует гораздо более простую технику, которую можно легко применить к устаревшим тестовым наборам.
Он предлагает большинство преимуществ оригинала и более удобно расположен в мире Maven.

Код

Код для примера здесь.

svn co https://designbycontract.googlecode.com/svn/trunk/examples/maven/categories
mvn clean install

JUnit Категории

Начиная с JUnit 4.8 вы можете определять свои собственные категории для тестов. Это позволяет маркировать и группировать тесты.

В этом примере показано, как легко разделить тестовый модуль и интеграционный тест с помощью аннотации @Catgegory.
http://kentbeck.github.com/junit/javadoc/latest/org/junit/experimental/categories/Categories.html

Определить интерфейс маркера

Первым шагом в группировке теста с использованием категорий является создание интерфейса маркера.

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

public interface IntegrationTest {}

Отметьте свои тестовые занятия

Затем мы добавляем аннотацию категории в начало вашего тестового класса.

Он принимает имя вашего нового интерфейса в качестве параметра.

import org.junit.experimental.categories.Category;
@Category(IntegrationTest.class)
public class ExampleIntegrationTest{

 @Test
 public void longRunningServiceTest() throws Exception {
     
 }
}

Категории могут использоваться для маркировки классов или методов. На самом деле, на мой взгляд, вы должны только отметить класс.

Если у вас есть как модульные, так и интеграционные тесты в одном классе, разделите их.

Настройка Maven модульных тестов

Прелесть этого решения заключается в том, что ничего не меняется с точки зрения модульного тестирования.

Мы просто добавляем некоторую конфигурацию в плагин maven surefire, чтобы он игнорировал любые интеграционные тесты.

<plugin>
<groupid>org.apache.maven.plugins</groupid>
<artifactid>maven-surefire-plugin</artifactid>
<version>2.11</version>
<dependencies>
 <dependency>
  <groupid>org.apache.maven.surefire</groupid>
  <artifactid>surefire-junit47</artifactid>
  <version>2.12</version>
 </dependency>
</dependencies>
<configuration>
 <includes>
  <include>**/*.class</include>
 </includes>
 <excludedgroups>com.test.annotation.type.IntegrationTest</excludedgroups>
</configuration>
</plugin>

Есть 2 очень важные части. Во-первых, необходимо настроить верный запуск, чтобы исключить все тесты интеграции.

Surefire выполнит все ваши тесты, кроме помеченных как интеграционные тесты.

<excludedgroups>com.test.annotation.type.IntegrationTest</excludedgroups> 

Другая важная часть — убедиться, что плагин surefire использует правильный провайдер JUnit.

Поставщик JUnit47 необходим для правильного определения категорий.

<dependencies>
 <dependency>
  <groupid>org.apache.maven.surefire</groupid>
  <artifactid>surefire-junit47</artifactid>
  <version>2.12</version>
 </dependency>
</dependencies>

Запуск юнит-тестов

Чтобы убедиться, что это работает правильно, мы можем запустить модульные тесты

mvn clean test

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

-------------------------------------------------------
 T E S T S
-------------------------------------------------------
Running com.test.EmptyUnitTest
Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0 sec

Results :

Tests run: 1, Failures: 0, Errors: 0, Skipped: 0

[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------

Настроить интеграционные тесты Maven

Опять же, конфигурация для этого очень проста.

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

<plugin>
 <artifactid>maven-failsafe-plugin</artifactid>
 <version>2.12</version>
 <dependencies>
  <dependency>
   <groupid>org.apache.maven.surefire</groupid>
   <artifactid>surefire-junit47</artifactid>
   <version>2.12</version>
  </dependency>
 </dependencies>
 <configuration>
  <groups>com.test.annotation.type.IntegrationTest</groups>
 </configuration>
 <executions>
  <execution>
   <goals>
    <goal>integration-test</goal>
   </goals>
   <configuration>
    <includes>
     <include>**/*.class</include>
    </includes>
   </configuration>
  </execution>
 </executions>
</plugin>

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

Следующая конфигурация обеспечивает выполнение только интеграционных тестов.

<groups>com.test.annotation.type.IntegrationTest</groups>

И снова провайдер JUnit должен быть правильно настроен.

<dependencies>
 <dependency>
  <groupid>org.apache.maven.surefire</groupid>
  <artifactid>surefire-junit47</artifactid>
  <version>2.12</version>
 </dependency>
</dependencies>

Это оно!

Запуск интеграционных тестов

Теперь мы можем запустить всю сборку.

mvn clean install

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

-------------------------------------------------------
 T E S T S
-------------------------------------------------------
Running com.test.AnotherEmptyIntegrationTest
Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.016 sec

Running com.test.EmptyIntegrationTest
Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0 sec

Results :
Tests run: 2, Failures: 0, Errors: 0, Skipped: 0 

Более подробная информация

Для получения дополнительной информации и других статей перейдите по этой ссылке. 
http://johndobie.blogspot.co.uk/2012/04/unit-and-integration-tests-with-maven.html