Подтвердить что ты не робот

Настройка ant для запуска модульных тестов. Где библиотеки должны быть? Как настроить путь класса? избегая ZipException

Я пытаюсь запустить тесты 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 для успешного запуска модульных тестов.

ant 1.7.1 (ubuntu), java 1.6.0_10, junit 4.4

Спасибо.

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

4b9b3361

Ответ 1

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

Ответ 2

Эта ошибка вызвана специально, потому что путь класса содержит явные ссылки на один или несколько файлов, которые не являются JAR. Ссылка на "ошибка при открытии zip файла", конечно, является JAR файлом, который, как и другие файлы [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>

или

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

<fileset id="my.file.set" dir="c:/where/i/keep/my/jars">
    <include name="**/*.jar" />
</fileset>

Ответ 3

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

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

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

Дополнительная информация поможет:)

Удачи!

Ответ 4

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

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

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

Ответ 5

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

sudo apt-get install ant-optional