TestNG, nouveau framework de tests unitaires Java
Lancement d'une classe de tests
Dans cette partie, nous allons pouvoir constater que l'organisation des tests est un des points forts du framework TestNG. En effet, les possibilités offertes sont très importantes. Par ailleurs nous verrons les techniques les plus utiles de lancement des tests, à savoir grâce au plugin Eclipse et grâce à une tâche Ant.
Création du fichier testng.xml
Le fichier testng.xml est le fichier de configuration du lancement des tests. Il permet de configurer les tests à lancer en fonction de leurs packages, classes, groupes ou encore par groupes de groupes! La DTD de ce fichier .xml permet vraiment énormément de configurations.
Un fichier de configuration s'articule autour de deux éléments que sont la suite qui représente l'ensemble des tests à lancer, et les test qui représentent chaques tests devant être lancés. Un test peut contenir plusieurs classes ou groupes de tests.
Chacun de ces éléments peuvent avoir un nom. La suite comporte un attribut permettant de spécifier le niveau de log à afficher.
Exemple de fichier :
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >
<suite name="Suite" verbose="5" >
<test name="TestNum1" >
...
</test>
<test name="TestNum2" >
...
</test>
.
.
.
<test name="TestNumN" >
...
</test>
</suite>
Schéma de la DTD du fichier testng.xml

Les organisations possibles des tests
Nous pouvons organiser nos lancement de tests selon plusieurs axes :
- Les packages de tests
Nous pouvons demander à ce que tout un package soit inclus au lancement du test. Cela limite les lignes de configuration d'ajout de classes de tests.
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" > <suite name="SuitePackage" verbose="5" > <test name="FirstTest" > <packages> <package name="test.testPkg" /> </packages> </test> </suite>
Ici toutes les classes du package test.testPkg comportant des tests seront ajoutées au premier test nommé FirstTest.
- Les classes de tests
Ici nous ajouterons les classes contenant des tests TestNG à notre test.
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" > <suite name="SuiteClass" verbose="5" > <test name="FirstTest" > <classes > <class name="test.testClass.TestSample1" /> <class name="test.testClass.TestSample2" /> </classes > </test> </suite>
- Les méthodes de tests d'une classe
Ici nous spécifierons les méthodes de tests que nous voulons lancer sur les classes. Cela permet un affinement des exécutions.
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" > <suite name="SuiteClass" verbose="5" > <test name="FirstTest"> <classes> <class name="test.testClass.TestSample1"> <methods> <include name=".*enabledTestMethod.*"/> <exclude name=".*brokenTestMethod.*"/> </methods> </class> </classes> </test> </suite>
Ici nous voyons que nous avons ajouté les tests des méthodes contenant le mot enabledTestMethod et exclu les méthodes contenant brokenTestMethod.
- Les groupes de tests
C'est sûrement la fonctionnalité la plus intéressante proposée par TestNG. Le lancement des tests en fonction des groupes permet d'avoir des fichier très précis en ce qui concerne les tests à effectuer.
Nous pouvons regrouper les groupes dans d'autres groupes pour une question de lisibilité. Nous pouvons aussi exclure certains groupes des exécutions. Les tests seront alors notés comme Skipped dans les rapports. Cette exclusion est utile pour les tests que nous voulons ignorer, en lieu et place de l'attribut enabled, qui ignore le test et l'empêche d'apparaître dans les rapports.Exemple d'utilisation des groupes avec exclusion
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" > <suite name="SuiteClass" verbose="5" > <test name="FirstTest"> <groups> <run> <include name="groupOk.*"/> <exclude name="groupNonOk.*"/> </run> </groups> <classes> <class name="test.testClass.TestSample1"/> </classes> </test> </suite>
Ici nous voyons que nous lancerons les tests du groupe groupOk contenus dans la classe test.testClass.TestSample1 et nous excluerons les tests du groupe groupNonOk.
Exemple de groupes de groupes
Ici nous allons regrouper les groupes et nous demanderons de lancer le regroupement.
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" > <suite name="SuiteClass" verbose="5" > <test name="FirstTest"> <groups> <define name="multipleTestGroup"> <include name="firstGroupTest"/> <include name="secondGroupTest"/> </define> <define name="allGroups"> <include name="multipleTestGroup"/> <include name="singleTestGroup"/> </define> <run> <include name="allGroups"/> </run> </groups> <classes> <class name="test.testClass.TestSample1"/> </classes> </test> </suite>
Nous avons effectuer plusieurs inclusions de groupes dans des groupes de plus haut niveau (multipleTestGroup puis allGroups). C'est ce dernier groupe ci qui sera lancé à l'appel du test et donc ce sont les groupes contenus qui seront utilisés. Les méthodes lancées seront celles correspondant au groupe allGroups contenues dans la classe test.testClass.TestSample1.
Au final, énormément de possibilités sont offertes; au programmeur de les utiliser à bon escient.
Création par le plugin Eclipse
Le plugin Eclipse permet de créer son fichier testng.xml grâce à une interface graphique offrant globalement les mêmes fonctionnalités.
Aperçu d'une configuration par le plugin

Ainsi nous pouvons ajouter des classes ou des groupes ou encore se baser sur un fichier déjà créé.
Lancement des tests
TestNG permet que les tests soient lancés de plusieurs manières :
- Par le plugin Eclipse
- Par une classe Java
- En ligne de commandes
- Par une tâche Ant
Nous allons maintenant voir comment lancer les tests grâce au plugin (pour son reporting) et grâce à une tâche Ant (pour l'automatisation des lancements).
Lancement grâce au plugin Eclipse
Le plugin Eclipse permet de lancer par une interface graphique les tests définis. C'est la même interface que celle utilisée pour définir la suite de test contenue dans le fichier testng.xml.
Une View Eclipse est disponible pour voir les résultats des tests. Elle permet aussi de relancer les tests préalablement échoués.
Lancement d'une suite de test :

Une fois le test exécuté, nous pouvons regarder les résultats dans la vue TestNG.
Nous pouvons voir beaucoup d'informations et effectuer quelques actions :
- Résumé des tests exécutés : nombre de tests lancés, réussis, échoués et ignorés.
- Résumé de chaque méthode de test échouée : l'erreur java qui a causé le plantage du test.
- Relance de tous les tests du fichier de configuration testng.xml.
- Relance des tests échoués uniquement.
Voici la vue de reporting générale :

Et la vue de reporting d'un test échoué :

Lancement grâce à une tâche Ant
Nous venons de voir comment utiliser le plugin Eclipse. Mais ce n'est pas quelque chose d'automatique et encore moins portable.
En effet l'installation du plugin est nécessaire pour bénéficier de ces fonctionnalités. Nous allons voir une méthode plus propre et plus adaptée au déploiement et à des clients des applications.
Je veux bien entendu parler d'une tâche Ant.
La tâche Ant permet d'effectuer plus de choses à l'exécution des tests. En effet, nous pouvons configurer les rapports de tests afin d'avoir des rapports au format HTML notamment.
Cela est très utile pour avoir des traces de nos tests, et ces rapports sont très appréciés dans le cadre d'un projet.
Nous allons donc voir les éléments de base de la tâche Ant. La partie concernant les rapports sera traitée par la suite.
Voici les éléments concernant la configuration de TestNG, comme l'inclusion de la librairie pour Ant :
<!-- Création d'un projet Ant -->
<project name="testng" default="base">
<!-- Spécification de propriétés utilisées par la suite -->
<property name="bin.dir" value="bin/"/>
<property name="lib.dir" value="lib/"/>
<property name="src.dir" value="src/"/>
<property name="src.dir.app" value="src/"/>
<!-- Définition d'un path -->
<path id="class.path">
<fileset dir="${lib.dir}">
<!-- Ajout des jar de TestNG au path pour la suite de l'exécution -->
<include name="*.jar" />
</fileset>
<path location="${bin.dir}"/>>
</path>
...
</project>
Vient ensuite la partie concernant la définition des tâches Ant concernant les exécutions TestNG à proprement parlé :
<!-- Création d'une tâche Ant -->
<target name="base">
<!-- Déclaration que c'est une tâche pour TestNG -->
<taskdef name="testng" classname="org.testng.TestNGAntTask" classpathref="class.path"/>
<!-- Utilisation du path défini précédemment -->
<!-- On continue l'exécution malgré un test échoué -->
<testng classpathref="class.path" haltOnfailure="false">
<!-- Spécification de la localisation du fichier testng.xml à exécuter -->
<xmlfileset dir="${src.dir.app}/base" includes="testng.xml"/>
<!-- Spécification d'un argument à la JVM : activation des annotations -->
<jvmarg value="-ea"/>
</testng>
</target>
Nous avons vu comment écrire une tâche pour l'outil commun Ant. L'exécution se fait comme n'importe quelle tâche Ant.
Nous pouvons désormais passer aux différents exemples des fonctionnalités de TestNG décrites plus haut.
Nous voyons ici la vue Eclipse permettant le lancement des différents exemples.
