Mettre en place des tests automatisés avec Ant est aussi relativement facile, bien que cela requiert un peu plus de plomberie qu’avec Maven. En particulier, Ant ne fournit pas directement les librairies JUnit et les tâches Ant adaptées, donc il faut les installer soi-même quelque part. L’approche la plus portable est d’utiliser un outil de Gestion de dépendances tel qu’Ivy, ou de placer les fichiers JAR correspondants dans un répertoire à l’intérieur de la structure de votre projet.
Pour lancer les tests avec Ant, vous appelez la tâche
<junit>
. Une configuration typique adaptée
à Jenkins est présentée dans cet exemple :
<property name="build.dir" value="target" /> <property name="java.classes" value="${build.dir}/classes" /> <property name="test.classes" value="${build.dir}/test-classes" /> <property name="test.reports" value="${build.dir}/test-reports" /> <property name="lib" value="${build.dir}/lib" /> <path id="test.classpath"> <pathelement location="/jenkins-guide-complet/hudsonbook-content-fr/tools/junit/*.jar" /> <pathelement location="${java.classes}" /> <pathelement location="${lib}" /> </path> <target name="test" depends="test-compile"> <junit haltonfailure="no" failureproperty="failed"> <classpath> <path refid="test.classpath" /> <pathelement location="${test.classes}" /> </classpath> <formatter type="xml" /> <batchtest fork="yes" forkmode="perBatch" todir="${test.reports}"> <fileset dir="${test.src}"> <include name="**/*Test*.java" /> </fileset> </batchtest> </junit> <fail message="TEST FAILURE" if="failed" /> </target>
Si vous préférez TestNG, Ant est évidemment bien supporté également. En utilisant TestNG pour l’exemple précédent, vous pourriez faire quelque chose comme ceci :
<property name="build.dir" value="target" /> <property name="java.classes" value="${build.dir}/classes" /> <property name="test.classes" value="${build.dir}/test-classes" /> <property name="test.reports" value="${build.dir}/test-reports" /> <property name="lib" value="${build.dir}/lib" /> <path id="test.classpath"> <pathelement location="${java.classes}" /> <pathelement location="${lib}" /> </path> <taskdef resource="testngtasks" classpath="lib/testng.jar"/> <target name="test" depends="test-compile"> <testng classpathref="test.classpath" outputDir="${testng.report.dir}" haltonfailure="no" failureproperty="failed"> <classfileset dir="${test.classes}"> <include name="**/*Test*.class" /> </classfileset> </testng> <fail message="TEST FAILURE" if="failed" /> </target>
TestNG est une librairie de test très flexible, et la tâche TestNG a beaucoup plus d’options que ça. Par exemple, pour lancer seulement les tests définis comme faisant partie du groupe “integration-test” que nous avons vu précédemment, nous pourrions faire ça :
<target name="integration-test" depends="test-compile">
<testng classpathref="test.classpath"
groups="integration-test"
outputDir="${testng.report.dir}"
haltonfailure="no"
failureproperty="failed">
<classfileset dir="${test.classes}">
<include name="**/*Test*.class" />
</classfileset>
</testng>
<fail message="TEST FAILURE" if="failed" />
</target>
Ou pour lancer les tests en parallèle, en utilisant quatre threads concurrents, vous pourriez faire ça :
<target name="integration-test" depends="test-compile"> <testng classpathref="test.classpath"parallel="true"
threadCount=4
outputDir="${testng.report.dir}" haltonfailure="no" failureproperty="failed"> <classfileset dir="${test.classes}"> <include name="**/*Test*.class" /> </classfileset> </testng> <fail message="TEST FAILURE" if="failed" /> </target>