ストーリー
松本先輩がインシデント報告書を見せてくれた。
テストがない世界
バグ修正コストの増大
バグの発見が遅れるほど、修正コストは指数関数的に増大します。
graph LR
subgraph "バグ修正コストの増大(相対コスト)"
A["開発中<br/>1x"] --- B["テスト中<br/>10x"] --- C["本番リリース後<br/>100x"]
end
classDef low fill:#d4edda,stroke:#28a745,color:#000
classDef mid fill:#fff3cd,stroke:#ffc107,color:#000
classDef high fill:#f8d7da,stroke:#dc3545,color:#000
class A low
class B mid
class C high
| 発見フェーズ | 相対コスト | 具体例 |
|---|---|---|
| 開発中(テスト実行) | 1x | 開発者がすぐに修正 |
| コードレビュー | 2x | レビュアーが指摘し修正 |
| QAテスト | 10x | バグチケット作成、再現、修正、再テスト |
| 本番リリース後 | 100x | 障害対応、影響調査、修正、デプロイ、顧客対応 |
テストがないプロジェクトの末路
graph TD
A["最初:<br/>テスト書く時間がない。手動で確認すればいい"] --> B["3ヶ月後:<br/>機能追加のたびに既存機能が壊れる"]
B --> C["6ヶ月後:<br/>怖くてコードを変更できない"]
C --> D["1年後:<br/>リファクタリングもできず技術的負債が蓄積"]
D --> E["2年後:<br/>ゼロから作り直した方が早い"]
classDef warning fill:#f8d7da,stroke:#dc3545,color:#000
class E warning
テストのメリット
1. バグの早期発見
// テストがあれば、このバグは即座に見つかる
function calculateDiscount(price: number, rate: number): number {
return price * rate; // バグ: (1 - rate) であるべき
}
// テスト
test('10%割引で100円が90円になる', () => {
expect(calculateDiscount(100, 0.1)).toBe(90); // 失敗! 10が返る
});
2. リファクタリングの安全網
テストがある場合のリファクタリング:
1. 全テストが通ることを確認 ✅
2. コードを変更
3. 全テストを再実行
4. 全テストが通れば、振る舞いが保たれている ✅
5. 安心してマージ
3. 仕様書としてのテスト
// テストを読めば仕様が分かる
describe('パスワードバリデーション', () => {
it('8文字以上であること', () => { /* ... */ });
it('大文字を1つ以上含むこと', () => { /* ... */ });
it('数字を1つ以上含むこと', () => { /* ... */ });
it('特殊文字を1つ以上含むこと', () => { /* ... */ });
it('過去3回分のパスワードと異なること', () => { /* ... */ });
});
// → テスト名を見るだけで、パスワードの仕様が理解できる
4. 開発速度の向上
一見矛盾するように聞こえますが、テストは開発速度を向上させます。
テストなし:
コード変更 → 手動確認(5分) → 別の画面も確認(10分) → 見落とし → バグ → 修正(30分)
= 45分
テストあり:
コード変更 → テスト実行(10秒) → 失敗を発見 → 即修正(5分)
= 5分
テストに関するよくある誤解
| 誤解 | 現実 |
|---|---|
| テストを書く時間がない | テストを書かない方が長期的に時間がかかる |
| テストは開発速度を落とす | テストがあると変更に自信が持てて速くなる |
| 手動テストで十分 | 手動テストは繰り返しのたびにコストがかかる |
| 100%カバレッジが必要 | 重要なビジネスロジックのテストが重要 |
| テストは品質保証の仕事 | テストは開発者の責務 |
まとめ
| 項目 | ポイント |
|---|---|
| テストの本質 | バグの早期発見と変更への自信を提供する安全網 |
| コスト効果 | 早期発見ほど修正コストが低い(1x vs 100x) |
| メリット | バグ検出、リファクタリング安全網、仕様書、開発速度向上 |
| 誤解 | 「時間がない」は最大の誤解。テストは投資であり浪費ではない |
チェックリスト
- バグ修正コストの増大を数字で説明できる
- テストの4つのメリットを説明できる
- テストに関するよくある誤解を論破できる
- テストが仕様書として機能することを理解した
次のステップへ
テストの重要性を理解したら、次はテストの種類と戦略を学びます。ユニットテスト、インテグレーションテスト、E2Eテストの違いとテストピラミッドを理解しましょう。
推定読了時間: 20分