メインコンテンツまでスキップ

TDD 実践ガイド

テストを書くことと、テストから書くことは別の行為です。前者は書き上げたコードが壊れていないことを確かめます。後者は、まだ無いコードに対して「何ができていれば正しいのか」を先に決めます。

決める順序が変わると、出てくるコードの形が変わります。このガイドはその変化を追います。

このガイドについて

TDD を 2 つの軸で扱います。

  • サイクルの規律: Red-Green-Refactor の 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 開発ツールチェーンダブルをいつ、どの種類で差すかの判断
renderHookact の使い方カスタムフックフックに切り出すかを、テストの書きにくさから決める手順
テストピラミッドと層別のテスト戦略テスト戦略書く順序。既存は「どれだけ書くか」、本ガイドは「いつ書くか」
Pest の記法、Laravel の Feature テストPest でテストを書くRed を先に出す順序と、境界の設計

各章の構成

全章が同じ並びです。

内容
導入その章が扱う問題を示します
この章で学ぶこと3 行から 5 行の箇条書き
前提知識依存する既存記事と前の章
この章で扱わないこと観点と参照先の表。どこへ送るかを明示します
本文章ごとの内容
まとめ箇条書き
次に読む次の章と、関連する既存記事

第 2 部と第 3 部では、各部の 2 章目以降の冒頭に「この章の開始時点のコード」を置きます。前の章の成果を短く再掲するので、途中の章から読み始められます。

章立て

全 14 章を 4 つの部に分けています。

第 1 部 基礎

言語に依存しない内容です。コード例は PHP と TypeScript の両方を載せます。

扱うこと
01 TDD とは何で、何ではないかテストを先に書くと内容がどう変わるか。TDD と BDD と ATDD の区別
02 Red-Green-Refactor3 拍それぞれの規律。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 章、モックを使いすぎている気がするなら 04 章、テストが無いコードに手を入れるなら 12 章です。