Настройка муравья для запуска юнит-тестов. Где должны быть библиотеки? Как должен быть настроен classpath? избегая ZipException - PullRequest
19 голосов
/ 20 января 2009

Я пытаюсь запустить свои тесты junit с помощью ant. Тесты начинаются с использованием набора тестов JUnit 4. Если я запускаю это прямо из Eclipse, тесты завершаются без ошибок. Однако, если я запускаю его из ant, многие из тестов завершаются неудачно, и эта ошибка повторяется снова и снова, пока не завершится сбой задачи 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)

Моя тестовая задача выглядит следующим образом:

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

Я убедился, что classpath содержит следующее, а также весь программный код и библиотеки:

ant-junit.jar
ant-launcher.jar
ant.jar
easymock.jar
easymockclassextension.jar
junit-4.4.jar

Я попытался отладить, чтобы выяснить, какой ZipFile он пытается открыть без удачи, я попытался переключить includeantruntime и fork , и я попытался запустить ant с ant -lib test / libs где test / libs содержит библиотеки ant и junit.

Любая информация о причинах этого исключения или о том, как вы настроили ant для успешного запуска модульных тестов, с благодарностью получена.

муравей 1.7.1 (ubuntu), java 1.6.0_10, junit 4.4

Спасибо.

Обновление - Исправлено Нашел мою проблему. Я включил в свой путь каталог с классами, используя набор файлов, а не набор элементов, из-за которого файлы .class открывались как ZipFiles, что, конечно, вызывало исключение.

Ответы [ 5 ]

15 голосов
/ 20 января 2009

Нашел мою проблему. Я включил каталог моего класса в свой путь, используя набор файлов , в отличие от pathelement , из-за которого файлы .class открывались как ZipFiles, что, конечно, вызывало исключение.

9 голосов
/ 30 мая 2010

Эта ошибка вызвана именно тем, что путь к классу содержит явные ссылки на один или несколько [файлов], которые не являются JAR-файлами. Ссылка на «ошибка при открытии zip-файла», конечно, означает, что JAR фактически является ZIP-файлом, где, как и другие файлы, [JUNIT] обнаружил, что файлы классов не и поэтому не имеют zip формат. Таким образом, путь к классу должен содержать только явные ссылки на JAR [файлы] и / или имена [каталогов], где находятся другие ресурсы, такие как файлы классов.

Итак, при построении пути к классам (в ANT) используйте:

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

, где

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

или

ПРИМЕЧАНИЕ. При использовании подстановочных знаков, таких как [**/*], необходимо убедиться, что подстановочный знак не соответствует файлам, которые не являются файлами JAR

<fileset id="my.file.set" dir="c:/where/i/keep/my/jars">
    <include name="**/*.jar" />
</fileset>
2 голосов
/ 20 января 2009

Похоже, что есть проблема с путями.

Проверьте следующий источник ошибок:

  • classpath: распечатайте переменную classpath в тесте junit, запустите ее из eclipse и ant, чтобы вы могли сравнить их
  • Проверьте ваш проект на абсолютные пути. Возможно, ant использует префиксы пути, отличные от eclipse.

Еще немного информации поможет:)

Удачи!

0 голосов
/ 18 декабря 2011

Если вы используете Ubuntu или Debian, JUnit (и некоторые другие библиотеки) всегда будут доступны для Ant:

sudo apt-get install ant-optional
0 голосов
/ 30 апреля 2010

Спасибо, ребята, за эту информацию. Я просто хочу добавить несколько советов из моего опыта. У меня та же проблема с junit, что и у вас, когда junit пытается открыть файлы лицензий * .txt в папке lib, где находится * .jar.

<path id="lib.path.id">
    <fileset dir="${lib.dir}" includes="**.jar"/>
</path>

тоже помогает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...