JUnitクラスの作成サンプル〜@Before,@Afterの使い方〜

JUnitでのテストクラス作成サンプルです。

ポイントになるのはアノテーションで以下のようになっています。

@BeforeClass: テストクラスの実行時に一度だけ起動するメソッド。
<staticメソッドである必要があります、このメソッドはクラスに1つだけ定義されるべきメソッドだからです。>
@AfterClass: テストクラスの終了時に一度だけ起動するメソッド。
<BeforeClassと同様>

@Before: テストメソッドの実行毎に呼ばれるメソッド
@After:  テストメソッドの終了時に呼ばれるメソッド

シンプルにこれだけです。あとはどのようにクラスを実装するか?になります。

サンプルで実装したクラスはこちらにアップロードしてあります。(Git)

/**
 * ND4JのNd4jクラスを学習のため、テストする
 * @author takunoji
 * 2019/05/24
 */
public class TestNd4j {
    /** テスト対象クラス */
    private static ClientManager target;

    /**
     * テストクラスの実行時に一度だけ起動するメソッド。
     * Afterは終了時に呼ばれる
     */
    @BeforeClass
    public static void init() {
         System.out.println("*** BeforeClass ***");
        target = new ClientManager();
    }

    @AfterClass
    public static void after() {
         System.out.println("*** AfterClass ***");
        target = null;
    }

    /**
     * 
     * @param  取得するメソッドの引数の型
     * @param methodName
     * @return
     */
    private  Method getPrivateMethod(String methodName, Class ... args ) {
        Method method = null;
        try {
            if (args == null) {
                method = target.getClass().getDeclaredMethod(methodName);
            } else {
                method = target.getClass().getDeclaredMethod(methodName, String.class);
            }
            // 公開レベルをテストのために変更する
            method.setAccessible(true);
        } catch (NoSuchMethodException | SecurityException e) {
            e.printStackTrace();
            fail("メソッドの取得に失敗");
        }
        return method;
    }

    /**
     * ClientManagerのコンストラクタで、マッピング用行列を初期化する。
     * 1.初期化時に中身を4で埋める
     * 2.移動した時にMapを拡張するので配列の拡張方法も確認
     */
    @Test
    public void testCreateINDArray() {
        // INT型データの行列を作成する
        INDArray data = Nd4j.create(new int[] {3, 3});
        System.out.println("*** init zeros***");
        System.out.println(data);
        System.out.println("*** putScalar ***");
        System.out.println(data.putScalar(new int[] {2, 1}, 1.0));
        System.out.println("*** init ones ***");
        // 1の値で初期化された配列に全て3を足す
        INDArray reData = Nd4j.ones(new int[] {3, 3}).addi(3);
        System.out.println(reData);
        System.out.println(Nd4j.pad(reData, new int[] {6,  6}, Nd4j.PadMode.CONSTANT));
    }
   ・
   ・
   ・
   ・

こんな感じです、DBにアクセスしたり、テスト対象クラスが別のクラスを読んでいるときは、Mockしてスタブ実装してやります。そうすることで「単体テスト」を行うことができ、他のクラスを修正したからここのクラスも修正。。。なんていう火炎車になるような事態を避けることができます。

ちなみに、テストクラスなので初めに決めた仕様を満たすための検証を行うクラスなのでちゃんと作成すれば、仕様変更があった時などソースを修正して仕様通りに動けば仕様変更は完了になるので初めに実装しておくとあとあと楽になります。

その他、機能拡張、マイグレーションなどの対応にもテストがあれば(テストケースを通ればOKの状態なら)システムの変更なども作業工数が減り、会社の出費(主に人件費)の削減につながるのではないでしょうか?

でわでわ。。。