java - Configurando hormiga para ejecutar pruebas unitarias. ¿Dónde deberían estar las bibliotecas? ¿Cómo debe configurarse classpath? evitando ZipException
install junit eclipse (5)
Estoy tratando de ejecutar mis pruebas junit usando hormiga. Las pruebas se inician utilizando un conjunto de pruebas JUnit 4. Si ejecuto esto directamente desde Eclipse, las pruebas se completan sin error. Sin embargo, si lo ejecuto desde la hormiga, muchas de las pruebas fallan y este error se repite una y otra vez hasta que falla la tarea junit.
[junit] java.util.zip.ZipException: error in opening zip file [junit] at java.util.zip.ZipFile.open(Native Method) [junit] at java.util.zip.ZipFile.(ZipFile.java:114) [junit] at java.util.zip.ZipFile.(ZipFile.java:131) [junit] at org.apache.tools.ant.AntClassLoader.getResourceURL(AntClassLoader.java:1028) [junit] at org.apache.tools.ant.AntClassLoader$ResourceEnumeration.findNextResource(AntClassLoader.java:147) [junit] at org.apache.tools.ant.AntClassLoader$ResourceEnumeration.nextElement(AntClassLoader.java:130) [junit] at org.apache.tools.ant.util.CollectionUtils$CompoundEnumeration.nextElement(CollectionUtils.java:198) [junit] at sun.misc.CompoundEnumeration.nextElement(CompoundEnumeration.java:43) [junit] at org.apache.tools.ant.taskdefs.optional.junit.JUnitTask.checkForkedPath(JUnitTask.java:1128) [junit] at org.apache.tools.ant.taskdefs.optional.junit.JUnitTask.executeAsForked(JUnitTask.java:1013) [junit] at org.apache.tools.ant.taskdefs.optional.junit.JUnitTask.execute(JUnitTask.java:834) [junit] at org.apache.tools.ant.taskdefs.optional.junit.JUnitTask.executeOrQueue(JUnitTask.java:1785) [junit] at org.apache.tools.ant.taskdefs.optional.junit.JUnitTask.execute(JUnitTask.java:785) [junit] at org.apache.tools.ant.UnknownElement.execute(UnknownElement.java:288) [junit] at sun.reflect.GeneratedMethodAccessor1.invoke(Unknown Source) [junit] at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) [junit] at java.lang.reflect.Method.invoke(Method.java:597) [junit] at org.apache.tools.ant.dispatch.DispatchUtils.execute(DispatchUtils.java:106) [junit] at org.apache.tools.ant.Task.perform(Task.java:348) [junit] at org.apache.tools.ant.Target.execute(Target.java:357) [junit] at org.apache.tools.ant.Target.performTasks(Target.java:385) [junit] at org.apache.tools.ant.Project.executeSortedTargets(Project.java:1337) [junit] at org.apache.tools.ant.Project.executeTarget(Project.java:1306) [junit] at org.apache.tools.ant.helper.DefaultExecutor.executeTargets(DefaultExecutor.java:41) [junit] at org.apache.tools.ant.Project.executeTargets(Project.java:1189) [junit] at org.apache.tools.ant.Main.runBuild(Main.java:758) [junit] at org.apache.tools.ant.Main.startAnt(Main.java:217) [junit] at org.apache.tools.ant.launch.Launcher.run(Launcher.java:257) [junit] at org.apache.tools.ant.launch.Launcher.main(Launcher.java:104)
mi tarea de ejecución de prueba es la siguiente:
<target name="run-junit-tests" depends="compile-tests,clean-results"> <mkdir dir="${test.results.dir}"/> <junit failureproperty="tests.failed" fork="true" showoutput="yes" includeantruntime="false"> <classpath refid="test.run.path" /> <formatter type="xml" /> <test name="project.AllTests" todir="${basedir}/test-results" /> </junit> <fail if="tests.failed" message="Unit tests failed"/> </target>
Verifiqué que el classpath contiene lo siguiente así como también todos los códigos y bibliotecas del programa:
ant-junit.jar ant-launcher.jar ant.jar easymock.jar easymockclassextension.jar junit-4.4.jar
He intentado depurar para averiguar qué ZipFile está intentando abrir sin suerte, he intentado cambiar includeantruntime y fork y he intentado ejecutar horm con ant -lib test / libs donde test / libs contiene la hormiga y junit bibliotecas.
Se agradece cualquier información sobre las causas de esta excepción o cómo se configuró para ejecutar exitosamente pruebas unitarias.
ant 1.7.1 (ubuntu), java 1.6.0_10, junit 4.4
Gracias.
Actualización: solucionado Encontrado mi problema. Había incluido mi directorio de clases en mi ruta utilizando un conjunto de archivos en lugar de un pathelement. Esto causaba que los archivos .class se abrieran como archivos ZipFiles, lo que por supuesto arrojó una excepción.
Encontrado mi problema Había incluido mi directorio de clases en mi ruta utilizando un conjunto de archivos en lugar de un pathelement. Esto causaba que los archivos .class se abrieran como archivos ZipFiles, lo que por supuesto arrojó una excepción.
Parece que hay un problema con los caminos.
Verifique la siguiente fuente de error:
- classpath: imprime la variable classpath en una prueba junit, ejecútala desde eclipse y ant, para que puedas compararlas
- Verifica tu proyecto por rutas absolutas. Probablemente, ant utiliza otros prefijos de ruta que eclipse.
Un poco más de información ayudaría a ayudar :)
¡Buena suerte!
Gracias chicos por esta información. Solo quiero agregar un consejo de mi experiencia. Tengo el mismo problema con Junit que cuando Junit intenta abrir archivos de licencia * .txt en la carpeta lib donde reside * .jar. (El proceso de resolución Ivy los coloca aquí) Entonces
<path id="lib.path.id">
<fileset dir="${lib.dir}" includes="**.jar"/>
</path>
ayuda también
Este error se debe específicamente a que la ruta de clase contiene referencias explícitas a uno o más [archivos] que no son JAR. La referencia al "error al abrir el archivo zip" es, por supuesto, que un JAR es en efecto un archivo ZIP donde, como otros archivos [JUNIT] han encontrado que los archivos de clase no son, y como tales, no tienen un formato zip. Por lo tanto, la ruta de clase solo debe contener referencias explícitas a JAR [archivos] y / o los nombres de los [directorios] donde se encuentran otros recursos como archivos de clase.
Entonces cuando construyas tu ruta de clase (en ANT) usa:
<path id="proj.class.path">
<pathelement location="c:/my/project/root" /> :one for each of the [directories] where class files, log4j property files and other resources etc are to be found
<fileset refid="my.file.set"> :to describe all the explicit JAR [files] that need to be on the class path.
</path>
dónde
<fileset id="my.file.set" dir="c:/where/i/keep/my/jars">
<filename name="myjar1.jar" />
<filename name="myjar2.jar" />
<filename name="myjar3.jar" />
</fileset>
o
NOTA: cuando utilice comodines como [**/*]
, debe asegurarse de que el comodín no coincida con los archivos que no son JAR.
<fileset id="my.file.set" dir="c:/where/i/keep/my/jars">
<include name="**/*.jar" />
</fileset>
Si está utilizando Ubuntu o Debian, esto hará que JUnit (y algunas otras librerías) siempre estén disponibles para Ant:
sudo apt-get install ant-optional