7. カバレッジツール

カバレッジツールは、単体テストで使用するもので、コードのテスト網羅率を計測する機能を提供します。このツールを使用してテスト仕様書のテストケースの品質を確認します。カバレッジはテスト作業における必要条件でしかありません。品質を確認するための十分条件にはなり得ないことに注意してください。次のようなカバレッジツール使い方はお奨めできません。このツールはJavaプログラムのみ対象としたものです。 WebOTX Developerではcobertura1.9.4.1とEclEmma(JaCoCo)4.3を同梱しています。以下の章ではこれらを利用します。

7.1. カバレッジとは

カバレッジ(網羅率)とは、ホワイトボックステストを行うとき用いる基準で、ソースコードに対して「どの程度テストを実施したか」とを表すための指標で、C0(命令)網羅、C1(分岐)網羅、C2(条件)網羅の3種類があります。C0網羅は、コード全てのステートメントを少なくとも1回実効するテストです。C1網羅はコード内の全てのブランチの真偽を少なくとも1回実行するテストです。C2網羅はコード内の全てのブランチの真偽の全ての組み合わせを実行するテストです。単体テストにおいては、C0網羅のテストを実施します。


図7.1-1


図7.1-2

Memo
本ツールが出力するブランチカバレッジは上記C1とは異なります。本ツールでは分岐点を少なくとも1回は実行した場合(上図の場合、A,Bを通過すること)となります。

7.2. 複雑度とは

複雑度とは、プログラムの複雑さを測る指標のひとつで、値が大きいほどテストや保守が難しいことを意味します。表7.2-1は、プログラムの複雑さを測る指標のひとつであるサイクロマティック複雑度(以下、複雑度)とバグの誤修正率を表したもので、複雑度が高い(ソースコードの構造が悪い)と、バグの誤修正率が高いことを表しています。
表7.2-1 複雑度のバグの誤修正率
複雑度
誤修正率
ソースコードの状態
<10
約5%
良い構造
20-30
約20%
構造に疑問がある
50以上
約40%
テストが不可能
100近く
約60%
いかなる変更も誤修正を生む可能性がある
図7.2-1は、100個のバグが1回目のテストで検出された場合、表7.2-1の誤修正率でバグが減少すると仮定した場合のバグ減少曲線です。良い構造であれば3回目のテストでバグはほぼ0件になりますが、構造が悪いとバグが中々減少しません。


図7.2-1

Memo
サイクロマティック複雑度はプログラムコードの構造の良し悪しを数値化する指標です。

Memo
複雑度の特性として、悪い構造のプログラムは、高い複雑度になります。良い構造のプログラムのほとんどは複雑度が低い数値になりますが、稀に高い数値のときがあります。すなわち、「複雑度の値が高い = プログラム構造の品質が悪い」となるわけではないことに注意してください。
複雑度の指標とコードレビューの関係
30以上   : 第3者によるソースコードレビュー の対象とします。
100以上 : ソースコードレビューの価値は有りません。作り直しを検討します。

7.3. EclEmma(JaCoCo) 利用手順

EclEmma(JaCoCo) では、カバレッジ測定用のコードを挿入する方法として、次の2種類があります。 以下では、Java Agent機能を利用する方法を説明します。

7.3.1. カバレッジ測定の手順

ここではWebサービスのサンプルを利用して説明を行います。 [ アプリケーション開発ガイド(Java EE) > 1. Webサービスアプリケーションの開発 > 1.5. サンプル集(JAX-WS) > 1.5.1. 新規に作成したサービス(ウィザード利用)]

7.3.1.1. テスト用サーバの設定

テスト用サーバに、カバレッジ測定の設定を行います。 スタートメニュー > すべてのプログラム > WebOTX >Web版統合運用管理コンソール でWeb版統合運用管理コンソールを起動します。
アプリケーションサーバ > JVM構成 を選択し、JVMオプションタブを選択します。
JVMオプションの行の追加をクリックし、次を設定します。
-javaagent:<WebOTXインストールフォルダ>/Developer/coveragetool/JaCoCo/lib/jacocoagent.jar=includes=sample.hello.*,destfile=<計測結果出力フォルダ>/jacoco.exec

Memo
引数の詳細は http://www.eclemma.org/jacoco/trunk/doc/agent.html を参照してください。

更新をクリックし、ドメインを再起動します。

7.3.1.2. テスト実行

サンプルプロジェクトをインポートします。
ここではHelloServiceがテストされるサービス、HelloClientがテストアプリケーションとなります。
まず、[ アプリケーション開発ガイド(Java EE) > 1. Webサービスアプリケーションの開発 > 1.5. サンプル集(JAX-WS) > 1.5.1. 新規に作成したサービス(ウィザード利用) > 1.5.1.4. 注意事項 ] に従い、HelloClientプロジェクトのHelloService_Service.javaの2箇所を修正しておきます。
HelloServiceを右クリックし、実行 > サーバで実行をクリックします。
HelloClientプロジェクトのHelloServiceClient.javaを右クリックし、実行 > Javaアプリケーションをクリックします。
コンソールビューに「Hello Bob !」が表示されます。これでテスト終了です。
計測結果を出力するため、ドメインを停止します。

7.3.1.3. カバレッジ測定の結果レポート出力

HelloServiceに結果レポート出力用のbuildファイルを作成します。
HelloServiceプロジェクトを右クリックし、新規 > ファイルをクリックし、build.xmlファイルを作成します。
次をコピーします。
<?xml version="1.0" encoding="UTF-8"?>
<project name="jacoco.report" default="report" basedir="." xmlns:jacoco="antlib:org.jacoco.ant">
  <taskdef uri="antlib:org.jacoco.ant" resource="org/jacoco/ant/antlib.xml">
	<classpath path="<WebOTXインストールフォルダ>/Developer/coveragetool/JaCoCo/lib/jacocoant.jar"/>
  </taskdef> 
  <target name="report" description="Generate coverage reports in JaCoCo/coverage.">
	<jacoco:report>
	  <executiondata>
	    <file file="<計測結果出力フォルダ>/jacoco.exec" />
	  </executiondata>
	  <structure name="JaCoCo Coverage Report">
	    <classfiles>
	      <fileset dir="${basedir}/build/">
	        <include name="**/*.class"/>
		  </fileset>
	    </classfiles>
	    <sourcefiles>
	      <fileset dir="${basedir}/src/">
	        <include name="**/*.java"/>
		  </fileset>
	    </sourcefiles>
	  </structure>
      <html destdir="<結果レポート出力フォルダ>" />
    </jacoco:report>
  </target>
</project>
build.xmlを右クリックし、実行 > Antビルドをクリックします。
<結果レポート出力フォルダ>にテスト結果が出力されます。


図7.3.1.3-1 結果レポート