こんにちは。ハンドルネーム「Javaを復習する初心者」です。このサイトはプログラミング言語Javaの復習・学習をするブログです。プログラムの開発・実行はEclipseで行ってます。
スポンサーリンク
お知らせ
  • 参考文献のページ作りました。
  • Amazon.co.jpアソシエイトに参加していますが、参考文献の紹介はもしもアフィリエイトに統一しました。
  • 2016年10月9日からは投稿ペースを落とします。週1回くらいにする予定です。
スポンサーリンク

分岐網羅でJUnitテスト

こんにちは。「Javaを復習する初心者」です。今回もJUnitテストを使ってみました。

Fizz Buzz問題というプログラミングの練習問題があります。与えらた数字に対して、3で割り切れる場合は「Fizz」、5で割り切れる場合は「Buzz」、両者で割り切れる場合「FizzBuzz」、それ以外の場合、数字を答える問題です。

Javaで実装

この問題をJavaで実装しました。FizzBuzzというクラスを作り、staticメソッドを作りました。

public class FizzBuzz {

    private static final String RES_FIZZBUZZ = "FizzBuzz";
    private static final String RES_FIZZ     = "Fizz";
    private static final String RES_BUZZ     = "Buzz";

    public static String replyBasedOn(int i) {
        String s;

        if (i % 3 == 0 && i % 5 == 0) {
            s = RES_FIZZBUZZ;
        } else if (i % 3 == 0) {
            s = RES_FIZZ;
        } else if (i % 5 == 0) {
            s = RES_BUZZ;
        } else {
            s = String.valueOf(i);
        }

        return s;
    }

}

上記のreplyBasedOn()メソッドはstaticメソッドです。なのでクラスのインスタンスを生成することなく使用することができます。このメソッドは引数iに対して、以下のように文字列を返却します。

引数iの条件 返却する文字列
3または5の倍数 “FizzBuzz”
3の倍数 “Fizz”
5の倍数 “Buzz”
上記以外 i

今回はこのメソッドをテストします。ホワイトボックスの観点でテストします。つまり、内部の構造を理解した上で意図した通りに動作しているかを確認するテストを行います。分岐網羅という方針で行います。if文それぞれについて、条件を満たすパターンを考えます。結果、以下のケースになります。

case iの値 期待値
No. 1 15 FizzBuzz
No. 2 6 Fizz
No. 3 10 Buzz
No. 4 2 2

テストケース

上記のテストで分岐を全て網羅することができます。テストケースは以下のように作りました。

public class FizzBuzzTest {

    @Test
    public void test1() {
        assertThat(FizzBuzz.replyBasedOn(15), is("FizzBuzz"));
    }

    @Test
    public void test2() {
        assertThat(FizzBuzz.replyBasedOn(6), is("Fizz"));
    }
    @Test
    public void test3() {
        assertThat(FizzBuzz.replyBasedOn(10), is("Buzz"));
    }
    @Test
    public void test4() {
        assertThat(FizzBuzz.replyBasedOn(2), is("2"));
    }

}

上記を実施すると、パスすることが確認できます。

FizzBuzz#replyBasedOn()メソッドの返却値はString型であることに注意が必要です。最後の「assertThat(FizzBuzz.replyBasedOn(2), is(“2”));」で「is(2)」とするとテストが失敗になります。

前回書き忘れましたが、@Testアノテーションによって、メソッドがテストであることを表します。また、assertThat(xxx, is(yyy))でxxxがyyyであることをチェックできるようです。このメソッドはjUnit4.4から使用可能で、このバージョンから推奨されているメソッドらしいです。