「テスト駆動開発入門」を JUnit 4.4 と Eclipse 3.3 でやってみる (1)

テスト駆動開発入門」という本があります。ケント・ベックという XP プログラミングなどで有名な人が書いた本で、その題名のとおり、テストを先に書く開発のやり方について解説した本です。

中身を見てみるとわかりますが、本当に文字通りテストを先に書きます。ですから、最初は通らないわけです。

カンタンな要件を満たすテストを作成する → そのテストを通るような実装を作成する → さらに進んだ(でもカンタンな)要件を満たすテストを作成する → そのテスト通る実装を作る、といったように、まさしく「テスト」によって「駆動」される開発手法というわけですね。

本にはかなり簡略化された形でしか書かれていないため、実際やってみたのが以下の紹介です。

テストのためのツールである JUnit のバージョンが 3.x から 4.x に変わっているので、テストの書き方もそれにあわせて書き換えています。
開発環境は、表題にもありますが、「Eclipse IDE for Java EE Developers (3.3/Europa) のセットアップ」で導入した eclipse 3.3 を使用しました。

つまり、現在の最新の状況にあわせた、入門的なガイドといったかんじですね。
なかなか興味深い考え方なので、ぜひ一度トライしてみて下さい!!


Java プロジェクトの作成

本に載っているサンプルは Java なので、まず Java 開発用のプロジェクトを作成します。

JUnit 4.4 の設定

JUnit のセットアップをします。

現在の JUnit の最新バージョンは 4.4 なので、その JAR ファイルを Java ビルドパスに含まれるように定義します。

より具体的に言うと、↑の画面で「Add External JARs」ボタンを押すと↓のようなダイアログボックスが出てきますので、以下にあるように JUnit 4.4 のJAR ファイルを選択してください。
↑のような設定になります。

テストの作成

まずテストを作ります。本に書いてある通りに MoneyTest という名前にしました。JUnit 3.x のようにスーパークラスを指定するとか xxxTest といったように名前に Test とつけるとかいった制約は JUnit 4.x には特にありません。
JUnit 3.x と 4.x の違いについては「JUnit 4.4の基礎の基礎 (書き方/実行方法の概略)」を参照してみてください。

これが最初のテストクラスです。テストの書き方についても「JUnit 4.4の基礎の基礎 (書き方/実行方法の概略)」を参照してみてください。

package money;

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

import org.junit.*;

public class MoneyTest {
        
        @Test
        public void testMultiplication() {
                Dollar five= new Dollar(5);
                five.times(2);
                assertThat(five.amount, is(10));
        }
        
}

テストクラスの実行

メニューバーから「Run」、もしくはツールバーのを押します。

以下のようなダイアログボックスが出てくると思いますので、"Junit Test" を選択します。

ここまでの手順を本当にそのまま実行していると、保管もしないで実行していますので↓のようにどこに保管するか聞いてきます。

クラスのアイコンを選んで「Run AS」と選択しても OK です。↓の画面で「Run」ボタンを押すことで実行されます。

いずれにせよエラーになるのはわかっていますが、↓のようなエラーメッセージが出てきます。そのまま実行していいかどうか聞かれています。「Proceed」を押して続行してください。

結果的に↓のようなエラーになります。

最初の実装

めでたく予定どおりエラーになるテストクラスを作成できたところで、このエラーを解消するためのクラスを作成します。

Dollar クラスを実装し、amount フィールドを作成し、times メソッドを作成します。中身は空でかまいません。

あらためてテスト

テストを実行してみましょう。

メニューバーにある「Run」の実行でも OK です。

テストは (予想どおり) 失敗します。
times メソッドが実装されていませんし、だいたい amount フィールドの内容もセットされていません。
ただしそこまでは何のエラーも出ていないので実装に大きな問題はないことが確認できているということです。times メソッドと amount フィールドへのデータのセットを実装すればいいわけですね。

あらためて実装

amount フィールドに受け取った値をセットし、times メソッドの実装を行います。

テスト OK

再度テストを実行してみましょう。

今度は OK です。これ以降は、このテストに加えて新しいテストを追加し、そのテストをとおるように実装していく、という段取りでプログラムを開発していきます。今までとおったクラスはすべてとおるわけですから、プログラマは確実にクラスの実装が進歩している実感を持ってプログラミングを行うことができます。Regression バグの起きる確率も減少します。

こういう開発手法をとるのでテストはいらない、ということにはなりません。ユーザービリティや機能要件の網羅は観点が違うのでまたきちっとしたテストを行う必要があります。それはテストエンジニアの領域ですね。
プログラマが安心して開発を行うことができること、どんなテストをやったかが後からわかること (そしてそのテストは後から改善でき、再利用できること)、こうしたことによってコードの品質は上がります。
また、実際にやってみるとわかりますが、この方法はそれほど負荷のかかるやり方ではありません。この方法を採用したことで工数が増えてしまう、というプログラマは元からちゃんと仕事をしていなかった可能性がけっこうあります。だって神ならぬプログラマはどっちみち本当にちゃんと動いているかどうかのテストは行う必要がありますから。自分が作ったものの出来/不出来もわからない、というのはどうでしょうか?! 普通はテストデータや必要なテストプログラムは自分で書くものです。これはそれをきちんと仕事・成果物として評価しよう、ということですから、プログラマにとっても悪いことではないわけです。

参考 (JUnit の設定)

もし、うまく動かないときは以下を念のためにチェックしてみてください。

テストクラスのアイコンを選択し、右クリックメニューで「Properties」を選択します。
左ペインの「Run/Debug Settings」を選択すると ↓のような画面が表示されますので、右ペインのテストクラスを選択して「Edit」ボタンを押します。

↓のような画面になります。

最初に「Test」タブです。
今回は JUnit 4.x のテストを使用していますので、「Test Runner」は "JUnit 4" であることを確認してください。

「クラスパス」タブで Junit 4.x の JAR ファイルがクラスパスに含まれていることを確認してください。

[Top Pageに戻る]

Ads by TOK2