テストデータとテストを分離するには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); } }
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
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(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