LESSON 20分

ストーリー

佐藤先輩
レビューの次はテストだ。この2つは品質保証の両輪なんだ

松本先輩がインシデント報告書を見せてくれた。

佐藤先輩
先月の障害、覚えているか?本番で注文金額がマイナスになるバグがあった。テストが1つでもあれば防げたんだ。テストを書かないのは、シートベルトをしないで運転するようなものだ
佐藤先輩
テストの重要性を数字で理解しよう

テストがない世界

バグ修正コストの増大

バグの発見が遅れるほど、修正コストは指数関数的に増大します。

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分