TDD 実践ガイド
テストを書くことと、テストから書くことは別の行為です。前者は書き上げたコードが壊れていないことを確かめます。後者は、まだ無いコードに対して「何ができていれば正しいのか」を先に決めます。
決める順序が変わると、出てくるコードの形が変わります。このガイドはその変化を追います。
このガイドについて
TDDテスト駆動開発 (TDD)実装より先にテストを書き、そのテストを通す形で実装を進める書き方。テストを書く時点が実装より前にあることが要件で、カバレッジを上げる活動とは別。 を 2 つの軸で扱います。
- サイクルの規律: Red-Green-RefactorRed-Green-Refactorテストを書いて落ちることを確かめ (Red)、通し (Green)、重複を消す (Refactor) という 3 拍のサイクル。各拍でやってよいことが決まっており、拍をまたぐたびにテストを走らせる。 の 3 拍で、各拍に何をしてよくて何をしてはいけないか
- 設計への圧力: テストが書きにくいとき、それはコードの何を指しているのか
題材はバックエンドが PHP (Pest 4)、フロントエンドが React (Testing Library) です。どちらか一方だけを読んでも進められます。
ツールの設定方法やアサーションの一覧は扱いません。そこは既存のガイドが持っています。
本ガイドは Laravel 13 (2026 年 3 月リリース) と PHP 8.3 以上、Pest 4 を前提にします。送客先の Laravel × DDD × クリーンアーキテクチャ実践ガイド は Laravel 11 / PHP 8.2 前提で書かれており、段差があります。テストを書く順序という本ガイドの主題は版に依存しませんが、フレームワーク固有の記法は公式ドキュメントで最新版を確認してください。
既存のテスト記事との棲み分け
| 観点 | 参照先 | 本ガイドが持つもの |
|---|---|---|
| Vitest と Jest の設定、マッチャー、カバレッジ | TypeScript 開発ツールチェーン | ダブルテストダブル (Test Double)テストのために本物の代わりへ差し込むオブジェクトの総称。Dummy・スタブ・スパイ・モック・フェイクの 5 つに分けて呼ぶ。をいつ、どの種類で差すかの判断 |
renderHook と act の使い方 | カスタムフック | フックに切り出すかを、テストの書きにくさから決める手順 |
| テストピラミッドテストピラミッドどの層にどれだけテストを書くかの配分を、下を厚く上を薄くした三角形で表した図。単体テストを土台に置き、結合テストと E2E テストを絞る。と層別のテスト戦略 | テスト戦略 | 書く順序。既存は「どれだけ書くか」、本ガイドは「いつ書くか」 |
| Pest の記法、Laravel の Feature テスト | Pest でテストを書く | Red を先に出す順序と、境界の設計 |
各章の構成
全章が同じ並びです。
| 節 | 内容 |
|---|---|
| 導入 | その章が扱う問題を示します |
| この章で学ぶこと | 3 行から 5 行の箇条書き |
| 前提知識 | 依存する既存記事と前の章 |
| この章で扱わないこと | 観点と参照先の表。どこへ送るかを明示します |
| 本文 | 章ごとの内容 |
| まとめ | 箇条書き |
| 次に読む | 次の章と、関連する既存記事 |
第 2 部と第 3 部では、各部の 2 章目以降の冒頭に「この章の開始時点のコード」を置きます。前の章の成果を短く再掲するので、途中の章から読み始められます。
章立て
全 14 章を 4 つの部に分けています。
第 1 部 基礎
言語に依存しない内容です。コード例は PHP と TypeScript の両方を載せます。
| 章 | 扱うこと |
|---|---|
| 01 TDD とは何で、何ではないか | テストを先に書くと内容がどう変わるか。TDD と BDD と ATDD の区別 |
| 02 Red-Green-Refactor | 3 拍それぞれの規律。Red を必ず見る理由。3 つの実装戦略の使い分け |
| 03 テストが設計を圧す | 書きにくさの 5 つの型。テストを歪める対処と、設計を直す対処 |
| 04 テストダブル | Dummy・Stub・Spy・Mock・Fake の違いを、同じテストの書き換えで見ます |
| 05 流儀と進める方向 | 状態を見るか、やり取りを見るか。どこから書き始めるかとの関係 |
第 2 部 PHP バックエンド
| 章 | 扱うこと |
|---|---|
| 06 ドメインロジックから始める | 邪魔のない純粋なロジックで 1 サイクル通します。境界条件の追い込み方 |
| 07 境界を差し替える | 時刻・永続化・通知。04 章のダブルが具体的な形になります |
| 08 歩くスケルトン | 外側の受入テストを先に Red にし、最小の実装で 1 本貫きます |
第 3 部 React フロントエンド
| 章 | 扱うこと |
|---|---|
| 09 振る舞いをテストする | 実装の詳細に触るテストは、リファクタで落ちます |
| 10 非同期とネットワーク境界 | 08 章の API を叩く側。読み込み中と成功とエラーと空の 4 状態を先に決めます |
| 11 ロジックをフックへ押し出す | 抽出する判断と、抽出しない判断 |
第 4 部 接点と実践
| 章 | 扱うこと |
|---|---|
| 12 レガシーコードへの後付け | 継ぎ目の見つけ方と特性テスト。既存の振る舞いを先に固定します |
| 13 テストからドメインモデルへ | テスト先行が何を見えるようにし、何を見えるようにしないか |
| 14 TDD が効かない場面 | 適用のコストが何に比例するか。全面適用と不採用の間にある選択 |
対象読者
- テストは書いているが、いつ書くかを決めかねている人
- テストを先に書けと言われて試したものの、何が良いのか分からなかった人
- テストが書きにくいコードに当たったとき、テスト側で工夫してしまう人
前提知識
| 必須度 | 知識 | 補足 |
|---|---|---|
| 必須 | どちらかの言語で関数やクラスを書ける | PHP は 8.3 以上、React は TypeScript を前提にします |
| 必須 | テストを 1 本でも書いて動かしたことがある | フレームワークは問いません |
| 推奨 | 依存性注入を使ったことがある | 無くても読めますが、03 章と 07 章の実感が変わります |
テスト関数の名前は、送客先のガイドに合わせて言語ごとに変えています。PHP 側は test() (Pest でテストを書く が日本語の test() で統一しているため)、TypeScript 側は it() (TypeScript 開発ツールチェーン の Vitest の例がすべて it() のため) です。Pest も Vitest も両方を同義で受け付けるので、好みの方に読み替えて構いません。
このガイドで扱わないこと
| 観点 | 参照先 |
|---|---|
| テストフレームワークの設定と導入 | 上の棲み分け表の 4 本 |
| E2E テストとブラウザ自動化 | 本ガイドの範囲外です |
| CI でのテスト実行とデプロイ | AWS 実践ガイド |
| DDD の戦術パターンそのものの設計 | Laravel × DDD × クリーンアーキテクチャ実践ガイド |
13 章は DDD との接点を扱いますが、値オブジェクトや集約の設計そのものは上のガイドが正本です。
読み方
第 1 部は両方の読者が読みます。第 2 部と第 3 部は、自分が使う側だけで足ります。第 4 部は第 1 部に加えて、07 章のダブルの当て方を前提にします。React だけを読む場合も、07 章には目を通してください。
順に読むと、サイクルの規律から設計の判断へ降りていきます。いま困っていることから入ることもできます。テストが書きにくいなら 03 章、モックモック (Mock)期待する呼ばれ方を先に設定し、その通りに呼ばれたかを検証するテストダブル。検証を自分で行う点がスパイと違う。を使いすぎている気がするなら 04 章、テストが無いコードに手を入れるなら 12 章です。