先日,東北デベロッパーズコミュニティの6周年記念ワークショップ祭りに参加した。テスト駆動開発の要領,Gradleの導入方法,JUnitでのテストの書き方などを講師の方に指南していただいたので,忘れないようにまとめておく。
テスト駆動開発とは
テスト駆動開発(TDD: test driven development)とは,プログラム開発手法の一種で,プログラムに必要な各機能について,最初にテストを書き(これをテストファーストと呼ぶ),そのテストが動作する必要最低限な実装を行った後,コードを洗練させる,という短い工程を繰り返すスタイルである。
テスト駆動開発は,以下のようなサイクルで開発が進んでいく。
- 失敗するテストを書く
- できる限り早く、テストがパスするような最小限のコード本体を書く
- コードの重複を除去する(リファクタリング)
具体的な例としては,次のようになる。
- helloメソッドの戻り値として,”Hello”を期待するテストを作成する
- テストを実行し,失敗していることを確認する
- helloメソッドに
return "Hello";
を記述する - テストを実行し,成功していることを確認する
- helloメソッドに”1″という引数を与えた際の戻り値として,”こんにちは”を期待するテストを作成する
- テストを実行し,失敗していることを確認する
- helloメソッドを
if(argument == 1){ return "こんにちは"; } else{ return "Hello"; }
に書き換える - テストを実行し,成功していることを確認する
- helloメソッドに”2″という引数を与えた際の戻り値として,”Bonjour”を期待するテストを作成する
- テストを実行し,失敗していることを確認する
- helloメソッドを
if(arg == 1){ return "こんにちは"; } else if(arg == 2){ return "Bonjour"; } else { return "Hello"; }
に書き換える - テストを実行し,成功していることを確認する
- ……
テスト駆動開発は,このようにテストの失敗と成功を繰り返しながら進めていく。テストの実行環境ツールであるJUnitやxUnitでは,テストの失敗を赤いバー,成功を緑のバーで通知するため,上記のサイクルはRed/Green/Refactorと称される。
テスト駆動開発を行うための環境を構築する
今回は以下のツールを使ってテスト駆動開発を実践する。
- Eclipse (IDE)
- Gradle (ビルドシステム)
- JUnit (ユニットテストフレームワーク)
それぞれのツールについて簡単に説明すると,EclipseはJava言語のプログラム開発に特化したIDEである。GradleはMakeやAnt,Mavenのようなビルドシステムの一つ。JUnitは,テストを簡単に記述できるようにするためのテストフレームワークである。
以下より,各ツールのセットアップ方法を説明する。尚,Gradleのインストールは任意で構わない。Gradleをインストールしなくても本稿を読み進める上での支障はない。JUnitはEclipseのプロジェクトにあらかじめ含まれているので,個別にセットアップする必要はない。
Eclipseをセットアップする
Eclipseの公式サイトから,Eclipseをダウンロードし,インストールする。
Gradleをセットアップする
Gradleの公式サイトからGradleをダウンロードし,圧縮フォルダを解凍し,適当な場所に設置する。
解凍したフォルダのパスを環境変数GRADLE_HOME
に設定する。また、GRADLE_HOME/bin
にパスを通しておく。
ちなみに,yum,MacPorts,homebrewなどのパッケージ管理ツールからインストールする方法や,GVM(Groovy enVironment Manager)からインストールする方法もあるので,ターミナルが使えるのであれば,こちらの方法をお勧めする。
homebrewからGradleをインストールする場合は,以下のコマンドをターミナルに打ち込む。
brew install gradle
GVMからGradleをインストールする場合は,以下のコマンドをターミナルに打ち込む。
gvm install gradle
上記どちらかの方法でgradleをインストール後,Eclipseプロジェクトのルートに移動してGradleとEclipseを関連付ける
gradle eclipse
ユニットテストを書いてみる
ユニットテストを書き始めるにあたって,まずはプロジェクトを作成するところから順を追って説明する。
上部メニューの「ファイル」の「新規」から「Java プロジェクト」を選択する。
プロジェクト作成用のウィンドウが開くので,「プロジェクト名」を入力する。
「次へ」を選択し,「ライブラリー」のタブへ移動する。
「ライブラリーの追加」から「JUnit」を選択する。「次へ」を選択し,JUnitのバージョンが4になっていることが確認できたら,「完了」を選択する。プロジェクト作成のウィンドウの方も「完了」を選択する。
これでプロジェクトを作成することができた。
続いて,テストコードの対象となるプロダクトコードを作成する。プロジェクトを右クリックし,「新規」から「クラス」を選択する。パッケージ名を「main」,クラス名を「Sample」と名付けて「完了」を選択する。
作成したSample.javaに以下のコードを記述する。
package main;
public class Sample {
public String say() {
return "Hello, World!";
}
}
プロダクトコードが完成したので,今度はこのコードに対してテストコードを作成する。プロジェクトを右クリックし,「新規」から「JUnit テスト・ケース」を選択する。パッケージ名を「main」,クラス名を「SampleTest」と名付け,「完了」を選択する。
作成したSampleTest.javaに以下のコードを記述する。
package main;
import main.Sample;
import org.junit.Test;
import static org.junit.Assert.*;
import static org.hamcrest.CoreMatchers.*;
public class SampleTest {
@Test
public void test() {
final Sample sut = new Sample();
final String expected = "Hello, World!";
final String actual = sut.say();
assertThat(actual, is(expected));
}
}
SampleTest.javaを右クリックし,「実行」から「1 JUnit テスト(1)」を選択する。これでJUnitによるテストが実行され,JUnitのタブが表示され,緑色のバーが表示されていればテストは成功である。この時点でエラーが発生している場合は,コードが間違えていないかどうかの確認やJavaのコンパイラのバージョンを下げてみるなどして対応してほしい。
煩雑な文章になってしまったが,テスト駆動開発の流れとJUnitによるユニットテストの導入を説明した。JUnitによるユニットテストの書き方の詳細については,この記事だけではまとめきれないのでまた次回の記事で取り上げる。
参考
テスト駆動開発 – Wikipedia
東北デベロッパーズカンファレンス2014「6周年記念ワークショップ祭り!」JUnitハンズオン