Maven/Test

Lorsqu'on parle de tests, on peut distinguer plusieurs ensembles. Ici on se concentre ceux qui concernent directement le développeur, soit les tests unitaires et les tests d'intégration.

Définitions

Test Unitaire

Dans un test unitaires, on vérifie le comportement d'une méthode, ou d'une classe, indépendamment de son environnement. Pour qu'un test soit réellement unitaire, il faut isoler la classe, ce qui se fait avec des Mock Objects.

Ce sont les tests les plus répandus. Pour pratiquement chaque classe qui sera déployée, on fait une classe de test unitaire. Et ces tests peuvent être exécutés très souvent parce qu'ils sont rapides.

Test d'Intégration

Dans un test d'intégration, on teste une partie du logiciel dans son environnement. La définition est vague. De ce fait, cet ensemble englobe plusieurs sortes de tests : tests de classes, tests d'interfaces graphiques,...

Ces tests sont plus lents à s'exécuter, on les joue donc moins systématiquement.

Maven

Surefire

Par défaut dans Maven, les tests sont exécutés par le plugin surefire. Celui-ci exécute les classes du répertoire src/test/java qui commencent ou finissent par "Test" et celle qui finissent par "TestCase". Surefire s'exécute dans la phase de test, entre la compilation et le packaging. Surefire est activé par défaut, il n'y a donc rien à faire pour l'utiliser.

Ce plugin est donc parfait pour les tests unitaires.

Failsafe

Failsafe est un fork de Surefire adapté pour les tests d'intégration. Il s'exécute dans la phase integration-test, donc après le packaging, et exécute par défaut les classes qui commencent ou finissent par "IT" et celle qui finissent par "ITCase". L'autre différence avec surefire, c'est qu'il prend en compte une phase de préparation (pre-integration-test) et une phase de nettoyage (post-integration-test). Ces phases servent typiquement à démarrer et arrêter un DB, un serveur Web, un serveur mail...

Surefire pour les tests d'intégration

Avec surefire, on peut ré-inclure les classes *IT. Dans ce cas, les tests unitaires et d'intégration s'exécuteront dans phase de test.

Initialisation

Pour mieux gérer l'initialisation des tests, et la rendre indépendante de Maven, il y a aussi des solutions. On peut gérer des ressources (web server, mail server) sous forme d'attributs statiques d'une classe dédiée et leur initialisation est déclenchée par les tests plutôt que par maven. Pour que les ressources soient instanciées une fois pour toutes, on exécute les tests dans une suite, et c'est la suite qui initialise les ressources.

Pour que les tests puissent rester indépendants, chaque test vérifie que les ressources dont il a besoin sont initialisées.

Références

Livres

Integration Testing from the Trenches de Nicolas Fränkel