分岐網羅で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から使用可能で、このバージョンから推奨されているメソッドらしいです。