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

感謝のプログラミング 10000時間

たどり着いた結果(さき)は、感謝でした。

Junitで始めてみる、テスト駆動開発入門

<スポンサーリンク>

テスト駆動開発について勉強したので、内容を自分の言葉でまとめ直してみます。
以下のような内容をお届けします。


テスト駆動開発とは

テスト駆動開発というのは、Test Driven Development(TDD)と呼ばれるもので、エクストリーム・プログラミングなどのアジャイルソフトウェア開発手法において、強く推奨されているものです。

ソフトウェア開発におけるテストとは、TDDの概念が発表される前は、できあがったコードが仕様通りに動くか確認するためのものでした。
Excelにテスト項目を列挙し、一つ一つ実行し、エビデンスと呼ばれる証跡を残していきます。

しかし、テスト駆動開発ではその順番が逆になります。
プロダクションコード(実際の機能を実装した本番環境に上げるためのコード)を実装するよりも先に、テスト用のコードを作成します。

これを「テストファースト」といいます。
テストコードを先に作成することによって、仕様を明確にします。同時に、機能の使用方法も明確にします。

使い方や機能を先に決めてしまって、それを満たすコードを作っていくイメージです。

テスト駆動開発を行うメリットは以下のようなものがあります。

  • 全機能を一気にテストできるため、仕様変更の際のデグレ確認が容易になる。
  • テストを自動化することで、デバッグ時間を大幅に削減できる
  • テストの品質を半永久的に保つことができる
  • 仕様を常に確認できるため、問題が発生しても早く問題箇所を特定できる
  • ちょっとコードを変更して、いちいち全部テストし直すのは面倒だけど、テストを自動化してテストを網羅していれば、一気に全ての機能テストを行うことができる


テスト駆動開発の流れ

「JUnit速攻レシピ」から引用します。
テスト駆動開発の流れは以下のとおりです。

  1. 仕様からテストを作成する
  2. 検証方法を明確にする
  3. テストを実行する
  4. 機能を実装する
  5. テストを実行する
  6. 洗練させる

やってみる

実際にやってみます。

まずは、(1)仕様からテストを作成します。
Eclipseのパッケージ・エクスプローラで、
新規 > ソース・フォルダ
で、「test」というフォルダを作りましょう。

そこに、example.CalcuratorTestというJUnitテストケースを作ります。

新規 > JUnit テストケース

で作成できます。

できたフォルダに以下のソースを書きます。

package example;

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

import org.junit.Test;

public class CalcuratorTest {

	@Test
	public void addTest() {

	}

	@Test
	public void 足し算の結果が正しいことをテストする() {
		Calcurator cal = new Calcurator();
		int expected = 10;			//期待値

		//足し算をして、結果を返す
		int actual = cal.add(4,6);	//実際の結果
	}
}

次に、(2)検証方法を明確にします。
JUnit4では、assertThatで検証します。

package example;

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

import org.junit.Test;

public class CalcuratorTest {

	@Test
	public void 足し算の結果が正しいことをテストする() {
		Calcurator cal = new Calcurator();
		int expected = 10;			//期待値

		//足し算をして、結果を返す
		int actual = cal.add(4,6);	//実際の結果

		//期待値と実際の結果が等しいことを検証する
		assertThat(actual, is ( expected ));
	}

}

(3)テストを実行する
JUnitを実行します。
CalcuratorTestを右クリックして、

実行 > JUnitテスト

をクリック。

当たり前ですが、テストは失敗し、赤いバーが出てきます。
だって、実際のメソッドを実装してないんだもん。

f:id:sho322:20141020221221j:plain

(4)実際に機能を実装する。
実際にプロダクトコードを書き、メソッドを定義してみます。
これはただの数値を返すだけです。

期待値と異なる値が返ってくるため、テストは失敗します。

package example;

public class Calcurator {
	public int add(int a, int b) {
		return 1;
	}
}

f:id:sho322:20141020221231j:plain

(5)テストを成功させる
次に、テストを成功させます。
テストが期待する戻り値は10だったので、10を返すようにしてみます。

package example;

public class Calcurator {
	public int add(int a, int b) {
		return 10;
	}
}

やっとグリーンバーが出ました!笑

f:id:sho322:20141020221332j:plain

で、最後に(6)洗練させるという手順になります。
テストの成功を維持しながら、機能を洗練させ、期待する値を返すようにします。

ちゃんと足し算の機能を実装します。

package example;

public class Calcurator {
	public int add(int a, int b) {
		return a + b;
	}
}

で、JUnitを実行すると、グリーンになります。
このように、テストケースを作成し、テストが成功するように実装する。
成功したら、その成功を維持しつつ、リファクタリングして機能を洗練させていくのが、レッド・グリーンリファクタリングといいます。

この記事は「JUnit速効レシピ」という最も新しいJUnit本を参考に書きました。
続きはぜひ、本を読んでみてください^^

すごくわかりやすい本です。

JUnit速効レシピ

JUnit速効レシピ