Не удалось получить hudson для разбора JUnit test output XML
EDIT. Эта проблема была устранена google в gtest 1.4.0; см. исходный отчет об ошибке для получения дополнительной информации.
Недавно я переключился на gtest для моей платформы тестирования С++, и одна из замечательных особенностей, которую я сейчас не могу использовать, - это возможность генерировать отчеты теста XML в стиле JUnit, которые затем могут быть прочитаны нашим hudson построить сервер.
Выход XML, созданный набором тестов gtest, выглядит законным:
<?xml version="1.0" encoding="UTF-8"?>
<testsuite tests="370" failures="0" disabled="0" errors="0" time="45.61" name="AllTests">
<testsuite name="application" tests="7" failures="0" disabled="0" errors="0" time="8.953">
<testcase name="zero_tasks_on_bootup" status="run" time="0" classname="application" />
...etc.
</testsuite>
</testsuite>
Я также попытался добавить задачу JUnitReport в мою конструкцию ant build script, которая отлично работает и генерирует XML следующим образом:
<?xml version="1.0" encoding="UTF-8"?>
<testsuite tests="370" failures="0" disabled="0" errors="0" time="45.61" name="AllTests">
<testsuite name="application" tests="7" failures="0" disabled="0" errors="0" time="8.953">
<testcase name="zero_tasks_on_bootup" status="run" time="0" classname="application" />
...etc.
</testsuite>
</testsuite>
Проблема заключается в том, что всякий раз, когда я сообщаю ant публиковать результаты теста JUnit, а затем указывать его либо на исходный XML-результат теста, либо на скомпилированный результат, сгенерированный в задаче ant JUnitReport, хадсон всегда жалуется на поиск нет результатов тестов.
Я не парень из java, поэтому я не могу сказать, что происходит здесь, и я не могу найти пример того, как должен выглядеть JUnit XML. Может кто-нибудь помочь указать мне в правильном направлении?
Ответы
Ответ 1
Изменить. Тест Google устранил эту проблему, которая включена в версию gtest 1.4.0. Подробнее см. в отчете об ошибке.
Ба! Я, наконец, нашел причину этой проблемы - это потому, что gtest создает один гигантский XML файл для всех результатов теста, а hudson ожидает один тестовый отчет XML для каждого класса. Я написал perl script как обходной путь для этой проблемы. Чтобы использовать его, вы сделали бы цель в своем ant xml script, который выглядит примерно так:
<target name="runtests">
<exec executable="wherever/${ant.project.name}Test" failonerror="false" dir="tests">
<arg value="--gtest_output=xml:${build.dir}\reports\${ant.project.name}.xml"/>
</exec>
<!-- Workaround for broken gtest output -->
<mkdir dir="${build.dir}/reports/output"/>
<exec executable="perl" failonerror="false" dir="tests">
<arg value="gtest-hudson.pl"/>
<arg value="${build.dir}/reports/${ant.project.name}.xml"/>
<arg value="${build.dir}/reports/output"/>
</exec>
</target>
По какой-то причине gtest также не любит неправильный стиль косой черты, передаваемый ей из ant, поэтому я сделал свой exec только для окон, так как мой hudson работает на сервере Windows. Перейдите в "/" для unix, очевидно.
Я также подал ошибку для этого на странице gtest, а также на hudson issue tracker, так что, надеюсь, одна из двух команд поднимет проблему, так как у меня не хватает времени, чтобы в нее вскочить и сделать патч... хотя если это не будет исправлено в ближайшем будущем, мне просто нужно будет это сделать.;)
Ответ 2
Вот как я это делаю:
<target name="junit" depends="compile-tests" description="run all unit tests">
<mkdir dir="${reports}"/>
<junit haltonfailure="false">
<jvmarg value="-Xms128m"/>
<jvmarg value="-Xmx128m"/>
<classpath>
<path refid="project.classpath"/>
</classpath>
<formatter type="xml"/>
<batchtest fork="yes" todir="${reports}">
<fileset dir="${test}/classes">
<include name="**/*Test*.class"/>
</fileset>
</batchtest>
</junit>
</target>
<target name="generate-reports" depends="junit" description="create JUnit test HTML reports">
<mkdir dir="${reports}"/>
<junitreport todir="${reports}">
<fileset dir="${reports}">
<include name="TEST-*.xml"/>
</fileset>
<report format="frames" todir="${reports}"/>
</junitreport>
</target>
Ответ 3
Я почти уверен, что это не проблема синтаксического анализа XML, а проблема поиска XML файлов. Если вы используете относительный путь в конфигурации Hudson, убедитесь, что вы поняли, к какому каталогу оно относится (я, кажется, помню, что это было неочевидно при определенных обстоятельствах).
Что касается примеров того, как должны выглядеть файлы XML JUnit, удачи в этом. Это точно не указано нигде. Различные инструменты имеют разные диалекты. Тем не менее, Хадсон хорошо разбирается в их признании. Я считаю, что разработчики JUnitReport впервые представили формат XML, поэтому, если вы используете это, это будет каноническим, как вы собираетесь получить.