280 likes | 457 Views
Test-Driven Development using FIT. 北野 弘治 オブジェクト倶楽部. この資料について. この資料は、 Agile Development Conference 2003 において、 Ward Cunningham 氏が行ったチュートリアル資料を参考に北野弘治が翻訳追記を行って作成しております。. Test-Driven Development. このチュートリアルは、 FIT(Framework for Integrated Test) を利用したテスト駆動開発のテクニックについて紹介する
E N D
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サーバが立ち上がるためインストールが容易
FITNESSEをダウンロード • http://fitnesse.org/よりダウンロードする • 実際には、sourceforgeにある • 最新はv20030728版 • Fitnesse20030728.zip(バイナリ) • Fitnesse_src20030728.zip(ソース) • ここではバイナリをダウンロード
FITNESSEの設定 • ダウンロードしたファイルをZip解凍する。 • Javaが入っているPCは、解凍後のrun.batを実行する • Javaはhttp://java.sun.com/からダウンロード • http://localhost/にアクセス
FIT: Test 30/360 Calendar • 金融機関のいくつかは、1ヶ月を30日、1年を360日として扱っている(30/360Calendarとする) • 30/360Calendarとして日付計算をするテストを記述する • カラムとしては、form, to, days() • days()はfromからtoまでの経過日数をintとして返す • ColumnFixtureのサブクラスとして実装すること • 次のページにあるテストをパスすること
FIT: 1. create new page • 30/360カレンダーのテストを記述するため、Wiki上に新しいページを作成します。 • http://localhost/ 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: 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クラスの特徴について調べてみましょう。