JUnitプラグインは、プログラムの単体テスト (ユニットテスト) を自動化するためのplug-inです。
Eclipse IDE for Java EE Developers には標準で入っているため、インストールをすることなく使用可能です。
JUnitプラグインは「JUnit 3」と「JUnit 4」に対応しています。
これまで JUnit 4 を使用したことがなかったため、今回は、簡単に JUnit 4 による JUnitプラグインの使いかたをまとめてみました。
(*) JUnit 4 についてはこちらを参照させていただきました。
ちなみに JUnit 3 とのおもな違いは、テストケースをアノテーションで指定するようになったことのようです。(他にも色々あるようですが。。。)
1. テスト対象のクラス
単体テストを行うためには、当然テスト対象となるクラスが必要となります。
今回は以下のクラスを用意しました。
SampleUtility.java
public class SampleUtility {
public static final int MORNING = 1;
public static final int DAYTIME = 2;
public static final int NIGHT = 3;
public String getJapaneseHello(int time) {
String hello = null;
switch (time) {
case MORNING:
hello = "おはよう";
break;
case DAYTIME:
hello = "こんにちわ";
break;
case NIGHT:
hello = "こんばんわ";
break;
default:
throw new IllegalArgumentException("time: " + time);
}
return hello;
}
}
(*1) JavaDoc は省略しています。
(*2) エラーとするため、「こんにちわ」「こんばんわ」はあえて間違えてます。念のため。
2. 単体テスト用クラス (テストケース) の作成
SampleUtility.java を選択した状態で右クリックメニューから「新規」-「JUnit テスト・ケース」を選択すると、SampleUtility.java 用のテストケース作成用画面が表示されます。
今回は次のように指定しました。
・「新規 JUnit 4 テストケース」項目にチェック
・「パッケージ」項目を「junit.test」に変更
・「メソッドスタブ」項目を4項目全てチェック
「次へ」ボタンを選択すると、テスト対象メソッドを選択する画面に遷移します。
スーパークラスの Java.lang.Object は単体テスト不要なため、SampleUtility のみを選択します。
「完了」ボタンで SampleUtility.java 専用のテストケースの雛型 SampleUtilityTest.java が作成されます。
初回のみビルドパス追加確認画面が出ますので、JUnit 4 ライブラリを追加してください。
SampleUtilityTest.java に自動作成されたメソッドは以下の5つです。
・public static void setUpBeforeClass() throws Exception;
・public static void tearDownAfterClass() throws Exception;
・public void setUp() throws Exception;
・public void tearDown() throws Exception;
・public void testGetJapaneseHello();
testGetJapaneseHello() メソッドが SampleUtility#getJapaneseHello(int) 用のテストケースで、テスト対象のメソッド数分作成されます。
また、他の4メソッドは、「メソッドスタブ」にチェックしたため作成されました。
この雛型から次のテストケースを作成しました。
SampleUtilityTest.java
import static org.junit.Assert.*;
import org.junit.After;
import org.junit.AfterClass;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
import test.SampleUtility;
public class SampleUtilityTest {
@BeforeClass
public static void setUpBeforeClass() throws Exception {
System.out.println("setUpBeforeClass()");
}
@AfterClass
public static void tearDownAfterClass() throws Exception {
System.out.println("tearDownAfterClass()");
}
@Before
public void setUp() throws Exception {
System.out.println("setUp()");
}
@After
public void tearDown() throws Exception {
System.out.println("tearDown()");
}
@Test
public void testGetJapaneseHelloMorning() {
System.out.println("testGetJapaneseHelloMorning()");
SampleUtility util = new SampleUtility();
assertEquals("おはよう", util.getJapaneseHello(SampleUtility.MORNING));
}
@Test
public void testGetJapaneseHelloDayTime() {
System.out.println("testGetJapaneseHelloDayTime()");
SampleUtility util = new SampleUtility();
assertEquals("こんにちは", util.getJapaneseHello(SampleUtility.DAYTIME));
}
@Test
public void testGetJapaneseHelloNigth() {
System.out.println("testGetJapaneseHelloNigth()");
SampleUtility util = new SampleUtility();
assertEquals("こんばんは", util.getJapaneseHello(SampleUtility.NIGHT));
}
}
(*1) JavaDoc は省略しています。
(*2) テストケースでは「こんにちは」「こんばんは」としています。
(*3) testGetJapaneseHello() は朝・昼・晩の3つに分けました。
3. テストケースの実行
SampleUtilityTest.java を選択した状態で右クリックメニューから「実行」-「JUnit テスト」を選択してください。単体テストが始まります。
初回の結果は、
と、あたりまえですが、3ケースのうち2ケースがエラーとなっています。
4. 修正と再テスト
SampleUtility#getJapaneseHello(int) について
・「こんにちわ」→「こんにちは」
・「こんばんわ」→「こんばんは」
と修正します。
そして再テスト。
今回は全てのテストケースが成功しました。
5. メソッドの実行順
SampleUtilityTest.java の全てのメソッドには System.out.println("...") を埋め込みました。
これらの実行順をログで確認してみます。
setUp()
testGetJapaneseHelloMorning()
tearDown()
setUp()
testGetJapaneseHelloDayTime()
tearDown()
setUp()
testGetJapaneseHelloNigth()
tearDown()
tearDownAfterClass()
1. @BeforeClass アノテーションを定義したメソッドを実行
2. テストケース実行
2.1. @Before アノテーションを定義したメソッドを実行
2.2. @Test アノテーションを定義したメソッドを実行 (実際のテストケース)
2.3. @After アノテーションを定義したメソッドを実行
(*) 2.1.~2.3.を @Test アノテーションがなくなるまで繰り返し実行
3. @AfterClass アノテーションを定義したメソッドを実行
の順で実行されるようです。