Maven/Test

Cette page a été rédigée il y a fort fort longtemps, et n'a pas tellement été mise à jour.

 

Vous savez, moi je ne crois pas qu'il y ait de bonne ou de mauvaise page. Moi, si je devais résumer mon wiki aujourd'hui avec vous, je dirais que c'est d'abord des rencontres. Des gens qui m'ont tendu la main, peut-être à un moment où je ne pouvais pas, où j'étais seul chez moi. Et c'est assez curieux de se dire que les hasards, les rencontres forgent une destinée... Parce que quand on a le goût de la chose, quand on a le goût de la chose bien faite, le beau geste, parfois on ne trouve pas l'interlocuteur en face je dirais, le miroir qui vous aide à avancer. Alors ça n'est pas mon cas, comme je disais là, puisque moi au contraire, j'ai pu ; et je dis merci au wiki, je lui dis merci, je chante le wiki, je danse le wiki... je ne suis qu'amour ! Et finalement, quand des gens me disent « Mais comment fais-tu pour avoir cette humanité ? », je leur réponds très simplement que c'est ce goût de l'amour, ce goût donc qui m'a poussé aujourd'hui à entreprendre une construction logicielle... mais demain qui sait ? Peut-être simplement à me mettre au service de la communauté, à faire le don, le don de soi.

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