Eclipse JUnitプラグインの使い方 (JUnit 4) 編

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

package test;

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 用のテストケース作成用画面が表示されます。

20100520_01

今回は次のように指定しました。
  ・「新規 JUnit 4 テストケース」項目にチェック
  ・「パッケージ」項目を「junit.test」に変更
  ・「メソッドスタブ」項目を4項目全てチェック

「次へ」ボタンを選択すると、テスト対象メソッドを選択する画面に遷移します。

20100520_02

スーパークラスの Java.lang.Object は単体テスト不要なため、SampleUtility のみを選択します。
「完了」ボタンで SampleUtility.java 専用のテストケースの雛型 SampleUtilityTest.java が作成されます。

初回のみビルドパス追加確認画面が出ますので、JUnit 4 ライブラリを追加してください。

20100520_03

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

package junit.test;

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 テスト」を選択してください。単体テストが始まります。

初回の結果は、

20100520_04

と、あたりまえですが、3ケースのうち2ケースがエラーとなっています。

4. 修正と再テスト

SampleUtility#getJapaneseHello(int) について
  ・「こんにちわ」→「こんにちは」
  ・「こんばんわ」→「こんばんは」
と修正します。

そして再テスト。

20100520_05

今回は全てのテストケースが成功しました。

5. メソッドの実行順

SampleUtilityTest.java の全てのメソッドには System.out.println("...") を埋め込みました。
これらの実行順をログで確認してみます。

setUpBeforeClass()
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 アノテーションを定義したメソッドを実行

の順で実行されるようです。

[ END ]


コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

*