5

编辑:这个问题已由谷歌在 gtest 1.4.0 中修复;有关更多信息,请参阅原始错误报告

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

4

3 回答 3

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>
于 2009-01-09T15:51:04.583 回答
4

编辑:谷歌测试已经修复了这个问题,它包含在 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 传递给它的错误样式的斜线,所以我只为 windows 制作了我的 exec,因为我的 hudson 在 windows 服务器上运行。显然,对于 unix,更改为 '/'。

我还在gtest 页面上为此提交了一个问题,也在hudson 的问题跟踪器上提交了一个问题,所以希望两个团队中的一个能够解决这个问题,因为我没有足够的时间来做一个给自己打补丁....虽然如果这在不久的将来没有得到解决,我可能不得不这样做。;)

于 2009-02-10T02:08:52.220 回答
0

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

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

于 2009-01-14T18:16:14.850 回答