連載
» 2008年09月11日 00時00分 公開

次世代テストフレームワークでテストを変える(1):JUnitより簡単なオープンソースの「TestNG」とは? (1/3)

[阪田浩一,株式会社クロノス]

テスティングフレームワークといえば……

 Javaエンジニアが「テスティングフレームワーク」という単語を聞いて、真っ先に連想するものは、「JUnit」でしょう。しかし、テスティングフレームワークはJUnitだけではありません。「TestNG」というテスティングフレームワークも海外では高く評価され、確固とした地位を築いています。例えば、JBoss SeamはTestNGをベースにした統合テストフレームワークを提供しています。

 この連載ではTestNGのコンセプトから詳細な使い方まで解説し、開発プロジェクトにおいてTestNGを利用する際の助けとしていただくことが目的です。

 連載第1回では、Javaエンジニアになじみ深いJUnitとTestNGを比較し、2つのフレームワークに共通する部分と異なる部分を解説します。その比較を通じて、TestNGを理解していただこうと思います。後半では、実際にTestNGのテストクラスを作成し、Eclipseプラグインを使ってテストを実行します。

JUnit 3の 5つ の問題点

 JUnitは最初に広く普及したバージョン3.x(以下、JUnit 3)と、Java SE 5.0で導入されたアノテーションをベースとしたバージョン4.x(以下、JUnit 4)があります。TestNGはJUnit 4よりも前にリリースされています。そのため、TestNGのコンセプトを理解するうえでも、まずはJUnit 3の問題について考えます。

問題点【1】テストメソッドの名称が固定である

 JUnit 3では名称が「test」で始まるものだけがテストメソッドとして認識されます。そのためあるテストメソッドを実行しないときは、メソッド名を「testAdd」から「_testAdd」に変更する、といった作業が必要です。もしあるテストクラスにおいて20のテストメソッドがあり、そのうち10だけ実行したいときは、やや煩雑な作業となります。

問題点【2】テストメソッドに引数を渡せない

 テストメソッドに引数を渡せません。引数はJavaの基本的な概念ですから、利用できる方が自然です。引数としてテストメソッドに値を渡すことができれば、値を変えることでテストのバリエーションを増やすことができるといったメリットもあります。

問題点【3】例外が発生するテストが複雑である

 例外が正しく発生するかどうかテストする場合、以下のようなコードを書きます。

public void testException() {
    Target target = new Target();
    try {
        target.throwException();
        fail("例外が発生しませんでした");
    } catch (RuntimeException expected) {
        assertTrue(true);
    }
}

 このテストメソッドはthrowException()メソッドを呼び出したときに、例外RuntimeExceptionが発生するかどうかを検証します。例外が発生すればテストは成功です。

 コードでは、例外の変数名に「expected」と付けたり、例外が発生しなければfail()メソッドを呼び出してテストが失敗するようにしたりして工夫していますが、読みづらいコードです。

問題点【4】前後処理のバリエーションが少ない

 JUnit 3ではテストメソッドの事前処理はsetUp()メソッドに、事後処理はtearDown()メソッドに記述します。しかし、これらは各テストメソッドの前後に呼び出されます。初期化処理の中にはテストメソッドではなくテストクラスの単位で一度呼び出すだけでよいものもあるはずです。

図1 JUit 3でのテストの流れ 図1 JUit 3でのテストの流れ

問題点【5】テストメソッドの数だけインスタンスを生成

 これは厳密には問題点ではなく、JUnitの重要なコンセプトです。JUnitはバージョン3でも4でも、テストメソッドごとにテストクラスのインスタンスを生成します。つまり、あるテストクラスに5つのテストメソッドがあれば、インスタンスを5つ生成します。

図2 テストメソッドの数だけインスタンスを生成 図2 テストメソッドの数だけインスタンスを生成

 なぜJUnitがこのような仕組みかというと、「テストは独立しているべき」という考えのためです。テストメソッドごとにインスタンスを生成することによって、常に同じ状況でテストを実行できます。インスタンスの状態によってテストの成否に影響を与えないようにするわけです。しかし、オブジェクト指向言語を用いているにもかかわらず、オブジェクトが状態を持てないということは不便な場合もあります。

NGのテスト? 「TestNG」とは何なのか?

 ここまで、JUnitの問題点について考えました。それでは、これらの問題点を解消すべく開発されたTestNGについてお話しましょう。

 JUnit 3の問題点を解消するとともに、Java SE 5.0から導入されたアノテーションを用いてテストを記述できるようにしたテスティングフレームワークがTestNGです。

 「NG」というスペルが誤解を招きやすいですが、TestNGは「Testing, the Next Generation」を短縮して名付けられました。名前のとおり、次世代のテスティングフレームワークとしてさまざまな新しいコンセプトが盛り込まれています。中心となっている開発者はCedric Beust氏です。Beust氏はGoogleのエンジニアです。

 TestNGは大きく以下のような5つの特徴があります。連載を通じて、これらの特徴を解説します。

  1. テストにおける各種設定をXMLに記述できる
  2. アノテーションベースである
  3. 前後処理のタイミングを細かく設定できる
  4. テストをグループ化することができる
  5. テスト間に依存関係を作れる

 では、TestNGを利用する準備をしましょう。TestNGの公式サイトから配布アーカイブをダウンロードします。アーカイブを解凍し、「testng-X.X-jdk15.jar」ファイルをクラスパスに追加します。これで、TestNGを利用する準備が完了しました。

 なお、アノテーションを利用するので、Javaのバージョンは5.0以降にしてください。

 次ページでは、実際にTestNGのテストクラスを作成する方法について説明し、アノテーションを使うJUnit 4との違いについてお話します。

       1|2|3 次のページへ

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。