『JUnit in Action』読習・実践 Chapter 2:Exploring core JUnit

JUnit in Action

JUnit in Action

Chapter1をだいぶ前にこなしてから開店休業状態だったこのシリーズ。Advent Calendar 2011の流れに乗じて再開させつつ、少しでも進捗を上げていこうと思います。

これまでの関連エントリ一覧。


そして以下実践・写経メモ。


2.1 Exploring core JUnit

  • テストの基本的な解説、代表的なassertメソッドの説明など。
  • Test, Suite, Runnerの定義、役割

2.2 Running parameterized tests

  • Parameterizedなテストの実行について。異なる値のパラメータ群を用いてテストを実施。
  • テストには以下の要求を満たす必要がある
    • @RunWithアノテーションをクラスに付与、クラスにParameterizedクラスを指定
    • テストで利用するインスタンス変数の宣言が必要。値を返すメソッドを定義しておく
      • 返す型はjava.util.Collectionで
      • @Parametersアノテーションを付与
      • 配列の長さはコンストラクタで必要とされるパラメータの数と一致させる
      • 最後に@Testアノテーションを使いテストメソッドを記述
      • テスト実行。コレクションの数だけ、同じテストを実施している。
      • assertEquals(...)の記述をパラメータセット数分繰り返して記述しているのと同じ。
package junitinaction.chapter02;

import static org.junit.Assert.*;

import java.util.Arrays;
import java.util.Collection;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import org.junit.runners.Parameterized.Parameters;

@RunWith(value=Parameterized.class)
public class ParameterizedTest {

    private double expected;
    private double valueOne;
    private double valueTwo;

    @Parameters
    public static Collection<Integer[]> getTestParameters() {
        return Arrays.asList(new Integer[][] {
                {2, 1, 1},	// expected, valueOne, valueTwo
                {3, 2, 1},	// expected, valueOne, valueTwo
                {4, 3, 1},	// expected, valueOne, valueTwo
                {17, 8, 9},	// expected, valueOne, valueTwo
                {0, 0, 0},	// expected, valueOne, valueTwo
                {-5, -3, -2},	// expected, valueOne, valueTwo
        });
    }

    /**
     * コンストラクタ
     */
    public ParameterizedTest(
        double exptected,
        double valueOne,
        double valueTwo) {
        this.expected = exptected;
        this.valueOne = valueOne;
        this.valueTwo = valueTwo;
    }

    @Test
    public void sum() {
        Calcurator calc = new Calcurator();
        assertEquals(expected, calc.add(valueOne, valueTwo), 0);
    }

}
  • ParameterizedクラスはJUnitのテストランナーの1つ。
  • テストランナーを使う事でテストをどの様に実施するべきかを把握することが出来る。他にもみてみよう。

2.3 JUnit test runners

  • Test Runner群の紹介。
    • org.junit.internal.runners.JUnit38ClassRunner(JUnit3系)
    • org.junit.runners.JUnit4(JUnit4系)
    • org.junit.runners.Parameterized(同じパラメータセットで異なる値のテストを実行させたい場合に用いる)
    • org.junit.runners.Suite(包括クラス:関連するクラスの@Testアノテーションの付いたメソッドを実施)
  • テスト実行時のテストランナーを明示したい場合は@RunWithアノテーションを用いる。
  • Custom test runners
    • 独自のテストランナークラスを拡張することが出来る。
    • 詳細は書籍の[appendix B]を参照。

2.4 Composing tests with a suite

  • テストをスイートクラスにまとめる方法。
  • Suiteを使って、複数のテストクラスをまとめて実行する事が出来る。
package junitinaction.chapter02;

import org.junit.runner.RunWith;
import org.junit.runners.Suite;
import org.junit.runners.Suite.SuiteClasses;

@RunWith(Suite.class)
@SuiteClasses(value={
        CalcuratorTest.class,
        ParameterizedTest.class
    })
public class Chapter02TestSuite {
}
  • 階層構造的な使い方も可能。
[...]
public class TestCaseA {
    @Test
    public void testA1() {
        // omitted
    }
}

[...]
public class TestCaseB {
    @Test
    public void testB1() {
        // omitted
    }
}

[...]
@RunWith(value=Suite.class)
@SuiteClasses(value = {TestCaseA.class})
    public class TestSuiteA {
}

[...]
@RunWith(value=Suite.class)
@SuiteClasses(value = {TestCaseB.class})
    public class TestSuiteB {
}
[...]
@RunWith(value = Suite.class)
@SuiteClasses(value = {TestSuiteA.class, TestSuiteB.class})
public class MasterTestSuite{
}
  • Suitesに関してはEclipse等のIDE、Ant、Maven等で使い勝手が良いように諸々サポートしています。


書籍の始めの方ってのもあるのかも知れないが、小一時間で終了。このスピード感を以て今後も進めていきたいところです。