无法让hudson解析JUnit测试输出XML

时间:2009-01-09 15:44:46

标签: c++ junit hudson googletest

编辑:google在gtest 1.4.0中修复了此问题; see the original bug report了解更多信息。

我最近切换到gtest用于我的C ++测试框架,我目前无法使用的一个很棒的功能是能够生成JUnit样式的XML测试报告,然后我们的哈德森就可以读取它了。构建服务器。

gtest测试套件生成的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>

我也尝试将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 个答案:

答案 0 :(得分:6)

我是这样做的:

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

答案 1 :(得分:4)

修改:Google测试修复了此问题,该问题包含在gtest 1.4.0版本中。 See the original bug report了解更多信息。

呸!我终于找到了这个问题的原因 - 这是因为gtest为所有测试结果生成了一个巨大的XML文件,而hudson期望每个类有一个XML测试报告。我写过a perl script as a workaround for this issue。要使用它,您可以在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传递给它的错误样式的斜杠,所以我只为windows做了我的exec,因为我的hudson正在windows服务器上运行。显然,对于unix更改为“/”。

我也filed an issue for this on the gtest page,还有hudson's issue tracker上的一个,所以希望两支球队中的一支能够接受这个问题,因为我没有足够的时间进入并制造我自己补丁....虽然如果不能在不久的将来得到修复,我可能只需要。 ;)

答案 2 :(得分:0)

我几乎可以肯定,这不是解析XML的问题,而是查找XML文件的问题。如果你在Hudson配置中使用相对路径,请确保你清楚它相对于哪个目录(我似乎记得在某些情况下它是不明显的)。

至于JUnit XML文件应该是什么样子的例子,祝你好运。它没有在任何地方精确指定。不同的工具有不同的方言。也就是说,哈德森在识别所有这些方面做得很好。我相信是JUnitReport的开发人员首先介绍了XML格式,所以如果你使用它,那就像你将要获得的那样规范。