木村 真幸(きむら まさゆき)

 株式会社DTS ネットワーク事業本部 プロジェクトマネージャ。Javaを中心にフレームワーク開発や開発プロセス定義など幅広く活躍中。StrutsIDEコミッタ。著書「まるごとEclipse! Vol.1」(発行:インプレスコミュニケーションズ)。

 昨今では,ますますテスト工程が重要視されるようになっています。品質の高いソフトウエアを効率的に開発することが,保守・管理コストの低減につながり,最終的なコスト削減を生むからです。

 単体テスト工程では,「JUnit」フレームワークがデファクト・スタンダードです。これにより,効率的にテスト・ケース(テスト用のコードを書いたクラス)を作成し,何度でも繰り返し実行できます。単体テストを何度でも繰り返し実行できることは,短期開発で高品質を保つためには欠かせない要素です。

 しかし,このようにJUnitフレームワークが品質向上に大きく貢献している半面,カバレッジ・テストでC1(条件網羅)100%を目指すテストコードを書く場合は,テスト対象以上のコード量を書く必要があります。これは開発者にとって(品質向上は最終的にコスト低減につながると理解していても)苦痛な作業となっています。今回は,その苦痛な単体テスト作業を支援してくれるプラグインを紹介します。

JUnit

 「JUnit」はプラグインとして標準でEclipseに組み込まれているので,使用する際に特別な設定は必要ありません。しかし,JUnit4(Java SE 5.0以上対応)と,JUnit3(Java2 SDK 1.4以下に対応)は利用方法が異なるため,簡単にJUnit3とJUnit4の違いをおさらいしましょう。

 JUnit4ではアノテーションを取り入れ,JUnit3までは制約が多かったテスト記述方法のルールがシンプルになっています(表1)。Eclipseからテスト・ケースを作成する場合も,JUnit4とJUnit3のどちらを利用するのかを,ウィザード画面から指定する必要があります。

表1●JUnit4の特徴
「junit.framework.TestCase」クラスを継承しなくてもよい
様々なアノテーションを取り入れた
 @Testテストメソッドのプレフィックスに「test」が必要ない
 @BeforeClass,@AfterClassテストクラス前後に行う処理を指定できる
 @Test(expected=XXXXException.class)例外検証のソースの記述が簡単になった
 @Test(timeout=1500)パフォーマンスの検証もできる
 @Ignore("実行しない理由を書く")テストを無視することができる

 単純に入力値の除算結果を返却するCalculationクラス(リスト1)をテストしてみましょう。テスト環境は,Ecilpse 3.3,Java SE 5.0とします。


package jp.co.nikkeibp.itpro.unit;

public class Calculation {
  public static int divide(int a, int b) {
    if (b == 0) {
      throw new IllegalArgumentException();
    }
    return a / b;
  }
}
リスト1●割り算を行うサンプル・プログラム(テスト対象コード)

 テスト・ケースの作成方法はいくつかありますが,今回はテスト対象コードを右クリック→[新規]→[JUnitテスト・ケース]を選択します(図1)。

図1●テスト・ケース作成ウィザードの起動
図1●テスト・ケース作成ウィザードの起動
[画像のクリックで拡大表示]

 新規JUnitテスト・ケースウィザードが起動します(図2)。前述のJUnit3とJUnit4の違いから,Java SE 5.0以上をインストール済みJREとして利用している場合,“スーパー・クラスが存在しません”と警告が表示されます。ここではJava SE 5.0を利用しているので,新規JUnit4テストを選択します。

図2●テスト・ケース生成ウィザード
図2●テスト・ケース生成ウィザード

 新規JUnit4テストを選択した時点で,ウィザード画面の下部に図3のメッセージが表示されている場合,構成のリンクをたどってJUnit4のライブラリ設定,および必要に応じてJDK準拠レベルを5.0に変更する必要があります(図4)。

図3●JDK準拠レベルに関する警告メッセージ
図3●JDK準拠レベルに関する警告メッセージ

図4●JUnit4のライブラリ追加
図4●JUnit4のライブラリ追加
[画像のクリックで拡大表示]

 警告を解決したら,テスト対象のメソッドを選択し,終了ボタンを押下します。空実装の(中身がない)CalculationTestが生成されますので,500÷100の結果で5が返ってくることを確認するように実装します(リスト2)。


package jp.co.nikkeibp.itpro.unit;

import static org.junit.Assert.*;
import org.junit.Test;

public class CalculationTest {
  @Test
  public void testDivide() throws Exception {
    assertEquals(5, Calculation.divide(500, 100));
  }
}
リスト2●除算結果を検証するテスト・ケース

 テスト・ケースの実行は,パッケージ・エクスプローラでCalculationTest.javaを右クリックし,[実行]→[JUnitテスト]で行うことができます。実行後は,JUnitビューに結果が表示され(図5),テスト・ケースの実行に成功したことがわかります。

図5●テストの実行結果
図5●テストの実行結果

 なお,Eclipse 3.3からは「テスト実行ヒストリー」のアイコンからテスト結果をエクスポート/インポート可能になっています(図6)。テスト結果の証跡を手軽に残したりすることに役立てることが出来ます。

図6●テスト結果のエクスポート
図6●テスト結果のエクスポート
[画像のクリックで拡大表示]

 JUnit4とほぼ同機能のプラグインとして「TestNG」(NGはNoGoodではなく,NextGenerationの略)プラグインがあります。表1の特徴と重複することが多いため説明は省略しますが,JUnit4と比較した場合,マルチスレッドに関する機能が豊富です。単体テストレベルでスレッドを考慮する必要があるアプリケーションの場合は,利用を検討してみましょう。