Ви можете розділити їх дуже легко, використовуючи категорії JUnit та Maven.
Це показано дуже, дуже коротко нижче, розбиваючи модуль та інтеграційні тести.
Визначте інтерфейс маркера
Перший крок у групуванні тесту за допомогою категорій - це створення інтерфейсу маркера.
Цей інтерфейс буде використовуватися для позначення всіх тестів, які потрібно запустити як інтеграційні тести.
public interface IntegrationTest {}
Позначте свої тестові класи
Додайте примітку до категорії у верхній частині свого тестового класу. Він приймає назву вашого нового інтерфейсу.
import org.junit.experimental.categories.Category;
@Category(IntegrationTest.class)
public class ExampleIntegrationTest{
@Test
public void longRunningServiceTest() throws Exception {
}
}
Налаштування тестів Maven Unit
Краса цього рішення полягає в тому, що насправді нічого не змінюється для одиничної тестової сторони речей.
Ми просто додаємо деяку конфігурацію до плагіна 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, запускаються лише ваші тести без маркування.
Налаштувати тести інтеграції 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
оскільки це повинен бути інтерфейс на classpath (Maven перевірить це).
Примітки:
- Залежність до
surefire-junit47
цього потрібна лише тоді, коли Maven не перемикається автоматично на бігун JUnit 4. Використання groups
або excludedGroups
елемент повинен викликати перемикач. Дивіться тут .
- Більшість наведених вище кодів було взято з документації на плагін Maven Failsafe. Дивіться розділ "Використання категорій JUnit" на цій сторінці .
- Під час моїх тестів я виявив, що це працює навіть тоді, коли ви використовуєте
@RunWith()
примітки для запуску наборів або тестів на основі Spring.