Vous pouvez les diviser très facilement en utilisant les catégories JUnit et Maven.
Ceci est montré très, très brièvement ci-dessous en fractionnant les tests unitaires et d'intégration.
Définir une interface de marqueur
La première étape du regroupement d'un test à l'aide de catégories consiste à créer une interface de marqueurs.
Cette interface sera utilisée pour marquer tous les tests que vous souhaitez exécuter comme tests d'intégration.
public interface IntegrationTest {}
Marquez vos classes de test
Ajoutez l'annotation de catégorie en haut de votre classe de test. Il prend le nom de votre nouvelle interface.
import org.junit.experimental.categories.Category;
@Category(IntegrationTest.class)
public class ExampleIntegrationTest{
@Test
public void longRunningServiceTest() throws Exception {
}
}
Configurer les tests unitaires Maven
La beauté de cette solution est que rien ne change vraiment pour le côté test unitaire des choses.
Nous ajoutons simplement une configuration au plugin maven surefire pour qu'il ignore les tests d'intégration.
<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>
Lorsque vous effectuez un test de nettoyage mvn, seuls vos tests unitaires non marqués seront exécutés.
Configurer les tests d'intégration Maven
Là encore, la configuration est très simple.
Pour exécuter uniquement les tests d'intégration, utilisez ceci:
<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>
Si vous encapsulez ceci dans un profil avec id IT
, vous ne pouvez exécuter que les tests rapides à l'aide de mvn clean install
. Pour exécuter uniquement les tests d'intégration / lent, utilisez mvn clean install -P IT
.
Mais le plus souvent, vous voudrez exécuter les tests rapides par défaut et tous les tests avec -P IT
. Si tel est le cas, vous devez utiliser une astuce:
<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>
Comme vous pouvez le voir, j'exclus les tests annotés avec java.io.Serializable
. Ceci est nécessaire car le profil héritera de la configuration par défaut du plugin Surefire, donc même si vous dites <excludedGroups/>
ou <excludedGroups></excludedGroups>
, la valeur com.test.annotation.type.IntegrationTest
sera utilisée.
Vous ne pouvez pas non plus l'utiliser none
car il doit s'agir d'une interface sur le chemin de classe (Maven vérifiera cela).
Remarques:
- La dépendance à
surefire-junit47
n'est nécessaire que lorsque Maven ne bascule pas automatiquement vers le runner JUnit 4. L'utilisation de l' élément groups
ou excludedGroups
devrait déclencher le commutateur. Regardez ici .
- La plupart du code ci-dessus a été extrait de la documentation du plugin Maven Failsafe. Consultez la section "Utilisation des catégories JUnit" sur cette page .
- Au cours de mes tests, j'ai constaté que cela fonctionne même lorsque vous utilisez des
@RunWith()
annotations pour exécuter des suites ou des tests basés sur Spring.