概要

JUnitを使用したテスト駆動開発

更新日:

JUnitというテスティングフレームワークを使うと、Javaプログラミングをリズムよく進めることができます。

うるう年判定

うるう年判定プログラムを作成してみよう。

新規ファイル「LeapYear.java」を作成する。

うるう年の条件は以下の通り。

  1. 西暦年号が4で割り切れる年は、うるう年です。
  2. ただし、西暦年号が100で割り切れる年は、通常は平年です。
  3. しかし、西暦年号が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);
  }
}

-概要
-, , ,

Copyright© UMLとJavaで学ぶオブジェクト指向プログラミング入門 , 2024 All Rights Reserved Powered by STINGER.