#rspec
#テスト駆動開発

テスト駆動開発(TDD)

More than 1 year has passed since last update.

TDD(テスト駆動開発)

image.png

最近、テスト駆動開発で有名なt_wadaさんのワークショップに参加しました。
テスト駆動開発?いまさら?と思うでしょうが、自分にとっては新しい知識だったので、まとめてみました。

TDD(テスト駆動開発)とはなにか

wikipediaより

プログラム開発手法の一種で、プログラムに必要な各機能について、最初にテストを書き(これをテストファーストと言う)、そのテストが動作する必要最低限な実装をとりあえず行った後、コードを洗練させる、という短い工程を繰り返すスタイルである。

TDD(テスト駆動開発)の何がいいか?

image.png

目指すべきコードが、

  • 動作する
  • 綺麗なコード

であった場合。そこに到達する方法は2通りある。

  1. しっかり設計してから、実装する。(赤い矢印) → 従来の手法
  2. 汚くてもいいから実装から入り、コードを洗練させていく。(青い矢印) 

それぞれ罠がある!!!

<1の場合の罠>

  • 「きれいで動かない」という状態から抜けられない。
    → つまり、「きれいな設計にしたい」という欲求から抜けられない。完璧を求めてしまう。
  • システム開発にはスケジュールがある。
  • コードを書き始めてから、いろいろ分かり始める。
    → 「ここまで設計する必要は無かった」とか「きれいな設計だけど遅すぎて使えない」とかが分かり始める。
  • ソフトウェア開発は登場人物が多すぎるので、予測が立ちにくい。
    → 手を動かしてみて初めてわかる。

<2の場合の罠>

  • 動くけど汚いシステムが出来上がる。
  • 綺麗にするのは、後回し。とりあえず動いたんだからいいじゃん。という怠慢が生まれる。
  • 新しい機能の追加が優先される。
  • 結果、とんでもなく保守性の低いコードが出来上がる。
  • 最初はまだいいが、膨れ上がると手をつけられなくなる。
TDDは、黄金の回転を細かく早く回すことで、心理的な苦痛であった、綺麗なコードに直すというところを突破する(黄色矢印)

黄金の回転

image.png

TDDのサイクル(黄金の回転)
・TDDでは、テストコードとプロダクトコードを交互に書きながら進めていく。
・TDDとは、サイクル。
・まず、「やることリスト」を作る。
・そこから1つだけ、やりたいことをピックアップする。
・そのテストコードを書く。
・テストコードを動かすと、プロダクトコードを実装してないので絶対に失敗する。(赤色になる)
・目的のコードを書く。テストを通すことを第一に考える。
・さっき書いたテストが成功する。(緑色になる)
・目標を満たす状態になったので、今度はコードの方をきれいに直すフェーズになる。それがリファクタリング。

TDDの基本テクニック

テストファースト

仮実装(テストのテスト)

いきなり本格的なコードから入ると、テストに失敗した時にテスト自体がおかしいのか?、それとも実装したコードがおかしいのか?、判別できなくなる場合があるので、必ず仮実装をして、テストを通過させる。

三角測量(Triangulation)

そのテストがたまたま通過したということが起こらないように、状況によって、2つ以上の値を使用しテストを書く。
先ほどの仮実装は、この三角測量でテストに落ちるはず(想定内のエラー)なので、明白な実装へと進む。

明白な実装(Obvious Implementation)

仮実装で、テストのテストが済んだら、
本格的な実装に入っていく。

実際どう書くか?