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 をダウンロード よりダウンロードする 実際には、 sourceforge にある 最新は v 版 Fitnesse zip (バイナリ) Fitnesse_src zip (ソース) ここではバイナリをダウンロード
FITNESSE の設定 ダウンロードしたファイ ルを Zip 解凍する。 Java が入っている PC は、 解凍後の run.bat を実行す る Java は からダウンロード にアクセ ス
Fit Tasks
FIT: Test 30/360 Calendar 金融機関のいくつかは、1ヶ月を30日、1 年を360日として扱っている ( 30/360Calendar とする) 30/360Calendar として日付計算をするテスト を記述する カラムとしては、 form, to, days() days() は from から to までの経過日数を int とし て返す ColumnFixture のサブクラスとして実装する こと 次のページにあるテストをパスすること
FIT: Test 30/360 Calendar fitsample.ThirtyThreeSixty fromtodays() 2001/01/102001/01/ /01/102001/02/ /01/102002/01/ /01/102002/12/25705
FIT: 1. create new page 30/360 カレンダーのテストを 記述するため、 Wiki 上に新し いページを作成します。 FrontPage にお いて、 [Edit] をクリックし、 FrontPage を編集モードにしま す。 最後の行に 『 ThirtyThreeSixty 』と書き、 [Save] します。 FrontPage の 『 ThirtyThreeSixty 』の所の 『?』をクリックすると、新 しいページが作成されます。
FIT: 2. Edit Test 新たに作成した、 ThirtyThreeSixty ページの [Edit] を クリックし、テストを記述し、 Save します。 ここでは、テストの記述を行っています。 一行目に指定するのは、テスト対象の Fixture クラス です。 |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
FIT: 3. Config Test ThirtyThreeSixty ページの [Properties] をクリッ クし、 [Test] にチェックし、 [Save] します。
FIT: 4. Add ClassPath テスト実行に必要なクラスパスを編集します。 ThirtyThreeSixty ページの ClassPath をクリッ クし、 Classpath ページの [Edit] を実行します。 [Save] をし、 FrontPage より ThirtyThreeSixty ページに戻ります。 !path fit.jar !path fitnesse.jar !path sample
FIT: 5. Run Test 一度テストを走らせて みましょう。 テスト対象のクラス (ThirtyThreeSixty クラ ス)がないというメッ セージがでます。 → (ガイド) ThirtyThreeSixty クラス を作れ!!
FIT: 6. Create new class ThirtyThreeSixty クラスを作成します。 fitnesse/sample/fitsample フォルダに ThirtyThreeSixty.java として保存し、コンパイルします。 package fitsample; import fit.ColumnFixture; public class ThirtyThreeSixty extends ColumnFixture{ } > 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; とし、コンパイルが通る最小限の実 装とします。 Save しコンパイルします。 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; }
FIT: 11. Re Re Re Run Test 再度テストを実行しま す。 赤になっている部分が テストが失敗している 部分となる。 全て期待している値と異 なる(今は単に 0 を返す ため)ため赤の表示にな る。
FIT: 12. Fake IT テストの一つのみに注目し、そのテストが通 る最小のコードを実装してみる。『 return 10; 』とする。 Save しコンパイルする。 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; }
FIT: 13. RE^4 Run Test 再びテストを実行して みる。 緑になっている部分がテ ストが成功している部分
FIT: 14. Implementation 今までのように、細か い周期で実装 → テスト → 実装 → テストをして 全てのテストを通るよ うにしてみましょう。
考察 actualDays() を追加し、テストしてみましょ う。 オブジェクト指向の観点から考え、クラス分 割してみましょう。 FIT の ColumnFixture クラスの特徴について調 べてみましょう。