Test-Driven Development a Hands

Test-Driven
Development using FIT
北野 弘治
オブジェクト倶楽部
この資料について

この資料は、Agile Development Conference
2003において、 Ward Cunningham氏が行った
チュートリアル資料を参考に北野弘治が翻訳追
記を行って作成しております。
Test-Driven Development


このチュートリアルは、FIT(Framework for
Integrated Test)を利用したテスト駆動開発のテ
クニックについて紹介する
FITとは、ユニットテストや受け入れテストを行う
ためのフレームワークであり、プログラミング言
語に依存しない形式でテストの記述が行える
Guide Development

FITは、テストの結果が正しくなるようにプログラミングを
ガイドします

いわば、標識を確認しながら道をすすんでいくようなイメージ
Refactoring

TDDをすることにより、Test-Driven-Designが得
られ、それはRefactoringされた奇麗なデザイン
となる

テストしやすいデザイン
FIT

FITは、言語に依存していないtest-tableと言語
に依存したtest-fixtureとで構成されている


Test-tableは、ユーザや顧客でも容易に記述すること
が可能
Test-fixtureは、製品とtest-tableとのインターフェイス
である
FITをより美味く召し上がるために

FITNESSEを利用する


FITNESSEとは、FIT+Wikiで、Wiki上でテストの記
述、テスト実行、テスト結果参照が行える
ダウンロード後、解凍のみでWikiサーバが立ち上が
るためインストールが容易
Install FIT(NESSE)
FITNESSEをダウンロード

http://fitnesse.org/よりダウンロードする


最新はv20030728版



実際には、sourceforgeにある
Fitnesse20030728.zip(バイナリ)
Fitnesse_src20030728.zip(ソース)
ここではバイナリをダウンロード
FITNESSEの設定


ダウンロードしたファイルを
Zip解凍する。
Javaが入っているPCは、解
凍後のrun.batを実行する


Javaはhttp://java.sun.com/
からダウンロード
http://localhost/にアクセス
Fit Tasks
FIT: Test 30/360 Calendar






金融機関のいくつかは、1ヶ月を30日、1年を3
60日として扱っている(30/360Calendarとする)
30/360Calendarとして日付計算をするテストを
記述する
カラムとしては、form, to, days()
days()はfromからtoまでの経過日数をintとして
返す
ColumnFixtureのサブクラスとして実装すること
次のページにあるテストをパスすること
FIT: Test 30/360 Calendar
fitsample.ThirtyThreeSixty
from
to
days()
2001/01/10
2001/01/20
10
2001/01/10
2001/02/10
30
2001/01/10
2002/01/10
360
2001/01/10
2002/12/25
705
FIT: 1. create new page




30/360カレンダーのテストを記述
するため、Wiki上に新しいページ
を作成します。
http://localhost/ FrontPageにお
いて、[Edit]をクリックし、
FrontPageを編集モードにします。
最後の行に『ThirtyThreeSixty』
と書き、[Save]します。
FrontPageの
『ThirtyThreeSixty』の所の『?』
をクリックすると、新しいページが
作成されます。
FIT: 2. Edit Test

新たに作成した、ThirtyThreeSixtyページの[Edit]をク
リックし、テストを記述し、Saveします。
|ThirtyThreeSixty|
|from|to|days()|
|2001/01/10|2001/01/20|10|
|2001/01/10|2001/02/10|30|
|2001/01/10|2002/12/25|705|
---ClassPath


ここでは、テストの記述を行っています。
一行目に指定するのは、テスト対象のFixtureクラスです。
FIT: 3. Config Test

ThirtyThreeSixtyページの[Properties]をクリック
し、[Test]にチェックし、[Save]します。
FIT: 4. Add ClassPath


テスト実行に必要なクラスパスを編集します。
ThirtyThreeSixtyページのClassPathをクリック
し、Classpathページの[Edit]を実行します。
!path fit.jar
!path fitnesse.jar
!path sample

[Save]をし、FrontPageよりThirtyThreeSixty
ページに戻ります。
FIT: 5. Run Test

一度テストを走らせてみ
ましょう。

テスト対象のクラス
(ThirtyThreeSixtyクラス)
がないというメッセージが
でます。
→(ガイド)
ThirtyThreeSixtyクラスを
作れ!!
FIT: 6. Create new class

ThirtyThreeSixtyクラスを作成します。
package fitsample;
import fit.ColumnFixture;
public class ThirtyThreeSixty extends ColumnFixture{
}

fitnesse/sample/fitsampleフォルダにThirtyThreeSixty.java
として保存し、コンパイルします。
> javac -classpath fit.jar -d sample sample\fitsample\*.java
FIT: 7. Re Run Test
FIT: 8. Create from-to Field

from, toフィールドが無い!というエラーメッセー
ジが出たので、ThirtyThreeSixtyクラスに追加し
ます。
package fitsample;
import fit.ColumnFixture;
import java.util.Date;
public class ThirtyThreeSixty extends ColumnFixture{
public Date from;
public Date to;
}

保存し、コンパイルします。
FIT: 9 Re-Re Run Test


再びテストを実行します。
days()メソッドが無い!と
エラーメッセージが出て
います。
FIT: 10. Create days() Method

days()メソッドを実装します。今の段階では、
return 0; とし、コンパイルが通る最小限の実装
とします。
package fitsample;
import fit.ColumnFixture;
import java.util.Date;
public class ThirtyThreeSixty extends ColumnFixture{
public Date from;
public Date to;
public int days() {
return 0;
}
}

Saveしコンパイルします。
FIT: 11. Re Re Re Run Test


再度テストを実行します。
赤になっている部分がテ
ストが失敗している部分
となる。

全て期待している値と異な
る(今は単に0を返すため)
ため赤の表示になる。
FIT: 12. Fake IT

テストの一つのみに注目し、そのテストが通る最
小のコードを実装してみる。『return 10;』とする。
package fitsample;
import fit.ColumnFixture;
import java.util.Date;
public class ThirtyThreeSixty extends ColumnFixture{
public Date from;
public Date to;
public int days() {
return 10;
}
}

Saveしコンパイルする。
FIT: 13. RE^4 Run Test

再びテストを実行してみ
る。

緑になっている部分がテス
トが成功している部分
FIT: 14. Implementation

今までのように、細かい
周期で実装→テスト→実
装→テストをして全ての
テストを通るようにしてみ
ましょう。
考察



actualDays()を追加し、テストしてみましょう。
オブジェクト指向の観点から考え、クラス分割し
てみましょう。
FITのColumnFixtureクラスの特徴について調
べてみましょう。