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テストランナーが使用される。
テストクラスから次の条件を満たすメソッドをテストケースとして収集し、実行する。

  • publicメソッドである
  • org.junit.Testアノテーションが付与されている
  • 戻り値がvoidで引数を持たない


・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できるようにすると対応できる幅が広がりそう。