NUnitでBDD - スペックリスト (^_^)
BDDとは、コードを書く前にビヘイビアを明示することだ。つまりそれは、「コードが正しく機能しているかを先に確かめる」のではなくて、「コードがどの様に正しいのかを先に定義する」ということだ。
では、いつビヘイビアを明示すればよいのか。それはコードを書く直前がベストのタイミングだ。なぜならゴールに到着するのに十分な情報を手にしているのはコードを書く直前であるはずだからだ。
このあたりについては、A NEW LOOK AT TEST-DRIVEN DEVELOPMENTを参考されたい。
そこで、テストを書く直前にビヘイビアをマインドマップで明示する方法をお勧めする。このマインドマップをスペックリストと命名した。スペックリストでは、まず中心に[ストーリー]を置き、そこから伸びるBOIとして[コンテキスト]を分岐させていく。さらに各BOIに[スペック(仕様)]を記述して枝を伸ばしていく。マインドマップを使用することで、短い文章で簡潔に仕様を記述できる。[ストーリー]で[コンテキスト]の場合には[スペック(であるべき)]の形式で記述するとよいだろう。
以下にStackのストーリーのスペックリストをツリー構造化したものを記述する。右の画像が小さいので、この構造をマインドマップに脳内変換して頂きたい。
- Stackのストーリー
- 要素を含んでいない(BOI)
- IsEmptyがtrueであるべき
- オブジェクトをPopする
- 例外が発生すべき
- Topを呼び出す
- 例外が発生すべき
- オブジェクトを1つプッシュする(BOI)
- IsEmptyがfalseであるべき
- オブジェクトをポップする
- IsEmptyがtrueになるべき
- プッシュしたオブジェクトと同じであるべき
- Topを呼び出す
- IsEmptyがfalseであるべき
- プッシュしたオブジェクトと同じであるべき
- Topを繰り返し呼び出す
- プッシュしたオブジェクトと同じであるべき
- 複数のオブジェクトをプッシュする(BOI)
- それぞれをポップする
- 正しい順番でオブジェクトが削除されるべき
- Topを呼び出して返されたオブジェクト
- 最後にプッシュしたオブジェクトと同じであるべき
- それぞれをポップする
- nullをプッシュする(BOI)
- IsEmptyがfalseであるべき
- オブジェクトをポップする
- nullが返されるべき
- Topを呼び出す
- nullが返されるべき
- 要素を含んでいない(BOI)
このスペックリストと以前の日記のNUnit.GUIの実行結果を比較してもらうと分かるように、マインドマップの内容はほぼそのまま名前空間、テストクラス、テストメソッドにマッピングされている。つまりスペックリストからテストコードへのマッピングはとても簡単だというわけだ。マインドマップで記述したスペックリストからテストコードのスケルトンを自動生成ってのも夢ではないだろう。これはマインドマップ駆動開発のひとつの可能性を示唆しているのではないだろうか。