タイトル
TOPJavaテスト → This Page

EclEmmaの概要~利用方法【カバレッジ - テスト】

前提

このページに記載している内容は2011/04/07に書かれたものです。
掲載している画面や方法が将来的に変更されている場合があります。
また、解説に使っている eclipse のバージョンは 3.6.1 です。
eclipseのバージョンによって若干異なる部分があるかもしれません。
「初心者にも分かる EclEmma」を目指して頑張って解説します。

特徴

EclEmmaの特徴
・コードのテスト網羅率(カバレッジ)を計測できる
・eclipseと連携していて簡単に計測できる
・結果レポートも出力される
・TestNGと簡単に連携できる

カバレッジについての注意点
・カバレッジ計測はあくまでも網羅率を出すにすぎない
・網羅率が高いからと言ってコードやテストの品質が高いとは限らない
・網羅率(カバレッジ)を100%にすることが目的になってしまってはいけない
 ↑結構こういう人は多い気がする。
  目的と手段を間違えてはいけない(本来の目的は品質のはず)

導入方法

eclipse を起動し、メニューから「ヘルプ」>「Eclipse マーケットプレイス」を選択します。

「Eclipse マーケットプレイス」画面が表示されたら「検索」欄に EclEmma と入力して「実行」ボタンを押します。
すると検索が実行されて「EclEmma Javaコード・カバレッジ」が一覧に追加されると思います。

図:マーケットプレイス

「EclEmma Javaコード・カバレッジ」に「インストール」ボタンがあるので押します。
プラグインの依存関係などが調べられたのち、インストールする項目の選択画面になります。

「EclEmma Java Code Coverage」にチェックがついた状態のまま「次へ」ボタンを押します。
図:インストール

「ライセンス」の画面になるので「同意します」を選択して「完了」ボタンを押します。
するとインストールが開始されます。

インストールが完了すると eclipse の再始動をうながされるので
「今すぐ再始動」ボタンを押して再起動しましょう。

Javaのデバッグボタンの左側に図のようなアイコンが追加されていればインストール成功です。
図:インストール完了

利用方法

テスト対象クラスの作成

まずはテスト対象となるクラスを作成します。
今回は以下のような検証用クラスを作ってみました。

ValidatorUtility.java
package com.mitchy_world.eclemma.sample;

/**
 * 検証ユーティリティクラス
 */
public class ValidatorUtility {

	/**
	 * ブランクチェック
	 * 
	 * @param value
	 *            値
	 * @return ブランク有無
	 */
	static public boolean isBlank(String value) {
		if (value == null || value.length() == 0) {
			return true;
		}
		return false;
	}

	/**
	 * int値チェック
	 * 
	 * @param value
	 *            文字列
	 * @return int値判定有無
	 */
	static public boolean isInt(String value) {
		if (isBlank(value)) {
			return false;
		}
		try {
			Integer.parseInt(value);
		} catch (NumberFormatException e) {
			return false;
		}
		return true;
	}

}

テスト・クラスの作成

ではテスト・クラスを作ってみましょう。
今回は TestNG と連携できることを確認できるように、TestNG で作ってみます。

TestNGの概要~利用準備を参考にして
・テスト・ソース用フォルダの作成
・テスト・クラスの作成
・ビルド・パスに testng-5.xx.xx.jar の追加
・testngsample.xml の作成
を行いましょう。

以下、テスト・クラスのサンプルです。
ValidatorUtilityTest.java
package com.mitchy_world.eclemma.sample;

import static org.testng.Assert.assertFalse;
import static org.testng.Assert.assertTrue;

import org.testng.annotations.Test;

public class ValidatorUtilityTest {

	/**
	 * {@link com.mitchy_world.eclemma.sample.ValidatorUtility#isBlank(java.lang.String)}
	 * のためのテスト・メソッド。(null)
	 */
	@Test
	public void testIsBlank_01() {
		System.out.println("testIsBlank_01");
		assertTrue(ValidatorUtility.isBlank(null));
	}

	/**
	 * {@link com.mitchy_world.eclemma.sample.ValidatorUtility#isBlank(java.lang.String)}
	 * のためのテスト・メソッド。(空白)
	 */
	@Test
	public void testIsBlank_02() {
		System.out.println("testIsBlank_02");
		assertTrue(ValidatorUtility.isBlank(""));
	}

	/**
	 * {@link com.mitchy_world.eclemma.sample.ValidatorUtility#isBlank(java.lang.String)}
	 * のためのテスト・メソッド。(正常)
	 */
	@Test
	public void testIsBlank_03() {
		System.out.println("testIsBlank_03");
		assertFalse(ValidatorUtility.isBlank("xxxxx"));
	}

	/**
	 * {@link com.mitchy_world.eclemma.sample.ValidatorUtility#isInt(java.lang.String)}
	 * のためのテスト・メソッド。(null)
	 */
	@Test
	public void testIsInt_01() {
		System.out.println("testIsInt_01");
		assertFalse(ValidatorUtility.isInt(null));
	}

	/**
	 * {@link com.mitchy_world.eclemma.sample.ValidatorUtility#isInt(java.lang.String)}
	 * のためのテスト・メソッド。(空白)
	 */
	@Test
	public void testIsInt_02() {
		System.out.println("testIsInt_02");
		assertFalse(ValidatorUtility.isInt(""));
	}

	/**
	 * {@link com.mitchy_world.eclemma.sample.ValidatorUtility#isInt(java.lang.String)}
	 * のためのテスト・メソッド。(正常)
	 */
	@Test
	public void testIsInt_04() {
		System.out.println("testIsInt_04");
		assertTrue(ValidatorUtility.isInt("123456"));
	}
}

では早速実行してみましょう。
まずは先にテストを実行します。
パッケージ・エクスプローラーから testngsample.xml を右クリックして「実行」>「TestNG Suite」を選択してテスト・スイートを実行します。

「コンソール」ビュー、「Results of running suite」ビューに結果が表示されたら次はカバレッジ設定しましょう。

パッケージ・エクスプローラーから testngsample.xml を右クリックして「カバレッジ」>「カバレッジの構成」を選択します。
図:パッケージ・エクスプローラー

「カバレッジ構成」画面が表示されます。
左のツリーで「TestNG」>「test.testngsample.xml」を選択(最初から選択されているかも)し、
右の設定画面では以下のように設定します。
プロジェクト :テストする対象のJavaプロジェクト
起動構成の実行:スイートを選択し、「参照」ボタンを押して test.testngsample.xml を選択します。
(これも最初から選択されているかも)
図:カバレッジ構成1

次に右の設定画面で「カバレッジ」タブを選択し、一覧の src と テスト の両方にチェックを入れます。
(これも最初から選択されているかも)
図:カバレッジ構成2

上記設定が終わったら「カバレッジ」ボタンを押しましょう。

「カバレッジ」ビューに結果が表示されると思います。
図:カバレッジ・ビュー1

ValidatorUtility.java の「カバレッジ」欄が100%ではなく、76.9%となっています。
つまり、テストで網羅されていない処理があるということが分かります。


網羅率を上げるためのテスト・クラスの修正

では、次に網羅率を上げるためにテスト・クラスを修正しましょう。

「カバレッジ」ビューの ValidatorUtility.java をダブルクリックしてみましょう。
背景色がついてカラフルになっていると思います。
背景色が緑色の箇所はテストが実行された箇所。
背景色が赤色の箇所はテストで実行されていない箇所です。
isInt メソッドの NumberFormatException の例外処理がテストされていないことが分かります。
(他にもクラス名部分でも同様にマークがされていますが、これはインスタンス作成のテストが抜けているということです。)
図:未実行


と、いうことで早速該当行もちゃんと実行されるテスト・クラスに修正しましょう。

テスト・クラスに以下のコードを追加します。
(testValidatorUtility メソッドは超適当ですが許して下さい)
ValidatorUtilityTest.java
	/**
	 * {@link com.mitchy_world.eclemma.sample.ValidatorUtility#isInt(java.lang.String)}
	 * のためのテスト・メソッド。(数値以外)
	 */
	@Test
	public void testIsInt_03() {
		System.out.println("testIsInt_03");
		assertFalse(ValidatorUtility.isInt("x"));
	}

	
	/**
	 * {@link com.mitchy_world.eclemma.sample.ValidatorUtility()}
	 * のためのテスト・メソッド。
	 */
	@Test
	public void testValidatorUtility() {
		ValidatorUtility vu = new ValidatorUtility();
		assertNotNull(vu);
	}

追加できたら再度同じ手順でカバレッジを実行してみます。

無事に100%になりましたね。
図:カバレッジ・ビュー2


他のクラスやそれのクラスに対するテスト・クラス、テスト・スイートを作ったら
パッケージを選択して EclEmma を実行してみましょう。
「すべてのファイル」「パッケージ」などが作成した数だけ追加されていると思います。
図:カバレッジ・ビュー3


冒頭の「特徴」でも述べましたが、
「網羅率が高いからと言ってコードやテストの品質が高いとは限らない」
という点に注意して下さい。

上記サンプルでは網羅率100%ですが、実際には品質を保証するためのテストが足りていません。
(isInt メソッドに int の桁があふれるような値を渡したときにどうなるの?など)

100%にしたとしても、「行や分岐を網羅したにすぎない」ということは肝に銘じておきましょう。

結果のエクスポート

「カバレッジ」ビューで右クリックして「レポートのエクスポート」を選択すると「エクスポート」画面が表示されます。
図:エクスポート

何種類かのフォーマットで出力できますが、今回は一番見易いHTMLにしておきましょう。
「宛先」で出力先を指定して「完了」ボタンを押せばレポートが出力されます。

ちなみに出力したHTMLを開くとこんな感じです。
図:レポート

ダウンロード

解説で使ったクラスなどを含んだ eclipse 用プロジェクト一式

更新履歴

2011/04/07 新規作成


TOPJavaテスト → This Page