Java はじめて31 〜JUnitでのテスト駆動型開発8: 処理をつなげたテスト〜

イントロダクション

今まではユニットテスト(単体テスト)をやっていましたが、複数のクラスを実行するテストケースも作成することができます。
プログラム的には、実行するプログラムを増やすだけですが。。。

イメージとしては、メインメソッドを動かすテストを実行するようなイメージです。
そうすれば、メインメソッドを動かした方が早いような気がしますが、大掛かりなアプリケーションの場合は、そうもいきません。

なので、「足し算をする処理のテスト」「ファイルを読み込むテスト」とテストを行った後に、口座に入金するテストをするというような形です。

今回のような小さなプログラムでは、あまり意味がありませんが。。。

今回は、今まで作成した1処理を「機能」として動かせることを確認するテストケースを作成します。
通常のやり方では、1.実装、2.テストと分けた場合の「2.テスト」にあたります。

機能テスト

仕様は以下の通りです。

仕様
1. ファイルを操作するためのオブジェクトを作成する
2. ファイルにデータをCSV形式で書き出す。
3. ファイルが存在するのであれば、それを読み込みデータを保持する

今までの実装、テストで行くと「3」が実装したものに相当します。なので、これをテストケースで確認する様にします。
現状では、スタブのままなので未実装になっています。
なのでテストケースを先に作成します。
ちなみに、最終的なコードはGithubにあります。

  1. KozaManager.java
  2. KozaManagerTest.java
@Test
public void testFileRead() {
    if (target.isFile() == false) {
        fail("ファイルが存在していません");
    }
    List<Data> dataList = target.readFile();
    // データは1件
    assertEquals(1, dataList.size());
    // ファイルにあるデータ
    Data data = dataList.get(0);
    assertEquals("test", data.getName());
    assertEquals("passwd", data.getPassword());
}

とりあえずで、上の様に作成しました。初めにファイルの存在チェック処理を確認して、ファイルが存在しないならテスト失敗。
次にファイルの読み込みを行い、そのデータを取得しデータが想定通りのものが入っているか確認します。

余談

テストを複数回行っていたので「koza.csv」にデータが複数作成されていました。ヘッダー付きなのでこれはダメなテストになってしまうので、ちょっと修正します。
<修正1>
「ファイルが存在するときにはファイル作成をしない」が抜けていたのでこれを追加します。

// ファイルそ新規で作成するとき
if (file.exists() == false) {
    // ヘッダー部分の出力
    build.append(this.createCSVHeader());
    // ファイル書き込み処理
    write.write(build.toString());
    write.newLine();
}

そして、修正後のメソッドは以下の様になります。

public void dataOutput(Data data) throws IOException {
    if (file.canWrite() == false) {
        throw new IOException("ファイルの書き込みができません: " + file.getAbsolutePath());
    }
    // おおよそのデータサイズを指定すると余計なメモリを使用しなくて済む
    StringBuilder build = new StringBuilder(50);
    // ファイルを新規で作成するとき
    if (file.exists() == false) {
        // ヘッダー部分の出力
        build.append(this.createCSVHeader());
        // ファイル書き込み処理
        write.write(build.toString());
        write.newLine();
    }
    // StringBuilderのクリア
    build.setLength(0);
    // データ部分の書き込み
    build.append(data.getName() + ",");
    build.append(data.getPassword());
    write.write(build.toString());
    write.newLine();
    write.close();
}

これで、ファイルが存在しているのに新たにファイルを作成することがなくなります。

しかし、テストはうまくいきませんでした。
これの原因は、テストケースにありました。

@Test
public void testFileRead() {
    if (target.isFile() == false) {
        fail("ファイルが存在していません");
    }
    List<Data> dataList = target.readFile();
    // データは1件
    assertEquals(1, dataList.size());
    // ファイルにあるデータ
    Data data = dataList.get(0);
    assertEquals("test", data.getName());
    assertEquals("passwd", data.getPassword());
}

取得したデータのサイズ(ファイルの行数)は1の想定ですが、テストを実行するたびにデータが追加されるので、テストが毎回同じ結果になりません。

これは良くない

なので、ここもちょっと修正します。

// データは0件ではない
assertNotEquals(0, dataList.size());

こんな感じで修正しました。そして、複数件あっても作成されるデータは同じなので初めの一件目が想定通りの値かどうか確認します。ここでちょっと注意「初めの1行目はヘッダー行なのでデータ部ではないですが、取得したときはリストの1番目に設定されています。なので以下の様に修正します。

public void testFileRead() {
    if (target.isFile() == false) {
        fail("ファイルが存在していません");
    }
    List<Data> dataList = target.readFile();
    // データは0件ではない
    assertNotEquals(0, dataList.size());
    // ファイルにあるデータは2行目から
    Data data = dataList.get(1);
    assertEquals("test", data.getName());
    assertEquals("passwd", data.getPassword());
}

こんな感じでファイル読み込みの一連の機能をテストしました。これと同様に、他ものもテストしました。わかりづらいですが、上のキャプチャにテストケースが、4つあります。
ファイル作成、ファイル存在チェックの処理の他は読み込みと書き込みをテストしています。

ちょっと締まりが悪いですが。今回はこれまでにします。

ここまでで31回分の学習を行いました。ここまで来たら(もしかすると途中で。。。)自分で考えて学習を進めることができるレベルまで来ているのではないでしょうか?「いや?」という声がないと良いのですが、「物事を伝えるのは至難」とも言います。また別な角度で同じことを記述したいと思います。
Jaba Basic Lv1」と称して再度記載しました。こちらも併せてご利用ください。

でわでわ。。。

<<< 前回

<Java関連の動画リスト>

<JUnit関連の動画リスト>



投稿者:

takunoji

音響、イベント会場設営業界からIT業界へ転身。現在はJava屋としてサラリーマンをやっている。自称ガテン系プログラマー(笑) Javaプログラミングを布教したい、ラスパイとJavaの相性が良いことに気が付く。 Spring framework, Struts, Seaser, Hibernate, Playframework, JavaEE6, JavaEE7などの現場経験あり。 SQL, VBA, PL/SQL, コマンドプロント, Shellなどもやります。

コメントを残す