Невозможно получить hudson для анализа выходных XML-данных теста JUnit
РЕДАКТИРОВАТЬ: эта проблема была исправлена Google в gtest 1.4.0; см. оригинальный отчет об ошибке для получения дополнительной информации.
Недавно я переключился на gtest для своей среды тестирования C++, и одна из его замечательных возможностей, которую я в настоящее время не могу использовать, - это возможность генерировать отчеты о тестировании в стиле 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, который отлично работает и генерирует 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, hudson всегда жалуется на отсутствие результатов теста.
Я не Java-парень, поэтому я не могу сказать, что здесь происходит, и я не могу найти пример того, как должен выглядеть JUnit XML. Может ли кто-нибудь помочь направить меня в правильном направлении?
3 ответа
Изменить: тест Google исправил эту проблему, которая включена в выпуск gtest 1.4.0. Смотрите оригинальный отчет об ошибке для получения дополнительной информации.
Ба! Я наконец-то нашел причину этой проблемы - это потому, что gtest создает один гигантский XML-файл для всех результатов теста, а hudson ожидает один отчет XML-теста на класс. Я написал Perl-скрипт в качестве обходного пути для этой проблемы. Чтобы использовать его, вы должны сделать цель в своем скрипте ant xml, которая выглядит примерно так:
<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 только для Windows, так как мой hudson работает на сервере Windows. Измените на '/' для Unix, очевидно.
Я также подал заявку на эту проблему на странице gtest, а также одну на трекере проблем Хадсона, так что, надеюсь, одна из двух команд займется этой проблемой, так как у меня нет достаточно времени, чтобы вскочить и сделать залатать себя.... хотя, если это не будет исправлено в ближайшем будущем, возможно, мне просто придется.;)
Вот как я это делаю:
<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>
Я почти уверен, что это не проблема парсинга XML, а скорее проблема поиска файлов XML. Если вы используете относительный путь в конфигурации Hudson, убедитесь, что вы четко указали, к какому каталогу он относится (кажется, я помню, что он был неочевидным при определенных обстоятельствах).
Что касается примеров того, как должны выглядеть файлы JUnit XML, то удачи вам. Это точно нигде не указано. Различные инструменты имеют разные диалекты. Тем не менее, Хадсон хорошо распознает их всех. Я полагаю, что именно разработчики JUnitReport впервые представили формат XML, поэтому, если вы используете его, это будет настолько же канонично, насколько это возможно.