読者です 読者をやめる 読者になる 読者になる

kyosho5’s blog

貧乏で数学があまり得意ではない理系出身のエンジニアのブログ

【備忘】JUnitをFizzBuzzを使って練習

テスト駆動開発入門(サンプルはjavaで書かれている)という本を読んでいるが、さすがに目で読むだけだと理解がおっつかない部分が多いので実際に手を動かしたほうがいいと判断。



しかし、そもそもJUnitを使ったこともほとんどないので、本を理解するためのさらに前段階として、簡単な例題でJUnitを使ってみる



あくまで備忘としての側面が強いけど・・・




例題として、タイトルにも書いたようにFizzBuzzを用いる。


FizzBuzz概要:
1から順番に数字を出力し、3で割り切れるときはFizz、5で割り切れるときはBuzz、15(3で割り切れて、かつ5で割り切れる)で割り切れるときはFizzBuzzと出力する。

ex)
1,2,Fizz,4,Buzz,Fizz,7,8,....13,14,FizzBuzz,16,....97,98,Fizz,Buzz

TDDという概念を学ぶ以上、テストコードから先に書くというのを意識しなければならないので、以下の観点でテストコードを書く。

・3の倍数を出力するときは文字列"Fizz"に変換する
・5の倍数を出力するときは文字列"Buzz"に変換する
・15の倍数を出力するときは文字列"FizzBuzz"に変換する
・上記以外の場合は数字をそのまま文字列に変換する(int -> String)
・インクリメント処理を行ったときは数字を1増やす
・デクリメント処理を行ったときは数字を1減らす
・現在の数字を任意の数字に変更したときはその処理を反映する
・現在の数字を取得した場合はその処理を反映する

テストコードは以下

import static org.hamcrest.CoreMatchers.*;
import static org.junit.Assert.*;

import org.junit.Test;

public class FizzBuzzTest {

	private FizzBuzz fb;

	//3の倍数でも5の倍数でもない場合
	@Test
	public void normalCase() {
		fb = new FizzBuzz(1);
		assertThat(fb.says(), is("1"));
	}

	//3の倍数の場合
	@Test
	public void threeCase() {
		fb = new FizzBuzz(3);
		assertThat(fb.says(), is("FIzz"));
	}

	//5の倍数の場合
	@Test
	public void fiveCase() {
		fb = new FizzBuzz(5);
		assertThat(fb.says(), is("Buzz"));
	}

	//3の倍数かつ5の倍数(=15の倍数)の場合
	@Test
	public void fifteenCase() {
		fb = new FizzBuzz(15);
		assertThat(fb.says(), is("FIzzBuzz"));
	}

	//数字をインクリメントした場合
	@Test
	public void incrementTest() {
		fb = new FizzBuzz(1);
		fb.increment();
		assertThat(fb.says(), is("2"));
	}

	//数字をデクリメントした場合
	@Test
	public void decrementTest() {
		fb = new FizzBuzz(2);
		fb.decrement();
		assertThat(fb.says(), is("1"));
	}

	//現在の数字を変更した場合
	@Test
	public void setTest() {
		fb = new FizzBuzz(1);
		fb.setCurrentNumber(2);
		assertThat(fb.says(), is("2"));
	}

	//現在の数字を取得した場合
	@Test
	public void getTest() {
		fb = new FizzBuzz(1);
		assertThat(fb.getCurrentNumber(), is("1"));
	}
}

↑に基づいてjavaクラスを記述すると

public class FizzBuzz {

	private int currentNumber;

	public FizzBuzz(int startNumber) {
		currentNumber = startNumber;
	}

	public String says() {

		if(currentNumber % 15 == 0) {
			return "FizzBuzz";
		}

		if(currentNumber % 3 == 0) {
			return "Fizz";
		} else if(currentNumber % 5 == 0) {
			return "Buzz";
		} else {
			return Integer.toString(currentNumber);
		}
	}

	public void increment() {
		currentNumber++;
	}

	public void decrement() {
		currentNumber--;
	}

	public void setCurrentNumber(int num) {
		currentNumber = num;
	}

	public int getCurrentNumber() {
		return currentNumber;
	}

}

本当に単純にFizzBuzzを書くのならgetter、setterはいらないかな・・・?




もう少し練習したら本に載ってるコードで試してみる。




本のコードはassertEqualを使ってるけど、assertThatのほうが柔軟性高いからそっちを積極的に使っていきたい