My Photo

« JUnit その2:aseertThat()とMatcher API | Main | 明日から仕事 »

August 19, 2012

JUnit その3:テストクラスの構造化とパラメータ化テスト

テストクラスの肥大化への対応としてテストクラスの構造化とパラメータ化テストがある。

テストクラスの構造化

org.junit.experimental.runners.Enclosedクラスはネストしたクラスをテストとして扱うことができるテストランナー。
テストをコンテキスト(初期状態、内部状態など)で分割し、それぞれのテストクラスをネストしたクラスにすればテストクラスを構造化できる。

パラメータ化テスト

パラメータ化テストに関数するクラス・アノテーションは org.junit.experimental.theories パッケージに定義されている。 Theoriesクラスはパラメータ化されたユニットテストをサポートするテストランナー。
テストメソッドには @Test ではなく @Theoryを付ける。これでテストメソッドに引数を取らせることができる。
パラメータ(テストデータ)は @DataPoint または @DataPoints を使用する。@DataPoint ではテストデータをpublic staticなフィールドまたはメソッドで1つずつ定義する。たとえば

@DataPoint
public static int INT_PARAM_1 = 3;
@DataPoint
public static int INT_PARAM_2 = 4;

とパラメータを定義した場合、

テストメソッド(3, 3)
テストメソッド(3, 4)
テストメソッド(4, 3)
テストメソッド(4, 4)

のようにパラメータの順列の数だけすべてのパターンでテストが行われる。各パターンごとにインスタンスが生成されるので、初期かも各パターンごとに行われる。

@DataPointsではテストデータを配列としてまとめて定義する。
サンプルコードでは割られる数、割る数、期待値の3つのパラメータが必要だがすべての順列のパターンでテストが行われるのは問題なので、引数をオブジェクトにしてオブジェクトの配列をパラメータとして定義している。

@RunWith(Enclosed.class)
public class CalculatorParameterizedTest {

	@RunWith(Theories.class)
	public static class 乗算メソッドのパラメータ化テスト {
		
		@DataPoint public static Fixture DATA1 = new Fixture(3, 4, 12);
		@DataPoint public static Fixture DATA2 = new Fixture(5, 7, 35);
		
		@Theory
		public void multiplyで乗算結果が取得できること(Fixture fx) {
			
			String msg = fx.x + "*" + fx.y + "=" + fx.expected;
			System.out.println(msg);
			Calculator calc = new Calculator();
			int expected = fx.expected;
			int actual = calc.multiply(fx.x, fx.y);
			assertThat(msg, actual, is(expected));
		}
		
		static class Fixture {
			int x, y, expected;

			Fixture(int x, int y, int expected) {
				this.x = x;
				this.y = y;
				this.expected = expected;
			}
		}
	}
}

参考記事:WEB DB PRESS Vol.69 JUnit実践入門

« JUnit その2:aseertThat()とMatcher API | Main | 明日から仕事 »

「Java」カテゴリの記事

Comments

Post a comment

(Not displayed with comment.)

TrackBack

TrackBack URL for this entry:
http://app.cocolog-nifty.com/t/trackback/26461/55456688

Listed below are links to weblogs that reference JUnit その3:テストクラスの構造化とパラメータ化テスト:

« JUnit その2:aseertThat()とMatcher API | Main | 明日から仕事 »

April 2017
Sun Mon Tue Wed Thu Fri Sat
            1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30            
無料ブログはココログ

日本blog村

  • にほんブログ村 IT技術ブログへ
  • にほんブログ村 アニメブログへ
  • にほんブログ村 サッカーブログ アルビレックス新潟へ

好きな音楽家

メモ

XI-Prof