unitarias unitaria una tutorial test será qué que pruebas prueba método indica hacer ejemplos curso como anotación java ant build junit jar

java - unitaria - ¿Cómo ejecuto las pruebas de JUnit durante mi secuencia de comandos Ant build mientras omito las clases de prueba de mi jar resultante?



testing en java (2)

Basado en el consejo de @Jon, modifiqué el objetivo Junit para ejecutarlo en la carpeta build / classes en lugar del jar y actualicé las dependencias de manera apropiada.

Mi archivo build.xml actualizado está a continuación:

<project name="HelloWorld" basedir="." default="main"> <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="junit"> <mkdir dir="${jar.dir}"/> <jar destfile="${jar.dir}/${ant.project.name}.jar" basedir="${classes.dir}" excludes="**/*Test.class"> <manifest> <attribute name="Main-Class" value="${main-class}"/> </manifest> </jar> </target> <target name="junit" depends="compile"> <mkdir dir="${report.dir}"/> <junit printsummary="yes" haltonfailure="yes" showoutput="yes"> <classpath> <path refid="classpath"/> <path location="${classes.dir}"/> </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="jar"> <java fork="true" classname="${main-class}"> <classpath> <path refid="classpath"/> <path refid="application"/> </classpath> </java> </target> <target name="clean-build" depends="clean,jar"/> <target name="main" depends="clean,run"/> </project>

Estoy usando el tutorial Hello World with Ant del manual Ant para aprender sobre Ant.

La última parte del tutorial consiste en agregar pruebas JUnit al proyecto.

Tengo todo funcionando como se describe en el tutorial y ahora voy a hacer algunos cambios menores.

Uno de los cambios que me gustaría hacer es ejecutar las pruebas durante una compilación típica pero no hacer que los archivos * Test.class terminen en el archivo .jar final para la aplicación. Esto se debe a que el proyecto eventual en el que trabajaré será para un dispositivo con espacio limitado en el disco duro y soporte solo para un subconjunto del SDK de Java, por lo que preferiría simplemente omitir estos archivos de prueba por completo del contenedor.

¿Cómo hago esto?

Sería bastante fácil crear dos jarras separadas, una para pruebas y otra para implementación, pero esto parece menos que ideal.

Mi archivo build.xml actual está debajo.

<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"/>

Una cosa que he intentado es modificar el comando jar para excluir los archivos * Test.class

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

que excluye con éxito las clases de prueba, pero luego cuando las pruebas se ejecutan a través del destino junit, falla con el siguiente rastreo de pila cuando se ejecuta con -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)


Puedes cambiar:

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

a:

<target name="jar" depends="junit"> <mkdir dir="${jar.dir}"/> <jar destfile="${jar.dir}/${ant.project.name}.jar"> <fileset dir="${classes.dir}" excludes="**/*Test.class"/> <manifest> <attribute name="Main-Class" value="${main-class}"/> </manifest> </jar> </target> <target name="junit" depends="compile"> <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>

Eso debería excluir las clases de prueba que creo del archivo JAR final.

nb El cambio en las dependencias para cada una de las tareas.