Java はじめて24 〜JUnitでのテスト駆動型開発1〜

今回はJUnitを使用して開発を行います。と言っても今まで作成していたクラスの実装を行うというだけです。
まずは、テスト仕様を作成するのですが、これは前回作成したので割愛します。

JUnit

前回、JUnitが動くことを確認するプログラムを作成しました。
なので今回は、設計部分から。。。早い話が「どー動けば良いか?」を考えることから実装を始めたいと思います。

テスト駆動

テストケース(どう動くか?)を作成することから初めていきます。
<仕様部分>
指定のファイルが存在すれば、ファイルを参照することができ、ファイルが存在しなけでば、ファイルを作成する。

今回はこの部分のみを実装します。初めにテストクラスの構成ですが、書くテストケースを実行する前にテスト対象クラスのインスタンスを新規で作成します。@Beforeアノテーションをつけてやるとそのメソッドはテストケースの実行前に起動します。

@Before
public void initClass() {
    target = new KozaManager();
}

そして、問題のテストケースですが、プログラムレベルでまずは、ファイルの読み書き用クラスのインスタンスが取得できないと話にならないのでその起動確認を行います。
そして、assertを使用できることがJUnitの魅力でもあります。

Assertとは

JUnitのフレームワークで使用できる想定通りに動いたか確認するためのメソッドです。
使い方は以下の通りです。

/**
 * コンストラクタが起動したかどうかを確認する
 * テストケース
 */
@Test
public void testIsFile() {
    assertNotNull(target);
}

上のコードでは、Assertクラスを「static import」して使用しています。のでメソッドを直接呼ぶことができます。assertNotNullなどの確認用メソッドです、上の場合だとtargetがNullの時にエラーを吐きます。他にもassertEqualsがありこれは

assertEquals(value, "aaa");

の様に使用し値が等しくない時にエラーを吐きます。

メソッドの中で完結しないのですが、@Beforeでコンストラクタを起動しているので、テストケースとしては実行済みになりますので、インスタンスがtargetの中に入っているかどうかの確認を行います。

そして、問題の「ファイルを読み込むためのクラス」は以下の様に処理を行っています。下のクラスはテスト対象クラスです。

/** コンストラクタ */
public KozaManager() {
    // 操作するファイルを指定する
    File file = new File("resources/koza.csv");
    try {
        write = new BufferedWriter(new FileWriter(file));
        if (file.exists()) {
            read = new BufferedReader(new FileReader(file));
        }
    } catch (IOException ie) {
        ie.printStackTrace();
        System.out.println("ファイルオープンに失敗しました。" + ie.getMessage());
        System.exit(-1);
    }
}

とりあえずは、このテストがうまくいく様に作成します。
しかし、今回のはコンストラクタを起動するだけ、しかもテストケースと呼べる様なものではないのでよろしくはないのですが、コンストラクタで必要なインスタンスなどを作成しないことには何も始まらないのでこの様になりました。

ポイント

  1. テストケースを作成する前の準備
  2. コンストラクタでテストケースに関連する部分を含むがテストを行ったことにはしない

とりあえずはここまでにします。

でわでわ。。。