勇者のLevelを経験値によって判断するクラス Level を作成する。
package rpg; public class Level { public static int getLevel(int exp) { return 1; } }
Level.java を右クリックして[新規]-[その他]を選択する。
Junitテストケースを選択して「次へ」をクリック。
getLevel()メソッドにチェックして「完了」をクリックする。
LevelTest.javaが作成される。
以下のコードを追加する。
package rpg; import static org.hamcrest.CoreMatchers.*; import static org.junit.Assert.*; import org.junit.jupiter.api.Test; class LevelTest { @Test void testGetLevel() { int l = Level.getLevel(0); assertThat(l, is(1)); } }
仕様を決める。
Level | 経験値 |
---|---|
1 | 0~10 |
2 | 11~30 |
3 | 31~60 |
4 | 61~150 |
5 | 151~ |
経験値が0から10まではレベル1で、経験値が11だとレベル1ではないというテストを書く。
package rpg; import static org.hamcrest.CoreMatchers.*; import static org.junit.Assert.*; import org.junit.jupiter.api.Test; class LevelTest { @Test void testGetLevel1() { int l = Level.getLevel(0); assertThat(l, is(1)); l = Level.getLevel(10); assertThat(l, is(1)); l = Level.getLevel(11); assertThat(l, not(1)); } }
このテストにパスするように、Level.java を修正する。
package rpg; public class Level { public static int getLevel(int exp) { if (exp > 10) return 2; return 1; } }
徐々にテストを増やしていき、Lebel.javaのコードにはテストにパスするように追加していく。
package rpg; import static org.hamcrest.CoreMatchers.*; import static org.junit.Assert.*; import org.junit.jupiter.api.Test; class LevelTest { @Test void testGetLevel1() { int l = Level.getLevel(0); assertThat(l, is(1)); l = Level.getLevel(10); assertThat(l, is(1)); l = Level.getLevel(11); assertThat(l, not(1)); } @Test void testGetLevel2() { int l = Level.getLevel(10); assertThat(l, not(2)); l = Level.getLevel(11); assertThat(l, is(2)); l = Level.getLevel(30); assertThat(l, is(2)); l = Level.getLevel(31); assertThat(l, not(2)); } @Test void testGetLevel3() { int l = Level.getLevel(30); assertThat(l, not(3)); l = Level.getLevel(31); assertThat(l, is(3)); l = Level.getLevel(60); assertThat(l, is(3)); l = Level.getLevel(61); assertThat(l, not(3)); } @Test void testGetLevel4() { int l = Level.getLevel(60); assertThat(l, not(4)); l = Level.getLevel(61); assertThat(l, is(4)); l = Level.getLevel(150); assertThat(l, is(4)); l = Level.getLevel(151); assertThat(l, not(4)); } }
Lebel.java
package rpg; public class Level { public static int getLevel(int exp) { if (exp > 150) return 5; if (exp > 60) return 4; if (exp > 30) return 3; if (exp > 10) return 2; return 1; } }
FizzBuzz問題をTDDで実装する
FuzzBuzzクラスを作成する。
package hello; public class FizzBuzz { public String answer(int i) { return null; } }
FizzBuzzTest を作成する。
package hello; import static org.junit.jupiter.api.Assertions.*; import org.junit.jupiter.api.Test; class FizzBuzzTest { @Test void testAnswer() { fail("まだ実装されていません"); } }
まず、1のときに文字列”1″が返されるという条件のテストを作成する。
package hello; import static org.hamcrest.CoreMatchers.*; import static org.junit.Assert.*; import org.junit.jupiter.api.Test; class FizzBuzzTest { @Test void testAnswer() { FizzBuzz fb = new FizzBuzz(); String a = fb.answer(1); assertThat(a, is("1")); } }
このテストにパスする最低限のコードを書く。
このような書き方を fake という。
package hello; public class FizzBuzz { public String answer(int i) { return "1"; } }
fake でテストにパスしたので、テストを追加する。
package hello; import static org.hamcrest.CoreMatchers.*; import static org.junit.Assert.*; import org.junit.jupiter.api.Test; class FizzBuzzTest { @Test void testAnswer() { FizzBuzz fb = new FizzBuzz(); String a = fb.answer(1); assertThat(a, is("1")); a = fb.answer(2); assertThat(a, is("2")); } }
テストにパスするようにFizzBuzzを修正する。
package hello; public class FizzBuzz { public String answer(int i) { if (i == 2) return "2"; return "1"; } }
テストにパスしたので、テストを追加する。
package hello; import static org.hamcrest.CoreMatchers.*; import static org.junit.Assert.*; import org.junit.jupiter.api.Test; class FizzBuzzTest { @Test void testAnswer() { FizzBuzz fb = new FizzBuzz(); String a = fb.answer(1); assertThat(a, is("1")); a = fb.answer(2); assertThat(a, is("2")); a = fb.answer(3); assertThat(a, is("Fizz")); } }
テストにパスするようにFizzBuzzを修正する。
package hello; public class FizzBuzz { public String answer(int i) { if (i == 3) return "Fizz"; if (i == 2) return "2"; return "1"; } }
テストにパスしたので、テストを追加する。
package hello; import static org.hamcrest.CoreMatchers.*; import static org.junit.Assert.*; import org.junit.jupiter.api.Test; class FizzBuzzTest { @Test void testAnswer() { FizzBuzz fb = new FizzBuzz(); String a = fb.answer(1); assertThat(a, is("1")); a = fb.answer(2); assertThat(a, is("2")); a = fb.answer(3); assertThat(a, is("Fizz")); a = fb.answer(4); assertThat(a, is("4")); } }
さすがにif文で対応すると重複した処理が増えるので、数値を文字列に変換する部分をまとめる。
package hello; public class FizzBuzz { public String answer(int i) { if (i == 3) return "Fizz"; return String.valueOf(i); } }
5の場合は “Buzz”と返すテストを作成する。
package hello; import static org.hamcrest.CoreMatchers.*; import static org.junit.Assert.*; import org.junit.jupiter.api.Test; class FizzBuzzTest { @Test void testAnswer() { FizzBuzz fb = new FizzBuzz(); String a = fb.answer(1); assertThat(a, is("1")); a = fb.answer(2); assertThat(a, is("2")); a = fb.answer(3); assertThat(a, is("Fizz")); a = fb.answer(4); assertThat(a, is("4")); a = fb.answer(5); assertThat(a, is("Buzz")); } }
テストにパスするようにFizzBuzzを修正する。
package hello; public class FizzBuzz { public String answer(int i) { if (i == 5) return "Buzz"; if (i == 3) return "Fizz"; return String.valueOf(i); } }
6は3の倍数なので “Fizz” と返す。
package hello; import static org.hamcrest.CoreMatchers.*; import static org.junit.Assert.*; import org.junit.jupiter.api.Test; class FizzBuzzTest { @Test void testAnswer() { FizzBuzz fb = new FizzBuzz(); String a = fb.answer(1); assertThat(a, is("1")); a = fb.answer(2); assertThat(a, is("2")); a = fb.answer(3); assertThat(a, is("Fizz")); a = fb.answer(4); assertThat(a, is("4")); a = fb.answer(5); assertThat(a, is("Buzz")); a = fb.answer(6); assertThat(a, is("Fizz")); } }
3の倍数なら “Fizz” と返すようにする。
package hello; public class FizzBuzz { public String answer(int i) { if (i == 5) return "Buzz"; if (i % 3 == 0) return "Fizz"; return String.valueOf(i); } }
7・8・9はこのままで問題なさそうなので飛ばす。
10は5の倍数なので “Buzz” が返されるはず。
package hello; import static org.hamcrest.CoreMatchers.*; import static org.junit.Assert.*; import org.junit.jupiter.api.Test; class FizzBuzzTest { @Test void testAnswer() { FizzBuzz fb = new FizzBuzz(); String a = fb.answer(1); assertThat(a, is("1")); a = fb.answer(2); assertThat(a, is("2")); a = fb.answer(3); assertThat(a, is("Fizz")); a = fb.answer(4); assertThat(a, is("4")); a = fb.answer(5); assertThat(a, is("Buzz")); a = fb.answer(6); assertThat(a, is("Fizz")); a = fb.answer(10); assertThat(a, is("Buzz")); } }
3の倍数と同様に、5の倍数は “Buzz” を返すようにする。
package hello; public class FizzBuzz { public String answer(int i) { if (i % 5 == 0) return "Buzz"; if (i % 3 == 0) return "Fizz"; return String.valueOf(i); } }
11・12・13・14は問題なさそうなので飛ばす。
15の倍数の時は “FizzBuzz” となるので、テストを追加する。
package hello; import static org.hamcrest.CoreMatchers.*; import static org.junit.Assert.*; import org.junit.jupiter.api.Test; class FizzBuzzTest { @Test void testAnswer() { FizzBuzz fb = new FizzBuzz(); String a = fb.answer(1); assertThat(a, is("1")); a = fb.answer(2); assertThat(a, is("2")); a = fb.answer(3); assertThat(a, is("Fizz")); a = fb.answer(4); assertThat(a, is("4")); a = fb.answer(5); assertThat(a, is("Buzz")); a = fb.answer(6); assertThat(a, is("Fizz")); a = fb.answer(10); assertThat(a, is("Buzz")); a = fb.answer(15); assertThat(a, is("FizzBuzz")); } }
テストにパスするようにFizzBuzzを修正する。
package hello; public class FizzBuzz { public String answer(int i) { if (i % 15 == 0) return "FizzBuzz"; if (i % 5 == 0) return "Buzz"; if (i % 3 == 0) return "Fizz"; return String.valueOf(i); } }
世界のナベアツをテスト駆動開発で実装する
対象となるクラス Nabeatsu を作成する。
package hello; public class Nabeatsu { public String answer(int i) { return null; } }
Junitテストケースを作成する。
package hello; import static org.junit.jupiter.api.Assertions.*; import org.junit.jupiter.api.Test; class NabeatsuTest { @Test void testAnswer() { fail("まだ実装されていません"); } }
1から3までテストを書いていく。
package hello; import static org.hamcrest.CoreMatchers.*; import static org.junit.Assert.*; import org.junit.jupiter.api.Test; class NabeatsuTest { @Test void testAnswer() { Nabeatsu n = new Nabeatsu(); String a = n.answer(1); assertThat(a, is("1")); a = n.answer(2); assertThat(a, is("2")); a = n.answer(3); assertThat(a, is("さぁ~ん!")); } }
3の倍数はFizzBuzzと同じなので簡単にできる。
package hello; public class Nabeatsu { public String answer(int i) { if (i % 3 == 0) return "さぁ~ん!"; return String.valueOf(i); } }
3の倍数ではないけど3が含まれるパターンに対応する。
package hello; import static org.hamcrest.CoreMatchers.*; import static org.junit.Assert.*; import org.junit.jupiter.api.Test; class NabeatsuTest { @Test void testAnswer() { Nabeatsu n = new Nabeatsu(); String a = n.answer(1); assertThat(a, is("1")); a = n.answer(2); assertThat(a, is("2")); a = n.answer(3); assertThat(a, is("さぁ~ん!")); a = n.answer(13); assertThat(a, is("さぁ~ん!")); } }
数値を String.valueOf() で文字列に変換し、その中に “3” が含まれるかどうかを調べる。
package hello; public class Nabeatsu { public String answer(int i) { if (i % 3 == 0) return "さぁ~ん!"; String s = String.valueOf(i); if (s.contains("3")) return "さぁ~ん!"; return s; } }