なぜテストが重要なのか
ストーリー
「レビューの次はテストだ。この2つは品質保証の両輪なんだ」
松本先輩がインシデント報告書を見せてくれた。
「先月の障害、覚えているか?本番で注文金額が マイナスになるバグがあった。テストが1つでもあれば 防げたんだ。テストを書かないのは、 シートベルトをしないで運転するようなものだ」
「テストの重要性を数字で理解しよう」
テストがない世界
バグ修正コストの増大
バグの発見が遅れるほど、修正コストは指数関数的に増大します。
バグ修正コストの増大(相対コスト)
開発中 テスト中 本番リリース後
1x 10x 100x
┃ ┃ ┃
┃ ┃ ┃
┃ ┃ ┌────┤
┃ ┃ │ │ 100x
┃ ┃ │ │
┃ ┌────┤ │ │
┃ │ │ 10x │ │
┃ │ │ │ │
┌──────┤ │ │ │
│ 1x │ │ │ │
└──────┴────┴─────────┴────┘
| 発見フェーズ | 相対コスト | 具体例 |
|---|---|---|
| 開発中(テスト実行) | 1x | 開発者がすぐに修正 |
| コードレビュー | 2x | レビュアーが指摘し修正 |
| QAテスト | 10x | バグチケット作成、再現、修正、再テスト |
| 本番リリース後 | 100x | 障害対応、影響調査、修正、デプロイ、顧客対応 |
テストがないプロジェクトの末路
最初: 「テスト書く時間がない。手動で確認すればいい」
↓
3ヶ月後: 「機能追加のたびに既存機能が壊れる」
↓
6ヶ月後: 「怖くてコードを変更できない」
↓
1年後: 「リファクタリングもできず技術的負債が蓄積」
↓
2年後: 「ゼロから作り直した方が早い」
テストのメリット
1. バグの早期発見
typescript
// テストがあれば、このバグは即座に見つかる
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. リファクタリングの安全網