Mise en oeuvre de TestNG : Ant versus Gradle
TestNG est un framework de test basé sur Junit apportant plusieurs fonctionnalités comme
- Distribution sur plusieurs machines
- Modèle d’exécution avancé
- Configuration flexible
Ce billet montre un exemple de mise en œuvre du framework TestNG avec le builder Ant et le builder Gradle.
Dans l’exemple de ce billet, nous avons en entrée la structure suivante
- src/test/java : contient nos sources de tests TestNG
- src/test/resources : contient nos ressources de tests, en particulier le fichier TestNG “testng.xml” décrivant la suite de tests à exécuter
-
<suite name=“SuiteExample” verbose=“1” >
-
<test name=“TestSetApp” annotations=“JDK” verbose=“1”>
-
<classes>
-
<class name=“com.zenika.example1.AppTest” />
-
</classes>
-
</test>
-
</suite>
Ce fichier sera utilisé uniquement dans le cadre de Ant. En Gradle, nous avons choisis de générer dynamiquement ce fichier.
Cas du builder Ant
-
<project name=“testng-example”>
-
<property name=“test.src” value=“src/test/java”/>
-
<property name=“test.resources.dir” value=“src/test/resources”/>
-
<property name=“build.dir” value=“build”/>
-
<property name=“test.build.dir” value=“${build.dir}/test-classes”/>
-
<property name=“testng.result.dir” value=“${build.dir}/test-results”/>
-
<property name=“testng.report.dir” value=“${build.dir}/reports/tests”/>
-
<path id=“testng.classpath”>
-
<pathelement location=“lib/testng-5.8-jdk15.jar”/>
-
</path>
-
<path id=“test.compile”>
-
<path refid=“testng.classpath”/>
-
</path>
-
<path id=“test.run”>
-
<path refid=“test.compile”/>
-
<path location=“${test.build.dir}”/>
-
</path>
-
<target name=“clean”>
-
<delete dir=“${testng.result.dir}”/>
-
<delete dir=“${testng.report.dir}”/>
-
<delete dir=“${test.build.dir}”/>
-
<delete dir=“${build.dir}”/>
-
</target>
-
<target name=“test-init”>
-
<mkdir dir=“${build.dir}”/>
-
<mkdir dir=“${test.build.dir}”/>
-
<mkdir dir= “${testng.result.dir}”/>
-
<mkdir dir=“${testng.report.dir}”/>
-
</target>
-
<target name=“test-compile” depends=“test-init”>
-
<javac srcdir=“${test.src}” source=“1.5” target=“1.5” destdir=“${test.build.dir}”>
-
<classpath refid=“test.compile”/>
-
</javac>
-
</target>
-
<target name=“test-run” depends=“test-compile”>
-
<taskdef name=“testng”
-
classname=“org.testng.TestNGAntTask” classpathref=“testng.classpath”/>
-
<testng classpathref=“test.run”
-
outputDir=“${testng.report.dir}”>
-
<xmlfileset dir=“${test.resources.dir}” includes=“testng.xml”/>
-
</testng>
-
</target>
-
<target name=“test-report” depends=“test-run”>< /span>
-
<junitreport todir=“${testng.result.dir}”>
-
<fileset dir=“${testng.report.dir}”>
-
<include name=“*/*.xml”/>
-
</fileset>
-
<report format=“noframes” todir=“${testng.report.dir}”/>
-
</junitreport>
-
</target>
-
</project>
Nous définissons plusieurs paths dont un path “testng.classpath” contenant la librairie “testng”. La librairie est située à la racine du projet dans un répertoire “lib”. Ensuite, le script Ant contient les cibles suivantes
- Une cible “test-init” qui va créer l’ensemble des répertoires nécessaires
- Une cible “test-compile” qui va compiler notre code source de tests
- Une cible “test-run” qui va executer les tests TestNG. Cette cible charge la tâche Ant “testng” puis l’invoque avec en entrée le fichier de ressources “testng.xml”. Il est à noter que la librairie testng est utile pour le classpath d’exécution et contient également la tâche Ant
Appel
L’invocation de la commande “ant clean test-report” détruit tous les éventuels résultats précédents, puis lance les tests; enfin un rapport Junit HTML est produit.
Cas du builder Gradle
Avec le builder Gradle, nous avons le script suivant
-
usePlugin(‘java’)
-
repositories {
-
flatDir name: ‘localRepository’, dirs: ‘lib’
-
}
-
dependencies {
-
testCompile “:testng:5.8:jdk15”
-
}
-
test {
-
setStopAtFailuresOrErrors(false)
-
enableTestReport()
-
useTestNG() {
-
suiteXmlBuilder().suite(name: ‘testing-testng’& #41; {
-
test (name : ‘testing-testng’, annotations : ‘JDK’, verbose:‘1’) {
-
classes {
-
‘class’ (name: ‘com.zenika.example1.AppTest’)
-
}
-
}
-
}
-
}
-
}
-
task reportTests(dependsOn:test) <<{
-
ant{
-
junitreport(todir:testResultsDir){
-
fileset(dir:testReportDir){
-
include(name:“**/*.xml”)
-
}
-
report(format:“noframes”, todir:testReportDir)
-
}
-
}
-
}
Tout premièrement, nous définissions l’utilisation du plugin “java” qui fournit les conventions de répertoires (en particulier “src/test/java” pour les sources Java des tests) et un ensemble de tâches (en particulier “compileTests” et “test” pour la compilation et l’exécution des tests).
Nous avons ensuite la section suivante décrivant les entrepôts de librairies et la récupération de ces librairies.
-
repositories {
-
flatDir name: ‘localRepository’, dirs: ‘lib’
-
}
-
dependencies {
-
testCompile “:testng:5.8:jdk15”
-
}
Nous déclarons l’utilisation de la librairie “testng” dans un repository local, localisé dans le répertoire “lib” à la racine du projet.
Puis dans la tâche “test”, nous définissions explicitement les points suivant
- Ne pas arrêter le build si un test est en erreur ou en failure
- Générer un rapport de test
- Une suite de test TestNG. Elle est construite dynamiquement, avec le même contenu que le fichier “testng.xml” utilisé précédemment pour Ant.
Enfin, nous définissions une tâche de reporting pour produire un rapport Junit HTML de nos tests TestNG. Pour cela, nous avons redéfinit la tâche Ant junitreport.
Appel
L’invocation de la commande “gradle clean reportTests” détruit tous les éventuels résultats précédents, puis lance les test
s; enfin un rapport Junit HTML est produit.