6. カバレッジツール
カバレッジツールは、単体テストで使用するもので、コードのテスト網羅率を計測する機能を提供します。このツールを使用してテスト仕様書のテストケースの品質を確認します。カバレッジはテスト作業における必要条件でしかありません。品質を確認するための十分条件にはなり得ないことに注意してください。次のようなカバレッジツール使い方はお奨めできません。このツールはJavaプログラムのみ対象としたものです。
- 悪い使い方
- カバレッジ100%、あるいは、ある閾値を越える事だけを目指すこと
カバレッジが100%になったとしても、すべての組合せがテストされたことにはなりません。入力データの組合せパターンをすべてテストしなくてもカバレッジが100%に達することがあります。カバレッジは、例外処理を除くコードがテストされたかの確認に利用してください。
- デバッグ後のテストのたびにカバレッジツールを実行すること
カバレッジを測定しているテストプロセスを一度終了すると、再度測定するときに表示されるカバレッジレポートは初期状態からのレポートになり、未テストの部分が分かりにくくなります。デバッグ中にカバレッジを測定するのではなく、あるプログラムおよびテスト仕様書が一定品質を満たしてから実施する方が効率的です。
- 良い使い方
- テストデータのバリエーションと、テストシナリオのバリエーションを洗い出し、テストケースを設計します。テストケースに沿ったテスト実行後、カバレッジを確認します。カバレッジからテストされていないコードをテストする方策を検討し、テストケースの見直しを実施します。
WebOTX Developerではcobertura1.9.4.1とEclEmma(JaCoCo)4.3を同梱しています。以下の章ではこれらを利用します。
6.1. カバレッジとは
カバレッジ(網羅率)とは、ホワイトボックステストを行うとき用いる基準で、ソースコードに対して「どの程度テストを実施したか」とを表すための指標で、C0(命令)網羅、C1(分岐)網羅、C2(条件)網羅の3種類があります。C0網羅は、コード全てのステートメントを少なくとも1回実効するテストです。C1網羅はコード内の全てのブランチの真偽を少なくとも1回実行するテストです。C2網羅はコード内の全てのブランチの真偽の全ての組み合わせを実行するテストです。単体テストにおいては、C0網羅のテストを実施します。
- C0 : 命令網羅率(ステートメントカバレッジ)
コード内の全てのステートメントを少なくとも1回は実行
(1) , (2) , (3) , (4) , (5)
- C1 : 分岐網羅率(ブランチカバレッジ)
コード内の全てのブランチを少なくとも1回は実行
(1) → (2) → (3)、 (1) → (4) → (5)
- C2 : 条件網羅率(コンディションカバレッジ)
コード内のすべての条件を少なくとも1回は実行
(1) → (2) → (3) 、 (1) → (2) → (5) 、 (1) → (4) → (3) 、 (1) → (4) → (5)

図7.1-1

図7.1-2
Memo
本ツールが出力するブランチカバレッジは上記C1とは異なります。本ツールでは分岐点を少なくとも1回は実行した場合(上図の場合、A,Bを通過すること)となります。
6.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以上 : ソースコードレビューの価値は有りません。作り直しを検討します。
6.3. EclEmma(JaCoCo) 利用手順
EclEmma(JaCoCo) では、カバレッジ測定用のコードを挿入する方法として、次の2種類があります。
- Offline Instrumentation機能を利用して、ビルド時にカバレッジ測定用のコードを挿入する
- Java Agent機能を利用して、実行時にカバレッジ測定用のコードを挿入する
以下では、Java Agent機能を利用する方法を説明します。
6.3.1. カバレッジ測定の手順
ここではWebサービスのサンプルを利用して説明を行います。
[ Webサービスアプリケーション
> サンプル集(JAX-WS)
> 新規に作成したサービス(ウィザード利用)]
6.3.1.1. テスト用サーバの設定
テスト用サーバに、カバレッジ測定の設定を行います。
スタートメニュー > すべてのプログラム > WebOTX >運用管理コンソール で運用管理コンソールを起動します。
アプリケーションサーバ > JVM構成 を選択し、JVMオプションタブを選択します。
JVMオプションの行の追加をクリックし、次を設定します。
-javaagent:<WebOTXインストールフォルダ>/Developer/coveragetool/JaCoCo/lib/jacocoagent.jar=includes=sample.hello.*,destfile=<計測結果出力フォルダ>/jacoco.exec
- <WebOTXインストールフォルダ>にはWebOTXをインストールしたフォルダを指定します。デフォルトはC:/WebOTXです。
- <計測結果出力フォルダ>には計測結果を出力するフォルダを指定します。
- includesには測定対象のクラスを指定します。
Memo
引数の詳細は http://www.eclemma.org/jacoco/trunk/doc/agent.html を参照してください。
更新をクリックし、ドメインを再起動します。
6.3.1.2. テスト実行
サンプルプロジェクトをインポートします。
ここではHelloServiceがテストされるサービス、HelloClientがテストアプリケーションとなります。
まず、[ Webサービスアプリケーションの開発
> サンプル集(JAX-WS)
> 新規に作成したサービス(ウィザード利用)
> 注意事項
] に従い、HelloClientプロジェクトのHelloService_Service.javaの2箇所を修正しておきます。
HelloServiceを右クリックし、実行 > サーバで実行をクリックします。
HelloClientプロジェクトのHelloServiceClient.javaを右クリックし、実行 > Javaアプリケーションをクリックします。
コンソールビューに「Hello Bob !」が表示されます。これでテスト終了です。
計測結果を出力するため、ドメインを停止します。
6.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>
- <WebOTXインストールフォルダ>にはWebOTXをインストールしたフォルダを指定します。デフォルトはC:/WebOTXです。
- <計測結果出力フォルダ>には計測結果を出力したフォルダを指定します。
- <結果レポート出力フォルダ>には計測レポートを出力するフォルダを指定します。
build.xmlを右クリックし、実行 > Antビルドをクリックします。
<結果レポート出力フォルダ>にテスト結果が出力されます。

図7.3.1.3-1 結果レポート