JUnit実践入門 5日目(テスト実行方法の制御)
JUnitのテスト実行方法
コマンドラインからの実行
org.junit.runner.JUnitCoreクラスを使用する。
// テストクラスSomeTestをコマンドラインから実行する場合 $java org.junit.runner.JUnitCore test.SomeTest // コマンドラインから複数のテストクラスを実行する場合 $java org.junit.runner.JUnitCore test.SomeTest test.OtherTest
テストクラスにmainメソッドを設定している場合は通常のJavaのクラス同様に呼び出すことができる。
JUnitCoreクラスのmainメソッドが実行されると、起動引数で指定したテストクラスからTestアノテーションのついたメソッド(テストケース)が収集、実行、テスト結果の出力が一連の流れとして実行される。
テストランナー:テストクラスに定義されたテストケースの実行に関する制御を行う。(「どのように実行するか」を制御する仕組み)
テストランナーはクラスごとに設定する。テストランナーを指定するには、テストクラスにorg.junit.runnerRunWithアノテーションを付与し、値としてテストランナーとなるクラスを指定する。
@RunWith(JUnit4.class) public class SomeTest{ }
■テストランナーの種類
・JUnit4:テストクラスの全テストケースを実行する
JUnitの標準的なテストを実行するテストランナー。明示的にテストランナーを指定しなかった場合は、このJUnit4テストランナーが使用される。
テストクラスから次の条件を満たすメソッドをテストケースとして収集し、実行する。
・Suite:複数のテストクラスをまとめて実行する
デフォルトのJUnit4テストランナーでは1つのテストクラスが対象となる。
しかしながらテストクラスが増えていくと、パッケージ内あるいはプロジェクトに含まれる全てのテストケースのテストを行いたくなる。
このような場合はSuiteクラスを用いる。
JUnitでいくつかのテストクラスを多板流には、テストスイートクラスを作成する。
テストスイートクラスには、RunWithアノテーションでSuiteテストランナーを指定する。
テストスイートクラスは、複数のテストクラスの集合であるため、慣例として「〜Tests」のように、クラス名を複数系とする。
テストスイートクラスにはメソッドなどの実装は不要。
@RunWith(Suite.class) @SuiteClalasses({FooTest.class, BarTest.class}) public class AllTests{ // FooTest.classとBarTest.classを束ねたテストスイートクラス }
またテストスイートクラスでは、他のテストスイートクラスを指定することもできる。
・Enclosed:構造化したテストクラスを実行する
標準的なテストランナーの場合、テストケースはテストクラスのpublicメソッドとして定義する。
Enclosedクラスをテストランナーとして指定した場合、ネストしたクラスを定義することができる。
これにより同じ特徴を持つテストケースをまとめ構造化できる。
@RunWith(Enclosed.class) public class ItenStockTest{ public static class 空の場合{ ItemStock sut; @before public void setUp() throws Exception{ sut = new ItenStock(); } @Test public void size_Aが0を返す() throw Exception{ assertThat(sut.size("A"), is(0)); } @Test public void contains_Aはfalseを返す() throws Exception{ assertThat(sut.contains("A"), is(false)); } } public static class 商品Aを一件以上含む場合{ // 実装は省略 // テストクラスを複数記述することができる } }
・Theories:パラメータ化したテストケースを実行する
パラメータ化テストとは、テストケースとテストデータ江尾分離し、同じテストメソッドを複数のパラメータで再利用するテクニック。
JUnitではTheoriesクラスをしてしすることで、パラメータを持つテストメソッド定義することができる。
この時、@Testの代わりに@Theoryを使用する。
テストメソッドに渡されるパラメータは、@DataPointsの付与されたstaticフィールドなどで定義する。
@RunWith(Theories.class) public class CalcTheoriestest{ @DataPoints public static int[][]value = { {0,0,0}, {0,1,1}, {1,1,1} }; @Theory public void add(int[] values)throws Exception{ Calc sut = new Calc(); assertThat(sut.add(values[0], values[1], is(values[2]))); } }
@DataPointsに設定されるパラメータも外部ファイルを読み込むことで値をsetできるようにすると対応できる幅が広がりそう。