【问题标题】:Unable to get hudson to parse JUnit test output XML无法让 hudson 解析 JUnit 测试输出 XML
【发布时间】:2010-01-15 21:34:39
【问题描述】:

编辑:这个问题已经被谷歌在 gtest 1.4.0 中修复; see the original bug report 了解更多信息。

我最近为我的 C++ 测试框架切换到 gtest,我目前无法使用它的一个重要功能是能够生成 JUnit 样式的 XML 测试报告,然后我们的 hudson 可以读取该报告构建服务器。

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 应该是什么样子的示例。有人可以帮我指出正确的方向吗?

【问题讨论】:

  • 你能告诉我如何在这里显示 XML 吗?我遇到了 pre 和 code 标记组合无法修复的标记问题。如果您能告诉我如何显示它,我可以发布一个示例。
  • 如果我在你的上“查看源代码”,我看到魔法字符被转义了。我究竟做错了什么?我再试一次……

标签: c++ junit hudson googletest


【解决方案1】:

我是这样做的:

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

【讨论】:

    【解决方案2】:

    编辑: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 pagehudson's issue tracker 上的一个,所以希望两个团队中的一个能够解决这个问题,因为我没有足够的时间亲自参与并制作补丁。 ......虽然如果这在不久的将来没有得到解决,我可能不得不这样做。 ;)

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-07-14
        • 1970-01-01
        • 2018-07-15
        • 1970-01-01
        相关资源
        最近更新 更多