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);
}
}