IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)

TestNG, un autre framework de tests unitaires Java

TestNG, un autre framework de tests unitaires Java


précédentsommairesuivant

2. Le framework TestNG

Le framework, que j'ai choisi de présenter, est jeune et a été développé afin de palier aux manques du framework très connu JUnit (en sa version 3.8).

A 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.

2.1. 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 oeuvre et à intégrer dans des projets. En effet, TestNG assure une rétro-compatibilité 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 3ième année.

2.2. 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étro-compatibilité 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

2.3. 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 oeuvre 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. A 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éconnisé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éta-programmation 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 permettent, par ailleurs, de donner beaucoup d'informations sur le test comme son groupe d'exécution, ses dépendances...

Facilité de la mise en oeuvre

Pour ce qui est de la mise en oeuvre, 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 lance
Nous pouvons par ailleurs spécifier que les tests sont lancés de manière mono ou multi-threadé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étro-compatibilité totale avec JUnit.

2.4. Un point sur JUnit 4.0

A 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.
Au final 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.

2.4.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

2.4.2. JUnit 4.0 ou TestNG

Au final 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 bonne 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.

2.4.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 oeuvre 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

précédentsommairesuivant

Copyright © 2007 Sébastien Palud. Aucune reproduction, même partielle, ne peut être faite de ce site ni de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.