TDD(テスト駆動開発)
最近、テスト駆動開発で有名なt_wadaさんのワークショップに参加しました。
テスト駆動開発?いまさら?と思うでしょうが、自分にとっては新しい知識だったので、まとめてみました。
TDD(テスト駆動開発)とはなにか
プログラム開発手法の一種で、プログラムに必要な各機能について、最初にテストを書き(これをテストファーストと言う)、そのテストが動作する必要最低限な実装をとりあえず行った後、コードを洗練させる、という短い工程を繰り返すスタイルである。
TDD(テスト駆動開発)の何がいいか?
目指すべきコードが、
- 動作する
- 綺麗なコード
であった場合。そこに到達する方法は2通りある。
- しっかり設計してから、実装する。(赤い矢印) → 従来の手法
- 汚くてもいいから実装から入り、コードを洗練させていく。(青い矢印)
それぞれ罠がある!!!
<1の場合の罠>
- 「きれいで動かない」という状態から抜けられない。
→ つまり、「きれいな設計にしたい」という欲求から抜けられない。完璧を求めてしまう。 - システム開発にはスケジュールがある。
- コードを書き始めてから、いろいろ分かり始める。
→ 「ここまで設計する必要は無かった」とか「きれいな設計だけど遅すぎて使えない」とかが分かり始める。 - ソフトウェア開発は登場人物が多すぎるので、予測が立ちにくい。
→ 手を動かしてみて初めてわかる。
<2の場合の罠>
- 動くけど汚いシステムが出来上がる。
- 綺麗にするのは、後回し。とりあえず動いたんだからいいじゃん。という怠慢が生まれる。
- 新しい機能の追加が優先される。
- 結果、とんでもなく保守性の低いコードが出来上がる。
- 最初はまだいいが、膨れ上がると手をつけられなくなる。
TDDは、黄金の回転を細かく早く回すことで、心理的な苦痛であった、綺麗なコードに直すというところを突破する(黄色矢印)
黄金の回転
TDDのサイクル(黄金の回転)
・TDDでは、テストコードとプロダクトコードを交互に書きながら進めていく。
・TDDとは、サイクル。
・まず、「やることリスト」を作る。
・そこから1つだけ、やりたいことをピックアップする。
・そのテストコードを書く。
・テストコードを動かすと、プロダクトコードを実装してないので絶対に失敗する。(赤色になる)
・目的のコードを書く。テストを通すことを第一に考える。
・さっき書いたテストが成功する。(緑色になる)
・目標を満たす状態になったので、今度はコードの方をきれいに直すフェーズになる。それがリファクタリング。
TDDの基本テクニック
テストファースト
仮実装(テストのテスト)
いきなり本格的なコードから入ると、テストに失敗した時にテスト自体がおかしいのか?、それとも実装したコードがおかしいのか?、判別できなくなる場合があるので、必ず仮実装をして、テストを通過させる。
三角測量(Triangulation)
そのテストがたまたま通過したということが起こらないように、状況によって、2つ以上の値を使用しテストを書く。
先ほどの仮実装は、この三角測量でテストに落ちるはず(想定内のエラー)なので、明白な実装へと進む。
明白な実装(Obvious Implementation)
仮実装で、テストのテストが済んだら、
本格的な実装に入っていく。