Вступление
В этом примере показано, как разделить модульные и интеграционные тесты с использованием категорий 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