結合テスト を中心に厚くし、 静的解析(型 / lint)を基盤に置く テスト配分モデル。Kent C. Dodds が 2018 年のブログ記事 The Testing Trophy で提唱した、 テストピラミッド の現代版。
概要
/\
/E2\ ← 少なめ
/----\
/ 結合 \ ← 多め(中心)
/--------\
/ 単体 \ ← 中くらい
/----------\
/ 静的解析 \ ← 基盤(型 / lint)
--------------
4 層構造 で、ピラミッドの 3 層に 静的解析(型 / lint)の基盤 を加え、 結合テストを中心に厚く したのが特徴。トロフィー(カップ型)の形に見える。
各層の意図
| 層 | 役割 |
|---|---|
| E2E | 少なめ(クリティカルパスのみ) |
| 結合 | ★ 中心。実本番に近い検証 |
| 単体 | 中くらい(複雑なロジックのみ) |
| 静的解析 | 基盤(型システム・lint で機械的に検出) |
なぜトロフィー型か
結合テストが「最もコスパが良い」
実本番との近さ: E2E > 結合 > 単体
実行速度: 単体 > 結合 > E2E
コスパ最大点 = 結合
ピラミッドが想定した「単体は速くて安い」は今でも正しいが、 モック過剰の弊害 が無視できなくなった。結合テストは速度を犠牲にしても 本物に近い検証 ができる。
型システムが単体の一部を代替
TypeScript・Rust・Kotlin など型が厚い言語では、 「型チェックが通れば多くのバグは捕まる」 。型で表現できる範囲はテストを書かなくても良いという発想。
単体テストの過剰書きを抑制
単体テストの粒度を細かくしすぎると、 リファクタで全テストが壊れる 。Trophy では単体を「複雑なロジックの要所のみ」に絞り、リファクタ耐性を高める。
トロフィーが向く場面
| 状況 | 向き具合 |
|---|---|
| フロントエンド(React 等) | ◎ |
| TypeScript / Rust / Kotlin | ◎ |
| API 連携が多い | ◎ |
| 型なし言語 | △(静的解析基盤が薄い) |
| 純粋計算ロジック中心 | △(単体の方が向く) |
ピラミッドとの違いまとめ
| 観点 | ピラミッド | トロフィー |
|---|---|---|
| 提唱年 | 2009 | 2018 |
| 中心 | 単体テスト | 結合テスト |
| 静的解析 | 言及なし | 基盤として明示 |
| 単体の量 | 多め | 中くらい |
| 結合の量 | 中くらい | 多め(中心) |
| 主な対象 | バックエンド | フロントエンド・型あり言語 |
AI 駆動開発との関係
AI 駆動開発では型システムがあると AI 生成コードのバグを型で機械的に検出 できる。トロフィーの「静的解析基盤」は AI 時代に特に効きます。
| AI 駆動開発での効用 | トロフィーが提供 |
|---|---|
| 型エラーで AI ミスを即検出 | 静的解析基盤 |
| モック地獄を回避 | 結合中心 |
| 本番乖離を最小化 | 実環境に近い結合テスト |
関連記事
- 開発手法ガイド:テスト技法編 — トロフィー vs ピラミッドの比較
- 開発手法ガイド:アトミックデザイン編 — Storybook と組み合わせたトロフィー実践
関連用語
- テストピラミッド — 古典版の対抗モデル
- 単体テスト — トロフィーでは中量
- 結合テスト — トロフィーの中心
- E2E テスト — トロフィーの頂点(少なめ)
- テストダブル — トロフィーでは Mock より Fake 推奨