XML形式のカバレッジレポートを作成する
コードのインストルメント化とテストの実行を行うターゲットを作成したら、ビルドスクリプトに漸進的カバレッジ率チェックを追加します。まず、cobertura-reportタスクを使用して、XML形式のカバレッジレポートを作成します。
<cobertura-report format="xml"/>
以下は、cobertura-reportタスクで生成されるレポート(coverage.xml)の例です。
<?xml version="1.0"?> <!DOCTYPE coverage SYSTEM "http://cobertura.sourceforge.net/xml/coverage-02.dtd"> <coverage line-rate="0.43612334801762115" branch-rate="0.48344370860927155" version="1.8" timestamp="1181043899853"> <sources> <source>./src/java</source> </sources> <packages> ... </packages> </coverage>
このファイルは後で必要になるので、安全な場所に保管しておきます(バージョン管理システムにチェックインしておくとよいでしょう)。
レポートからカバレッジ率を抽出する
初めは、AntのXmlPropertyタスクを使用して行数の割合をAntプロパティに直接抽出すればよいと思うかもしれません。しかし、その方法には次の理由から問題があります。
- Coberturaでは、coverage.xmlには行数の割合が小数値として書き込まれるのに対し、cobertura-checkタスクには整数値を指定する必要がある。
- 現実の大規模なプロジェクトでは、coverage.xmlのサイズも大きくなると考えられるので、XmlPropertyタスクを使用しようとすると、JavaのOutOfMemoryErrorが発生する可能性がある。
代わりに、AntのXSLTタスクを使用して必要な値のみを抽出します。
<xslt in="coverage.xml" out="build/coverage.properties"
style="src/xsl/coverage.xsl" />
次の単純なXSLテンプレートでは、必要な値のみが含まれるプロパティファイルが生成されます。
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> <xsl:output method="text" omit-xml-declaration="yes"/> <xsl:template match="coverage"> total.line-rate= <xsl:value-of select="floor(@line-rate*100)"/> </xsl:template> </xsl:stylesheet>
floor(@line-rate*100)というメソッド呼び出しに注目してください。これは行数の割合を%値に変換し、端数を切り捨てて整数にします。その結果、coverage.propertiesファイルには次の1行のみが含まれることになります。
total.line-rate=44
各ビルドの間に保存するcoverage.xmlとは異なり、coverage.propertiesは中間ファイルであり、ビルドの後にクリーンアップできます。
次に、Antのpropertyタスクを使用して、coverage.propertiesからtotal.line-rateというAntプロパティへ値を読み込みます。
<property file="build/coverage.properties" />
最後に、最初に書いたcobertura-checkタスクの"80"を、新しく設定したAntプロパティに置き換えます。
<cobertura-check totallinerate="${''total.line-rate''}"/>
手順全体をまとめる
最終的なbuild.xmlは次のようになります(見やすくするために、cobertura-instrumentタスク、テストターゲット等は省略しています)。
<target name="coverage_check" depends="check_against_previous_rate"> <antcall target="coverage_report"/> </target> <target name="coverage_report"> <cobertura-report format="xml" destdir="." /> </target> <target name="check_against_previous_rate" depends="coverage_xml_to_properties"> <property file="build/coverage.properties" /> <cobertura-check totallinerate="${coverage.line-rate}" /> </target> <target name="coverage_xml_to_properties"> <xslt in="coverage.xml" out="build/coverage.properties" style="src/xsl/coverage.xsl" /> </target>
新しいカバレッジレポートが生成されるのは、カバレッジチェックが成功したとき(前回成功したビルドと同等かそれ以上のカバレッジ率である場合)のみであることに注意してください。
これを開始するには、最初にcoverage_checkを実行するより前にcoverage_reportを実行することを忘れないでください。実際には、cobertura-reportタスクをもう1つ追加してHTMLレポートも生成する必要があります。
向上度を追跡する
この漸進的向上手法では、カバレッジ率をファイルに記録して向上度の追跡も追加するとよいでしょう。これを行うには、Antのechoタスクを使用します。
<target name="time"> <tstamp> <format property="date.time" pattern="yyyy-MM-dd HH:mm"/> </tstamp> </target> <target name="log" depends="time"> <echo file="${history.txt}" append="true"> ${date.time};total.line-rate;${total.line-rate} </echo> </target>
測定可能な結果、目に見える向上
最初に述べたプロジェクトでは、この手法を採用して1週間後にカバレッジ率が30%向上しました(開始時のレベルが非常に低かったということもありますが)。特に喜ばしかったのは、それまではテストを作成したがらなかった開発者たちも、カバレッジ率の向上を誇るようになったことです。
アジャイル開発の真の民主主義精神に基づき、チームメンバー全員がそれぞれより多くのテストを作成することよって、プロジェクト全体の目標を引き上げることができます。目標値をころころ変えるキャスカート大佐はいなくてよいのです。
また、ここで終わりにする必要はありません。漸進的向上手法は他のコード測定基準にも応用できます。ほとんどのコードチェックツールでXML形式の出力が可能なので、XSLテンプレートを使って関連する測定値を抽出し、次のビルドのチェック用の入力値として使用できます。
