II. Le framework TestNG▲
Le framework, que j'ai choisi de présenter, est jeune et a été développé afin de pallier les manques du framework très connu JUnit (en sa version 3.8).
À l'heure du comparatif des différents frameworks (octobre 2005), JUnit était encore en version 3.8. Lors de la rédaction du site web (mars 2006), la version 4.0 de JUnit a fait son apparition et offre plus de flexibilité et fonctionnalités à JUnit. C'est pourquoi je ferai un point particulier pour parler de JUnit 4.0 comparé à TestNG. Ce point sera moins exhaustif, car non testé et uniquement basé sur les informations du site officiel de JUnit.
II-A. Présentation du framework▲
TestNG est un framework de tests unitaires Java d'une nouvelle génération. En effet il offre la possibilité aux développeurs d'utiliser une des améliorations importantes de Java 1.5, à savoir les annotations.
C'est par ailleurs un framework très simple à mettre en œuvre et à intégrer dans des projets. En effet, TestNG assure une rétrocompatibilité avec les tests JUnit. Il propose par ailleurs un plugin permettant de l'interfacer dans le l'environnement de développement Eclipse.
Ce framework a retenu mon attention durant un comparatif pour d'autres fonctionnalités évoluées qui en font un utilitaire de tests très puissant. Il offre une flexibilité d'écriture, une organisation très ouverte des tests et des fonctionnalités très avancées comme la généralisation des tests.
C'est ainsi que ce framework a été retenu comme framework de tests unitaires pour le projet de Génie Logiciel de 3e année.
II-B. Fonctionnalités▲
Afin de clarifier mes propos, voici un rapide aperçu des différentes fonctionnalités offertes par TestNG :
- Organisation des tests très puissante ;
- Absence de contraintes de nommage ;
- Rétrocompatibilité avec les tests JUnit ou transformation des tests JUnit en tests unitaires TestNG ;
- Attente d'Exception sur les tests ;
- Création de dépendances entre les différents tests ;
- Lancement des tests échoués uniquement ;
- Passage de paramètres aux méthodes de tests ;
- Généralisation des tests grâce à des Factory.
II-C. Comparaison avec JUnit 3.8▲
Pour vous montrer l'intérêt de TestNG, il semble utile de le comparer avec la référence en matière de tests unitaires Java, à savoir JUnit. Nous allons expliquer les différences entre les deux frameworks et nous verrons les intérêts des fonctionnalités citées ci-dessus.
Voici le tableau comparatif des deux frameworks :
Points de comparaison |
JUnit 3.8 |
TestNG 4.4 |
---|---|---|
Intégration à Eclipse |
Totale |
Totale |
Java 1.4 |
Oui |
Oui |
Java 1.5 |
Non |
Oui |
Flexibilité |
Faible |
Très bonne |
Facilité de mise en œuvre |
Très bonne |
Très bonne |
Organisation des tests |
Moyenne |
Très bonne |
Reporting |
Très bon |
Très bon |
Gestion des Exceptions |
Aucune |
Oui |
Passage de paramètres |
Aucun |
Oui |
Généralisation des tests |
Aucune |
Oui |
Compatibilité JUnit |
Oui |
Oui |
Nous allons maintenant pouvoir expliquer les différents points évoqués dans le comparatif et voir les avantages de TestNG
Intégration à Eclipse
L'intégration dans Eclipse est totale pour chacun des frameworks. Au premier abord, on peut penser que le plugin TestNG ne fournit que peu de fonctionnalités à l'utilisateur. En effet, JUnit propose la création des squelettes des classes de tests. Ce n'est pas le cas du plugin TestNG. C'est compréhensible du fait que le framework TestNG n'impose aucune norme de nommage pour les méthodes de tests. Tout est effectué grâce aux annotations.
Support de Java 1.4 et 1.5
Le framework JUnit 3.8 ne profite d'aucune amélioration apportée par la version 1.5 de Java. Il reste le même que lors de la version 1.4. À l'opposé, TestNG utilise les possibilités de Java 1.5 via les annotations qui permettent de définir les classes de tests. TestNG peut aussi être utilisé en environnement Java 1.4 en utilisant les tags Javadoc, mais ce n'est pas l'utilisation préconisée.
Flexibilité de l'écriture des tests
Le framework TestNG est très souple en ce qui concerne l'écriture des tests. En effet la métaprogrammation fournie par les annotations permet de ne pas devoir suivre de convention de nommage. C'est un avantage indéniable sur JUnit qui impose que les méthodes de tests se nomment test***. L'utilisation des annotations permet, par ailleurs, de donner beaucoup d'informations sur le test comme son groupe d'exécution, ses dépendances…
Facilité de la mise en œuvre
Pour ce qui est de la mise en œuvre, aucun framework ne se détache réellement. En effet, dans les deux cas, nous pouvons très rapidement lancer les tests écrits, et ce, avec une facilité déconcertante.
Organisation des tests
Le framework TestNG continue son avancée dans les fonctionnalités. Il permet de regrouper les tests selon des critères propres au développeur. Pour cela, nous utilisons des groupes attribués aux différents tests. Ainsi, nous pouvons ne lancer que certains tests ou bien exclure certains groupes de l'exécution…
Le framework propose aussi d'imposer un ordre d'exécution. Cela peut permettre de s'assurer que certaines méthodes ont été effectuées avant que d'autres ne se lancent
Nous pouvons par ailleurs spécifier que les tests sont lancés de manière mono ou multithreadée afin d'éventuellement tester la concurrence d'accès à certaines ressources…
Le reporting
Dans les deux cas, nous pouvons avoir un très bon reporting de l'exécution des tests. Cela passe par l'utilisation d'un plugin extérieur tel que JUnitReports. TestNG offre aussi la possibilité d'écrire soit même son reporter.
Gestion des Exceptions Java
TestNG apporte une nouvelle fois de l'innovation dans l'écriture des tests en offrant la possibilité d'obliger un test à attendre une Exception Java. Cela permet de tester que les réactions du programme, à des événements non voulus, provoquent bien les levées d'Exception spécifiées dans le cahier des charges.
Passage de paramètres
JUnit est très limité en ce qui concerne les fonctionnalités avancées, il ne permet pas que les méthodes de tests utilisent des paramètres. TestNG offre cette possibilité et permet d'avoir un passage de paramètre statique, grâce au fichier de configuration testng.xml, ou bien de manière dynamique grâce à l'utilisation de deux annotations.
Généralisation des tests
La généralisation des tests consiste à n'écrire qu'une fois le test. Celui-ci sera ensuite instancié plusieurs fois automatiquement. C'est le comportement nommé Facotry dans les Design-Pattern. Lorsque l'on applique ce Design-Pattern à TestNG, nous obtenons une Factory de tests, permettant l'instanciation multiple et automatique d'un test avec des valeurs différentes pour les tests. Nous verrons que cela est très intéressant lorsque l'on veut tester de nombreuses informations (comme une base de données par exemple).
Compatibilité JUnit
TestNG offre des possibilités pour se rendre compatible avec le géant des tests JUnit. Il permet grâce à une information dans le fichier testng.xml, de spécifier que le test à exécuter est un test JUnit. Il existe par ailleurs, une fonctionnalité permettant de migrer les tests JUnit vers des tests TestNG. Cela permet une rétrocompatibilité totale avec JUnit.
II-D. Un point sur JUnit 4.0▲
À l'heure de l'écriture du site web, JUnit 4.0 est sorti en version officielle. Cette nouvelle version se voulait utilisatrice des fonctionnalités de Java 1.5.
Finalement qu'en est-il ? TestNG s'est-il fait rattraper par JUnit ? Est-il devenu obsolète à peine arrivé à maturité ?
Ce sont les questions auxquelles je vais essayer de répondre.
II-D-1. Les nouveautés de JUnit 4.0▲
Le framework JUnit en sa mouture 4.0 propose en effet la gestion de Java 1.5 avec l'utilisation des annotations comme TestNG.
De ce fait, JUnit n'impose désormais plus de norme de nommage des méthodes de tests, des méthodes de configuration telles que la méthode setUp() ou encore de l'obligation d'étendre de la classe TestCase.
Les annotations disponibles dans JUnit 4.0 sont :
- @Test : permet de spécifier que c'est une méthode de test
Elle permet de spécifier, en attribut, l'attente d'Exception Java, et un timeout pour la méthode de test ; - @Ignore : permet de spécifier qu'une méthode de test doit être ignorée ;
- @BeforeClass : méthode appelée au lancement d'une classe de tests ;
- @Before : une méthode annotée ainsi sera l'équivalent de la méthode setUp() pour JUnit 3.8 ;
- @AfterClass : méthode appelée à la fin d'une classe de tests ;
- @After : une méthode annotée ainsi sera l'équivalent de la méthode tearDown() pour JUnit 3.8.
II-D-2. JUnit 4.0 ou TestNG▲
Finalement nous voyons que JUnit 4.0 apporte peu d'évolution par rapport à JUnit 3.8. Les seules avancées sont l'utilisation des annotations, l'arrivée de la gestion des Exception Java et la possibilité d'ignorer un test.
JUnit 4.0 apporte donc beaucoup moins d'innovations qu'attendu par la communauté. Les annotations apportent la flexibilité qui manquait à l'écriture des tests.
On peut donc affirmer que TestNG reste un framework innovant et très avancé au niveau des fonctionnalités. La gestion des paramètres et la généralisation des tests par l'utilisation du pattern Factory restent des exclusivités. Cela est de bon augure pour l'avenir du framework qui garde une longueur d'avance sur JUnit.
De même le système d'organisation des tests JUnit n'a pas évolué et TestNG reste en avance grâce à l'utilisation complexe de groupes de tests…
On peut en conclure que le choix de TestNG dans un projet reste tout à fait valable dès lors que nous allons utiliser les fonctionnalités exclusives et avancées de TestNG. Pour les autres cas d'utilisation, le choix se fera selon les préférences du programmeur.
II-D-3. Tableau récapitulatif▲
Points de comparaison |
JUnit 3.8 |
TestNG 4.4 |
---|---|---|
Intégration à Eclipse |
Totale |
Totale |
Java 1.4 |
Oui |
Oui |
Java 1.5 |
Oui |
Oui |
Flexibilité |
Très bonne |
Très bonne |
Facilité de mise en œuvre |
Très bonne |
Très bonne |
Organisation des tests |
Moyenne |
Très bonne |
Reporting |
Très bon |
Très bon |
Gestion des Exceptions |
Oui |
Oui |
Passage de paramètres |
Aucun |
Oui |
Généralisation des tests |
Aucune |
Oui |
Compatibilité JUnit |
Oui |
Oui |