Не удалось получить 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, поэтому, если вы используете это, это будет каноническим, как вы собираетесь получить.