前回は,テスト駆動開発のサイクルとしてまず最初に受け入れテストを土台として作るという話をさせていただきました。
今回は,その受け入れテストを通すために,内部の設計をどうやって行っていくかという視点の話,つまりサイクルをどうやって深堀りしていくかという話をしたいと思います。
テストリストでToDoの抽出
受け入れテストを通すために,たとえば前回紹介した『WEB+DB PRESS Vol.35』のサンプルでしたら,URLを解釈する機能が必要だなとか,XMLに変換する機能が必要だなとか,それらをつないでいくコードが必要だなとか……そういった,システム内部を構成する一つ一つの要素に対して,プログラムを書いていくことになると思います。
これらの作業をどうやって抽出していくかというと,私は,タスクやテストリストというもので洗い出しています。
開発対象の機能を考えている際には,こういうことをやらなければならない,ああいうこともやらなければならない,という課題・ToDoが次々に浮かんできます。それらのToDoを,まず簡単に箇条書きにしていくんですね。箇条書きにするのは紙でもテキストファイルでも結構です。これをテストリストといいます。
テストファースト
そのテストリストの項目1つに対して,そういう機能を満たすプログラムを作るためのテストコードをまず書きます。テストコードを先に書くことを「テストファースト」といいます。テストファーストでは,たとえば,URLを解釈するコードが必要だとすると,それはどのような機能だろうかという視点をテストでまず書いておくのです。
そうすることによって,望む結果を返すためには,どんなプログラムを書かなければならないかといった,大きい視点としてのToBe(こうあるべき)が得られます。たとえば,DB検索結果をXMLで返さなければいけないな,結果はこういうふうに返ってほしいな,こういう入力の場合はこういう出力が出てきてほしいな,という自分の考えるToBeをテストコードという形で書いていきます。
次にその大きなToBeに対して,段々に粒を細かくする,やるべきことを割ることを考えます。大きなToBeを達成するためには,これができなければならない,あれもやらなければならないという感じに一つ一つ段階を細かくして掘っていきます。たとえば大きめのToBe項目が「DB検索結果をXMLで返さなければいけない」でしたら,割っていくと「DB検索を行えること」「結果をXMLに変換できること」がありますね。さらに割っていくと「DB接続の方法を調べる」「XML変換ライブラリを調査する」などの学習テスト項目(学習テストについては次回説明します)が出てきます。出てきた小さなToDoに対するテストリストを書き出し,そのリスト項目一つ一つに対してテスト駆動開発の3ステップを回していきます。つまり,ToDo項目一つに対してテストを書き,レッド-グリーン-リファクタリングを行い,終わったら次のToDo項目に進み……というような進め方をします(注1)。
私は以上のようなことを繰り返す形で,実際にテスト駆動開発を進めています。
テスト駆動開発の「フラクタル構造」「自己相似構造」
ここまで,テスト駆動開発の「サイクル」の話をしてきました。サイクルというのはつまり,円環構造,環をなしているということです。
私は以前「Seasar Conference 2006 Autumn」にて,テスト駆動開発の実践の姿は,フラクタル構造のような自己相似構造をしているという講演をしたことがあります。
テスト駆動開発はレッド,グリーン,リファクタリングの3ステップで構成されています。リファクタリング中はグリーンですから,色でいうとレッド,グリーンの2色で構成されていることになります。
受け入れテストがレッドで,その受け入れテストが通る(グリーンになる)までのサイクルを考えてみましょう。
受け入れテストが通った(グリーンになった)ときが,機能が完成したときです。受け入れテストがまだレッドの状態で,機能の各部分を一つ一つ組んでいきます。
大きい輪の中の小さい輪,つまり「受け入れテスト」の中の「機能の各部分のテスト」を,一つ一つテスト駆動開発で,レッド,グリーンの円環構造で回していくうちに,受け入れテストがレッドからグリーンに変わります。
受け入れテストがレッドからグリーンになるには,ひょっとしたら1週間かかるかもしれませんし,2週間かかるのかもしれません。その間ずっと受け入れテストのレッドバーを開発の基盤にして開発するのでは,レッド,グリーンのフィードバックサイクルは機能しません。
受け入れテストを通すために,その機能の各部分に対するテストを一つ一つ,レッド,グリーン,レッド,グリーンというサイクルで回しながら開発を行っていくというのが,テスト駆動開発のフィードバックサイクルです(注2)。
レッド,グリーンのサイクルも自己相似
