Comment puis-je utiliser JUnit tests lors de mon script Ant tout en omettant de classes de test à partir de mon résultant pot?

Je suis en utilisant le Bonjour à tout le Monde avec tutoriel Ant de la Fourmi manuel pour apprendre à propos de la Fourmi.

La dernière partie de ce tutoriel consiste en l'ajout d'JUnit tests pour le projet.

J'ai tout fonctionne comme décrit dans le tutoriel et je suis maintenant à faire quelques changements mineurs.

L'un des changements que je voudrais faire est d'exécuter les tests de construire, mais pas l' *Test.class fichiers se retrouvent en finale .fichier jar de l'application. C'est parce que l'éventuel projet je vais travailler sur sera pour un appareil d'espace disque limité, et pour seulement un sous-ensemble de Java SDK, donc je préfère simplement ignorer ces fichiers de test entièrement à partir du pot.

Comment puis-je faire cela?

Il serait assez facile de créer deux pots, l'un pour les tests et un pour le déploiement, mais cela semble moins qu'idéales.

Mon actuel build.xml fichier ci-dessous.

<property name="src.dir"     value="src"/>
<property name="build.dir"   value="build"/>
<property name="classes.dir" value="${build.dir}/classes"/>
<property name="jar.dir"     value="${build.dir}/jar"/>
<property name="lib.dir"     value="lib"/>
<property name="report.dir"  value="${build.dir}/junitreport"/>
<property name="main-class"  value="oata.HelloWorld"/>
<path id="classpath">
<fileset dir="${lib.dir}" includes="**/*.jar"/>
<path location="[LocalPath]/junit-4.8.2.jar"/>
</path>
<path id="application" location="${jar.dir}/${ant.project.name}.jar"/>
<target name="clean">
<delete dir="${build.dir}"/>
</target>
<target name="compile">
<mkdir dir="${classes.dir}"/>
<javac srcdir="${src.dir}" destdir="${classes.dir}" classpathref="classpath"/>
<copy todir="${classes.dir}">
<fileset dir="${src.dir}" excludes="**/*.java"/>
</copy>
</target>
<target name="jar" depends="compile">
<mkdir dir="${jar.dir}"/>
<jar destfile="${jar.dir}/${ant.project.name}.jar" basedir="${classes.dir}">
<manifest>
<attribute name="Main-Class" value="${main-class}"/>
</manifest>
</jar>
</target>
<target name="junit" depends="jar">
<mkdir dir="${report.dir}"/>
<junit printsummary="yes" haltonfailure="yes" showoutput="yes">
<classpath>
<path refid="classpath"/>
<path refid="application"/>
</classpath>
<formatter type="xml"/>
<batchtest fork="yes">
<fileset dir="${src.dir}" includes="*Test.java"/>
</batchtest>
</junit>
</target>
<target name="junitreport" depends="junit">
<junitreport todir="${report.dir}">
<fileset dir="${report.dir}" includes="TEST-*.xml"/>
<report todir="${report.dir}"/>
</junitreport>
</target>
<target name="run" depends="junit">
<java fork="true" classname="${main-class}">
<classpath>
<path refid="classpath"/>
<path refid="application"/>
</classpath>
</java>
</target>
<target name="clean-build" depends="clean,junit"/>
<target name="main" depends="clean,run"/>

Une chose que j'ai essayé, c'est de modifier le pot de commande pour exclure l' *Test.class fichiers

...
<jar destfile="${jar.dir}/${ant.project.name}.jar" basedir="${classes.dir}" excludes="**/*Test.class">
...

avec succès exclut les classes de test, mais alors quand les tests sont exécutés via junit cible, il échoue à la suite de trace de la pile lors de l'exécution avec -v:

[LocalPath]\build.xml:44: Test HelloWorldTest failed
at org.apache.tools.ant.taskdefs.optional.junit.JUnitTask.actOnTestResult(JUnitTask.java:1863)
at org.apache.tools.ant.taskdefs.optional.junit.JUnitTask.execute(JUnitTask.java:814)
at org.apache.tools.ant.taskdefs.optional.junit.JUnitTask.executeOrQueue(JUnitTask.java:1808)
at org.apache.tools.ant.taskdefs.optional.junit.JUnitTask.execute(JUnitTask.java:760)
at org.apache.tools.ant.UnknownElement.execute(UnknownElement.java:291)
at sun.reflect.GeneratedMethodAccessor4.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.apache.tools.ant.dispatch.DispatchUtils.execute(DispatchUtils.java:106)
at org.apache.tools.ant.Task.perform(Task.java:348)
at org.apache.tools.ant.Target.execute(Target.java:390)
at org.apache.tools.ant.Target.performTasks(Target.java:411)
at org.apache.tools.ant.Project.executeSortedTargets(Project.java:1397)
at org.apache.tools.ant.Project.executeTarget(Project.java:1366)
at org.apache.tools.ant.helper.DefaultExecutor.executeTargets(DefaultExecutor.java:41)
at org.apache.tools.ant.Project.executeTargets(Project.java:1249)
at org.apache.tools.ant.Main.runBuild(Main.java:801)
at org.apache.tools.ant.Main.startAnt(Main.java:218)
at org.apache.tools.ant.launch.Launcher.run(Launcher.java:280)
at org.apache.tools.ant.launch.Launcher.main(Launcher.java:109)
Essayez de faire de votre pot de la tâche DÉPEND de la junit tâche, de sorte qu'il exécute les tests après la compilation, mais avant de pot.
Supprimer la dépendance de l'junit tâche, ça doit dépendre de la compilation tâche de ne pas le pot tâche.
Merci, ça fait beaucoup plus de sens que le tutoriel et résout mon problème. Si vous modifiez votre réponse à tenir compte de cette information, je vais l'accepter.

OriginalL'auteur Lawrence Johnston | 2010-09-10