SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

japan.internet.com翻訳記事

漸進方式でJavaコードの品質を大きく向上させる

CoberturaとAntを使ったコードカバレッジの向上

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プロパティに直接抽出すればよいと思うかもしれません。しかし、その方法には次の理由から問題があります。

  1. Coberturaでは、coverage.xmlには行数の割合が小数値として書き込まれるのに対し、cobertura-checkタスクには整数値を指定する必要がある。
  2. 現実の大規模なプロジェクトでは、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テンプレートを使って関連する測定値を抽出し、次のビルドのチェック用の入力値として使用できます。

この記事は参考になりましたか?

連載通知を行うには会員登録(無料)が必要です。
既に会員の方はを行ってください。
japan.internet.com翻訳記事連載記事一覧

もっと読む

この記事の著者

japan.internet.com(ジャパンインターネットコム)

japan.internet.com は、1999年9月にオープンした、日本初のネットビジネス専門ニュースサイト。月間2億以上のページビューを誇る米国 Jupitermedia Corporation (Nasdaq: JUPM) のニュースサイト internet.comEarthWeb.com からの最新記事を日本語に翻訳して掲載するとともに、日本独自のネットビジネス関連記事やレポートを配信。

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

Steven Hale(Steven Hale)

スウェーデンのコンサルティング会社Omegapoint AB勤務。20年以上に及ぶシステム開発経験を持ち、ここ数年はスウェーデンにあるインターネット銀行のJavaアーキテクトも務める。

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/2119 2008/02/13 14:00

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー