JUnit 実践入門 体系的に学ぶユニットテストの技法 - 第8章 パラメータ化テスト テストケースとテストデータの分離

第8章 パラメータ化テスト テストケースとテストデータの分離

  • 異なる入力値について似たようなテストを実施する場合など、テストケース毎の差異が入力値と期待値だけ、のような状況下において、入力値と期待値をパラメータとして外部化することで見通しを良くする

8.1 テストデータの選択

  • 同値クラス
  • 組み合わせによるテストデータ選択
    • 「プログラムに混入する不具合のほとんどは、単項目に関連する不具合」
    • よって「条件をすべて満たす、あるいは1つだけ満たさない」でテストデータを選択すると幸せ
      • すべて満たす → true返すはずが、条件1つバグってるの検知できる
      • 1つだけ満たさない → false返すはずが、条件1つバグってるの検知できる
  • 境界値も組み合わせるとよりイイね

8.2 入力値と期待値のパラメータ化

  • テストデータの組み合わせによりテストコードが冗長化するのを防ぐ、パラメータ化テスト parameterized test
    • テストデータとテストメソッドを分割する

Theories - パラメータ化テストのテストランナー

  • @RunWith でテストクラスに付与する

@Theory - テストメソッドに指定するアノテーション

  • @Test の代わり
  • 任意の引数を宣言できる

@DataPoint - パラメータを指定するアノテーション

  • パラメータは static かつ public なフイールドで定義する
package ch08;

import org.junit.experimental.theories.DataPoint;
import org.junit.experimental.theories.Theories;
import org.junit.experimental.theories.Theory;
import org.junit.runner.RunWith;

@RunWith(Theories.class)
public class ParameterizedTest {
    @DataPoint
    public static int INT_PARAM_1 = 3;
    @DataPoint
    public static int INT_PARAM_2 = 4;
    
    public ParameterizedTest() {
        System.out.println("初期化");
    }
    
    @Theory
    public void 引数を持つテストメソッド(int param) throws Exception {
        System.out.println("引数を持つテストメソッド (" + param + ")");
        
    }
}
初期化
引数を持つテストメソッド (3)
初期化
引数を持つテストメソッド (4)
  • @DataPoint 指定した値が渡さている
  • 「初期化」が二回出てきてる → コンストラクタが二回呼ばれてる
    • 都度都度オブジェクトが生成されている
package ch08;

import org.junit.experimental.runners.Enclosed;
import org.junit.experimental.theories.DataPoint;
import org.junit.experimental.theories.Theories;
import org.junit.experimental.theories.Theory;
import org.junit.runner.RunWith;

@RunWith(Enclosed.class)
public class EnclosedParameterizedTypeTest {
    @RunWith(Theories.class)
    public static class intのパラメータ化テスト {
        @DataPoint
        public static int INT_PARAM_1 = 3;
        @DataPoint
        public static int INT_PARAM_2 = 4;
        
        @Theory
        public void 引数がint型のテストメソッド(int param) throws Exception{
            System.out.println("引数がint型のテストメソッド (" + param + ")");
        }
    }

    @RunWith(Theories.class)
    public static class Stringのパラメータ化テスト{
         @DataPoint
         public static String STRING_PARAM_1 = "Hello";
         @DataPoint
         public static String STRING_PARAM_2 = "World!";

         @Theory
         public void 引数がString型のテストメソッド(String param) throws Exception {
             System.out.println("引数がString型のテストメソッド (" + "param" + ")");
         }
    }
}
引数がString型のテストメソッド (param)
引数がString型のテストメソッド (param)
引数がint型のテストメソッド (3)
引数がint型のテストメソッド (4)

 
 

JUnit実践入門 ~体系的に学ぶユニットテストの技法 (WEB+DB PRESS plus)

JUnit実践入門 ~体系的に学ぶユニットテストの技法 (WEB+DB PRESS plus)