Вы можете очень легко разделить их, используя категории JUnit и Maven.
Это очень и очень кратко показано ниже с помощью модуля разделения и интеграционных тестов.
Определение интерфейса маркера
Первым шагом в группировке теста с использованием категорий является создание интерфейса маркера.
Этот интерфейс будет использоваться для пометки всех тестов, которые вы хотите запустить, как интеграционных тестов.
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>
Когда вы выполняете mvn clean test, будут выполняться только ваши немаркированные юнит-тесты.
Настройка тестов интеграции Maven
Опять же, конфигурация для этого очень проста.
Для запуска только интеграционных тестов используйте:
<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>
<groups>com.test.annotation.type.IntegrationTest</groups>
</configuration>
</plugin>
Если вы перенесете это в профиль с идентификатором IT
, вы сможете запускать только быстрые тесты, используя mvn clean install
. Чтобы запустить только интеграционные / медленные тесты, используйте mvn clean install -P IT
.
Но чаще всего вы захотите запустить быстрые тесты по умолчанию и все тесты с -P IT
. Если это так, то вы должны использовать трюк:
<profiles>
<profile>
<id>IT</id>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
<excludedGroups>java.io.Serializable</excludedGroups> <!-- An empty element doesn't overwrite, so I'm using an interface here which no one will ever use -->
</configuration>
</plugin>
</plugins>
</build>
</profile>
</profiles>
Как видите, я исключаю тесты, помеченные java.io.Serializable
. Это необходимо, поскольку профиль будет наследовать конфигурацию по умолчанию для плагина Surefire, поэтому даже если вы скажете <excludedGroups/>
или <excludedGroups></excludedGroups>
, будет использоваться значение com.test.annotation.type.IntegrationTest
.
Вы также не можете использовать none
, поскольку это должен быть интерфейс на пути к классам (Maven проверит это).
Примечания:
- Зависимость от
surefire-junit47
необходима, только если Maven не переключается на бегун JUnit 4 автоматически. Использование элемента groups
или excludedGroups
должно активировать переключатель. Смотрите здесь .
- Большая часть кода, приведенного выше, была взята из документации для плагина Maven Failsafe. См. Раздел «Использование категорий JUnit» на этой странице .
- Во время моих тестов я обнаружил, что это работает, даже когда вы используете аннотации
@RunWith()
для запуска комплектов или тестов на основе Spring.