Вы можете легко разделить их с помощью категорий 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.