JUnit

JUnitで複数のテストパターンを一括で実行できるようにしてみた

前回は基本的なアサーションについて述べてきたが、今回は@DataPointsアノテーションと@Theoryアノテーションを利用し、複数のテストパターンを一括で実行できるようにしてみたので、そのサンプルプログラムを共有する。

@DataPointsアノテーション、@Theoryアノテーションについては以下のサイトを参照のこと。
https://qiita.com/55beagle/items/080adc37bde109b8a833

前提条件

下記記事の実装が完了していること。

JUnitのアサーションを利用してみたJavaのプログラムの単体テストを自動化するツールに「Junit」があり、これを利用すると、テストを自動化でき、繰り返し実行できるように...



サンプルプログラムの内容

作成したサンプルプログラムの構成は以下の通り。
サンプルプログラムの構成
なお、上図の赤枠は、今回新規で作成したサンプルプログラムの内容で、他は「前提条件」に記載したプログラムと同一となる。



作成した「DemoUtilTheoriesTest.java」の内容は以下の通り。

package com.example.demo;

import org.junit.Ignore;
import org.junit.experimental.theories.DataPoints;
import org.junit.experimental.theories.Theories;
import org.junit.experimental.theories.Theory;
import org.junit.runner.RunWith;

import static org.junit.Assert.assertEquals;

@RunWith(Theories.class)
public class DemoUtilTheoriesTest {

    /**
     * テストデータ
     * DemoUtil.checkDateに渡す引数、想定結果を順に配列にしている
     * DateFixtureクラスは下方に定義
     */
    @DataPoints
    public static DateFixture[] testFixtures = {
            new DateFixture(null, "12", "14", 1)
            ,new DateFixture("2019", "", "14", 2)
            ,new DateFixture("2019", "12", null, 3)
            ,new DateFixture("2019", "2", "29", 4)
            ,new DateFixture("2019", "12", "14", 0)
    };

    /**
     * テストメソッド
     * @param dateFixture DateFixtureクラスのオブジェクト
     */
    @Theory
    public void testCheckDate(DateFixture dateFixture){
        //引数に渡された値を表示
        //「@DataPoints」アノテーションを付与したtestFixturesの配列の要素が
        //順に設定されることが確認できる
        System.out.println(dateFixture.year + "年" + dateFixture.month
                + "月" + dateFixture.day + "日"
                + " : (想定結果) " + dateFixture.expect);
        //結果を判定
        assertEquals(dateFixture.expect, DemoUtil.checkDate(
              dateFixture.year, dateFixture.month, dateFixture.day));
    }

    /**
     * DemoUtil.checkDateに渡す引数、想定結果を格納するための内部クラス
     * テスト対象から除外するため、@Ignoreを付与している
     */
    @Ignore("its fixture class")
    public static class DateFixture {
        private String year;   //年
        private String month;  //月
        private String day;    //日
        private int expect;    //想定結果

        public DateFixture(String year, String month, String day, int expect) {
            this.year = year;
            this.month = month;
            this.day = day;
            this.expect = expect;
        }
    }
}

「@DataPoints」アノテーションを付与したクラス配列で、テストを行う引数・戻り値の組み合わせを指定している。なお、ここで利用している「DateFixture」は内部staticクラスで、このプログラムの後方に記載している。

また、「@Theory」を付与したメソッドが今回のテスト対象メソッドである。「@DataPoints」アノテーションを付与した配列の要素をメソッドの引数で順に受け取ることによって、テストデータそれぞれについてテストを行っている。

さらに、クラスの先頭に「@RunWith(Theories.class)」を付与することで、「@Theory」を付与したメソッドのテストが行えるようになっている。



その他のソースコード内容は、以下のサイトを参照のこと。
https://github.com/purin-it/java/tree/master/junit-many-pattern-atonce/demo

また、本Junitプログラムの実行結果は以下の通りで、「@DataPoints」アノテーションを付与した配列の要素をメソッドの引数で順に受け取ってテストを行っていることが確認できる。
実行結果

要点まとめ

  • @DataPointsアノテーションと@Theoryアノテーションを利用すると、複数のテストパターンを一括で実行できる。