テスト駆動開発(TDD) てすとくどうかいはつ
TDD自動テストリファクタリング品質ユニットテストアジャイル
テスト駆動開発(TDD)について教えて
簡単に言うとこんな感じ!
「まずテスト(合格基準)を書いてから、それを通るコードを書く」という順番が逆な開発手法だよ! テストを先に書くことで「何を作るべきか」が明確になり、バグが激減するんだ。料理で言えば「採点基準を決めてから料理を作る」みたいな感じ!
テスト駆動開発(TDD)とは
テスト駆動開発(Test-Driven Development:TDD)は、「先にテストを書き、次にそのテストを通過するコードを書き、最後にコードを整理する」というレッド・グリーン・リファクタリングの3ステップサイクルを繰り返す開発手法です。
従来の開発では「コードを書いてからテストを書く」という順番が一般的でしたが、TDDではこれを逆転させます。テストを先に書くことで、「どんな動作をするべきか」を最初に明確化でき、設計の質が高まります。また、全工程でテストが存在するため、コードを変更・追加した際に「既存の動作が壊れていないか」を即座に確認できます。
発注側の観点では、テスト自動化の仕組みが整備されているかは、システムの保守性と変更コストに直結します。テストがないシステムは、機能追加や改修のたびに「何か壊れていないか」の手動確認が必要になり、開発スピードが急速に低下します。
TDDの3ステップサイクル
| ステップ | 名称 | 内容 |
|---|---|---|
| ① Red | 失敗するテストを書く | まだ実装がないので必ずテスト失敗 |
| ② Green | テストを通過するコードを書く | 最低限動くコードを素早く書く |
| ③ Refactor | コードを整理する | 重複削除・命名改善・設計改善 |
TDDのメリット・デメリット
| 観点 | メリット | デメリット・注意点 |
|---|---|---|
| 品質 | バグが早期に発見される | テスト自体の設計スキルが必要 |
| 設計 | インターフェース設計が明確になる | 過剰な細分化に注意 |
| 速度 | 後からのデバッグ時間が削減 | 慣れるまでは時間がかかる |
| 保守性 | リファクタリングが安心してできる | テストの保守コストも発生 |
| ドキュメント | テストが仕様書代わりになる | テストが仕様を正確に反映しているか注意 |
歴史と背景
- 1999年 — ケント・ベック(Kent Beck)がSUnit(SmallTalk用テストフレームワーク)をJava向けに移植しJUnitを開発
- 2000年 — ケント・ベックがエクストリームプログラミング(XP)でTDDを体系化・命名
- 2002年 — ケント・ベック著「テスト駆動開発」(Test Driven Development: By Example)が出版。TDDのバイブルとなる
- 2003年 — マーチン・ファウラーが「リファクタリング」の概念とTDDの関係を整理し普及に貢献
- 2010年代 — TDDからBDD(振る舞い駆動開発)が派生。RSpec・CucumberなどBDDツールが登場
- 2020年代 — AIコーディング支援でもテスト生成が可能に。TDDの考え方はAI時代でも有効
TDDのサイクル図
関連する規格・RFC
※ TDD自体は標準仕様ではありませんが、以下の規格・フレームワークと深く関連しています。
| フレームワーク | 内容 |
|---|---|
| JUnit / pytest / RSpec | 各言語のユニットテストフレームワーク |
| BDD(振る舞い駆動開発) | TDDを発展させた手法。ビジネス視点のテスト記述 |
| ISO/IEC 25010 | ソフトウェア品質特性の国際規格 |