Page History

02. パラメータ化テスト

yhornisse edited this page on 29 Dec 2019

Clone this wiki locally

パラメータ化テスト

テストデータとテストを分離するにはTheoriesとTheoryを使用する。 以下の2つはどちらも同じような内容である。

@RunWith(Theories.class)
public class App3Test {
    @DataPoint
    public static int v1 = 1;
    @DataPoint
    public static int v2 = 2;
    @DataPoint
    public static int v3 = 3;
 
    @Theory
    public void case1(int v)
    {
        System.out.println("case1: " + v);
    }
 
    @Theory
    public void case2(int v)
    {
        System.out.println("case2: " + v);
    }
}
@RunWith(Theories.class)
public class App4Test {
    @DataPoints
    public static int[] v = {1, 2, 3};
 
    @Theory
    public void case1(int v)
    {
        System.out.println("case1: " + v);
    }
 
    @Theory
    public void case2(int v)
    {
        System.out.println("case2: " + v);
    }
}

出力結果は以下のような内容である。

-------------------------------------------------------
 T E S T S
-------------------------------------------------------
Running com.sample.App3Test
case1: 1
case1: 2
case1: 3
case2: 1
case2: 2
case2: 3
Tests run: 2, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.064 sec

コード全体は以下を参照。

テストケースごとにテストデータを分ける場合

テストケースごとにテストデータの型が違う場合は以下だけで良い。

@RunWith(Theories.class)
public class App4bTest {
    @DataPoints
    public static int[] v1 = {1, 2, 3};
    @DataPoints
    public static String[] v2 = {"hoge", "fuga"};

    @Theory
    public void case1(int v)
    {
        System.out.println("case1: " + v);
    }

    @Theory
    public void case2(String v)
    {
        System.out.println("case2: " + v);
    }
}
Running com.sample.App4bTest
case1: 1
case1: 2
case1: 3
case2: hoge
case2: fuga
Tests run: 2, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.009 sec

しかし、テストパターンごとにテストデータの型が同じ場合、
例えばテストパターンAで1と2、テストパターンBで3と4をテストデータとして与えたいような場合は
Enclosedを使ってサブクラスとしてテストクラスを定義しなければならない。
(JUnitでは1クラスにつき1つのテスト用のファイルを書くため、ファイルは分離できない)

@RunWith(Enclosed.class)
public class App5Test {
    @RunWith(Theories.class)
    public static class App5TestPattern1 {
        @DataPoints
        public static int[] v = {1, 2, 3};

        @Theory
        public void case1(int v)
        {
            System.out.println("case1: " + v);
        }
    }

    @RunWith(Theories.class)
    public static class App5TestPattern2 {
        @DataPoints
        public static int[] v = {4, 5, 6};

        @Theory
        public void case2(int v)
        {
            System.out.println("case2: " + v);
        }
    }
}
-------------------------------------------------------
 T E S T S
-------------------------------------------------------
Running com.sample.App5Test
case2: 4
case2: 5
case2: 6
case1: 1
case1: 2
case1: 3
Tests run: 2, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.058 sec

複数の引数を扱う場合

テストケースでテストデータが複数の引数(の組み合わせ)の場合、 DataPointやDataPointsを複数記載する。

@RunWith(Theories.class)
public class App6Test {
    @DataPoints
    public static int[] v1 = {1, 2, 3};
    @DataPoints
    public static String[] v2 = {"hoge", "fuga"};

    @Theory
    public void case1(int v, String s)
    {
        System.out.println("case1: " + v + ", " + s);
    }

    @Theory
    public void case2(int v, String s)
    {
        System.out.println("case2: " + v + ", " + s);
    }
}
-------------------------------------------------------
 T E S T S
-------------------------------------------------------
Running com.sample.App6Test
case1: 1, hoge
case1: 1, fuga
case1: 2, hoge
case1: 2, fuga
case1: 3, hoge
case1: 3, fuga
case2: 1, hoge
case2: 1, fuga
case2: 2, hoge
case2: 2, fuga
case2: 3, hoge
case2: 3, fuga

引数を組み合わせではなく、それぞれ記載する場合は新たに引数格納用のクラスを定義する。

@RunWith(Theories.class)
public class App7Test {
    static class Fixture {
      int i;
      String s;

      Fixture(int i, String s) {
        this.i = i;
        this.s = s;
      }
    }

    @DataPoints
    public static Fixture[] v = {
      new Fixture(1, "hoge"),
      new Fixture(2, "fuga"),
      new Fixture(3, "piyo")
    };

    @Theory
    public void case1(Fixture f)
    {
        System.out.println("case1: " + f.i + ", " + f.s);
    }
}

https://pied-piper.net/gitbucket/sample-java/sample-junit1/blob/master/src/test/java/com/sample/App7Test.java

Running com.sample.App7Test
case1: 1, hoge
case1: 2, fuga
case1: 3, piyo
Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.001 sec

その他

  • TestとTheoryはどちらも同じクラスに記載可能。
  • 以下のような場合はv1 = {1, 2, 3, 4, 5, 6}と書いた場合と同じ結果。
      @DataPoints
      public static int[] v1 = {1, 2, 3};
      @DataPoints
      public static int[] v2 = {4, 5, 6};
    
      @Theory
      public void case1(int v)
      {
          System.out.println("case1: " + v);
      }
  • 上記のcase1がcase1(int i, String s)のような形式の場合は以下のような結果となる。
    Running com.sample.App4bTest
    case1: 1, hoge
    case1: 1, fuga
    case1: 2, hoge
    case1: 2, fuga
    case1: 3, hoge
    case1: 3, fuga
    case2: 1
    case2: 2
    case2: 3
    Tests run: 2, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.008 sec