JUnitというテスティングフレームワークを使うと、Javaプログラミングをリズムよく進めることができます。
うるう年判定
うるう年判定プログラムを作成してみよう。
新規ファイル「LeapYear.java」を作成する。
うるう年の条件は以下の通り。
- 西暦年号が4で割り切れる年は、うるう年です。
- ただし、西暦年号が100で割り切れる年は、通常は平年です。
- しかし、西暦年号が400で割り切れる年は、うるう年です。
public class LeapYear { public static void main(String[] args) { String y = args[0]; int year = Integer.parseInt(y); if (isLeapYear(year)) { System.out.println(year + "は、うるう年"); } else { System.out.println(year + "は、平年"); } } public static boolean isLeapYear(int year) { return false; } }
うるう年判定を作るには、JUnitというテスティングフレームワークを使うと便利!
LeapYearTest.javaを新規作成して、以下のコードを記述する。
import static org.junit.jupiter.api.Assertions.*; import org.junit.jupiter.api.Test; public class LeapYearTest { @Test public void testLeapYear() { assertTrue(LeapYear.isLeapYear(2000)); assertTrue(LeapYear.isLeapYear(2024)); assertFalse(LeapYear.isLeapYear(1900)); assertFalse(LeapYear.isLeapYear(2001)); } }
テストを目的ごとに分離する方法もある。
import static org.junit.jupiter.api.Assertions.*; import org.junit.jupiter.api.Test; public class LeapYearTest { @Test public void test平年() { assertFalse(LeapYear.isLeapYear(2001)); } @Test public void test4年毎のうるう年() { assertTrue(LeapYear.isLeapYear(2024)); } @Test public void test100年毎の平年() { assertFalse(LeapYear.isLeapYear(1900)); } @Test public void test400年毎のうるう年() { assertTrue(LeapYear.isLeapYear(2000)); } }
FizzBuzz
FizzBuzz問題は、単体テストを作るときの例題として有名です。
まずは、数値を与えられたときに、文字列化するだけのメソッドを作っておきます。
public class FizzBuzz { public String say(int i) { return String.valueOf(i); } }
FizzBuzzを検証するためのテストクラスを作成します。
1と2は最初の実装でもテストにパスします。
import static org.junit.Assert.assertTrue; import org.junit.jupiter.api.Test; public class FizzBuzzTest { @Test public void test数字() { FizzBuzz fb = new FizzBuzz(); assertTrue(fb.say(1).equals("1")); assertTrue(fb.say(2).equals("2")); }
3に対してFizzを返すのは作ってないですが、先にテストを作ります。
@Test public void testFizz() { FizzBuzz fb = new FizzBuzz(); assertTrue(fb.say(3).equals("Fizz")); }
テストがエラーになるので、FizzBuzzクラスを修正します。
public class FizzBuzz { public String say(int i) { if (i % 3 == 0) return "Fizz"; return String.valueOf(i); } }
test数字() に4を追加しますが、そのままテストにパスします。
public void test数字() { FizzBuzz fb = new FizzBuzz(); assertTrue(fb.say(1).equals("1")); assertTrue(fb.say(2).equals("2")); assertTrue(fb.say(4).equals("4")); }
5に対してBuzzを返すことを前提としてテストを追加します。
@Test public void testBuzz() { FizzBuzz fb = new FizzBuzz(); assertTrue(fb.say(5).equals("Buzz")); }
テストがエラーになるので、FizzBuzzクラスを修正します。
public class FizzBuzz { public String say(int i) { if (i % 3 == 0) return "Fizz"; if (i % 5 == 0) return "Buzz"; return String.valueOf(i); } }
これで3の倍数と5の倍数には対応できたので、次は15の倍数に関するテストを作成します。
@Test public void testFizzBuzz() { FizzBuzz fb = new FizzBuzz(); assertTrue(fb.say(15).equals("FizzBuzz")); }
テストがエラーになるので、FizzBuzzクラスを修正します。
public class FizzBuzz { public String say(int i) { if (i % 15 == 0) return "FizzBuzz"; if (i % 3 == 0) return "Fizz"; if (i % 5 == 0) return "Buzz"; return String.valueOf(i); } }
ローマ数字変換
ローマ数字の文字列を数値に変換するプログラムを書いてみましょう。
public class RomanSymbol { public int toDecimal(String roman) { return 0; } }
テストを書いてみます。
import static org.junit.Assert.assertTrue; import org.junit.jupiter.api.Test; public class RomanSymbolTest { @Test public void test1to3() { RomanSymbol rs = new RomanSymbol(); assertTrue(rs.toDecimal("I") == 1); assertTrue(rs.toDecimal("II") == 2); assertTrue(rs.toDecimal("III") == 3); } }