google testのテスト結果からhtmlを生成

この記事では、google testで出力されるテスト結果のレポートをhtmlにするための方法について説明します。


C++C言語のテストをするにはgoogle testの利用がデファクトとなっている状況かと思います。 テスト結果をhtml形式にすることで、テスト結果をより有効に活用できるようになります。


google testは、xml形式の出力ができます。その形式はjunitが用いる形式にほぼ準拠しています。ただし、google test(バージョン 1.5.0)の場合、一点だけ惜しいことにtestsuite要素にpackage属性が出力されないため、htmlに変換した際、きれいに出力されない問題があります。


この問題を解決するために次の方法をひとつ考えてみました。

必要なもの

  1. google test version 1.5.0
  2. ant 私はeclipseに内蔵されているantを用いています。
  3. build.xml -- この記事で説明しているファイル

build.xmlファイルの処理の流れについて説明します。

  1. google testのテスト結果をXML形式で出力します。ターゲットは、run_testです。
  2. xmlファイルのtestsuite要素にpackage属性を追加します。run_testターゲット内にあります。
  3. antのタスクのJUnitReportが利用しているjunit-frames.xslと上記のxmlファイルを元にxsltタスクを用いてhtmlファイルを出力します。ターゲットは、report_testです。
<project name="gtest_report_sample" default="report_test">
  <property name="reports" value="target"/>
  <property name="report_xml" value="${reports}/all-testsuites.xml"/>
  <property name="report_html" value="${reports}/index.html"/>

  <property name="executable" value="./Debug/gtest_sample"/>
  
  <target name="run_test"
      description="google testを実行">
    <delete dir="${reports}"/>
    <mkdir dir="${reports}"/>
    <exec executable="${executable}"> <!-- google testを実行 -->
      <arg value="--gtest_output=xml:${report_xml}"/>
    </exec>
    <!-- gtestのXML出力ではpackageが出力されないので、
	   強制的にpackage属性を追加。-->
    <replace file="${report_xml}" token="testsuite ">
      <replacevalue><![CDATA[testsuite package="default" ]]></replacevalue>
    </replace>
  </target>
  
  <target name="report_test" depends="run_test"
  	description="テストレポートをhtml形式に変換">
    <xslt style="${ant.home}/etc/junit-noframes.xsl"
        in="${report_xml}" out="${report_html}/">
    </xslt>
  </target>

</project>

テストレポートの画面イメージ


開発環境

参考までにですが、私が使っている開発環境は以下のとおりです。

  1. eclipse 3.6(helios)
  2. cdt(C/C++ Development Tools) eclipse プラグイン
  3. eclipseの内部に持っているant