twadaさんが「テスト駆動開発とは何であって、何でなかったのか?」をテーマにfukabori.fmで配信されていたので、インプットした内容を残しておく。
テスト駆動開発(TDD)とは?
テストを先に書くことはテストファーストであって、テスト駆動開発ではない。
テスト駆動開発は、「テスト1つ書く→実装→フィードバック→リファクタリング」のサイクルを回していくワークフローである。
設計変更は常に起こりうるものであり、設計変更に対して安全に柔軟に対応できるようにするための手段としてテスト駆動開発がある。
自動テストはインターフェースに対するフィードバックを得ることができ、実装は構造に対するフィードバックを得られるが、テストを先にたくさん書くデメリットは、実装からのフィードバックが得られる機会が遅くなる。
なので、テスト書くタイミングと実装タイミングが近いことが望ましい。
テスト駆動開発の恩恵
テストを先に書くことは使いやすさに目を向けられる
実装は作りやすさに目が行きがちであるが、チーム開発をする上では作りやすさより使いやすさのほうが大事である。テスト先に書くことで先に利用者の目線に立った状態で実装に移れるので、実装コードの認知負荷が下がる。
実装で過度に集中しても立ち戻れる場所を作れる
実装だけに集中していると、自分が今何をやっているかわからなくなってくることもある。これを防ぐために、最初にテストリストを洗い出し、実装で過度に集中しても立ち戻れる場所を作っておく。テストリストは30分〜1時間ぐらいで作成して、最初から綺麗に洗い出す必要はない。実装していたらこのケースもテストリストに追加したほうがいいということもあるので、その時にテストケースを追加すればよい。