タイトル
TOPJavaテスト → This Page

JUnit(JUnit3,JUnit4)の補足事項【ユニットテスト - テスト】

前提

このページに記載している内容は2011/01/23に書かれたものです。
掲載している画面や方法が将来的に変更されている場合があります。
ここでは JUnit に関する注意事項や補足事項を紹介します。

テスト実行順序

テスト・メソッドは上から順番に実行されるわけではありません。
なので、
public void testCreateFile() {
	// ファイルを作成
	・・・
}
public void testReadFile() {
	// 作成ファイルを読み込み
	・・・
}
public void testDeleteFile() {
	// 作成ファイルを削除
	・・・
}
のように、testCreateFile テスト・メソッドで作成したファイルを次の testReadFile テスト・メソッドを読み込むといった
別のテストに依存するテストを作ってはいけません。
上から順番に実行されるわけではないので、testCreateFile の前に testReadFile が実行されるかもしれないからです。

setUp、tearDown

JUnit3,JUnit4のページでも軽く紹介しましたが、
setUp メソッドは各テスト・メソッドが呼び出される前に実行されるメソッド、
tearDown メソッドは各テスト・メソッドが呼び出さた後に実行されるメソッドです。
各テスト・メソッドごとに毎回実行されます。

これを利用して各テストの前処理、後処理をスッキリ記述します。

例えばデータベースを利用したメソッドに対するテストを作成する場合、
以下のようにそれぞれのテスト・メソッドにデータベースへの接続と切断を記述すると冗長になります。
public void testSelectUserData1() {
	// データベースに接続
	・・・
	// レコードの取得1
	・・・
	// データベースから切断
	・・・
}
public void testSelectUserData2() {
	// データベースに接続
	・・・
	// レコードの取得2
	・・・
	// データベースから切断
	・・・
}
public void testSelectUserData3() {
	// データベースに接続
	・・・
	// レコードの取得3
	・・・
	// データベースから切断
	・・・
}

これを setUp、tearDown メソッドを使ってスッキリさせましょう。
protected void setUp() {
	// データベースに接続
	・・・
}
protected void tearDown() {
	// データベースから切断
	・・・
}
public void testSelectUserData1() {
	// レコードの取得1
	・・・
}
public void testSelectUserData2() {
	// レコードの取得2
	・・・
}
public void testSelectUserData3() {
	// レコードの取得3
	・・・
}
これで各テスト・メソッドがスッキリしましたね。

例外のテスト

JUnit3 と JUnit4 では例外のテストのやりかたが違います。
以下に例を挙げます(ちょっと極端なサンプルだけど)

JUnit3
public void testNullPointerException() {
	String value = null;
	try {
		System.out.print(value.length());
		fail("失敗");
	} catch (NullPointerException e) {
		assertTrue(true);
	}
}

JUnit4
@Test(expected=NullPointerException.class)
public void nullPointerException() {
	String value = null;
	System.out.print(value.length());
}

JUnit4 のほうがアノテーションを使うことによってテスト・メソッドが簡単になっています。


タイムアウト

JUnit4では指定した時間内にテストが終わるかどうかを検証可能です。

@Test(timeout=1000)
public void nullPointerException() {
	// 処理を記述
}

Test アノテーションに timeout にミリ秒を指定します。
指定時間内にテストが終了しなければ失敗となります。
ただし、以下の点に注意が必要です。
・実際には「テストにかかった時間」+「テストの準備時間」で計測される
 つまり「@Before をつけたメソッドの処理時間」+「メソッドの処理時間」が
 timeout 指定時間内に終了するかどうかで判断される。
・Thread.sleep() でスリープ中にタイムアウトになっても失敗扱いされない。

更新履歴

2011/04/24 テスト実行順序、setUp、tearDownの内容を追加
2011/01/23 新規作成


TOPJavaテスト → This Page