
テストは終わったはずなのに、結合テストで想定外のバグが連発しています。テストケースは全部パスしていたはずなのですが、どうしてでしょうか。



テストケースを『消化』することに必死で、肝心の『何をテストすべきか』という設計が、少しだけ漏れていたのかもしれませんね。



設計ですか? 画面の項目を一つずつ確認するだけでは足りないんでしょうか。



それだけでは不十分なことが多いんですよ。今回は、漏れを防いで品質を確かなものにするための、テストケース設計のコツを一緒にお話ししますね。
「テスト結果はすべてOK。なのに、いざ結合テストやユーザーレビューを始めると、驚くほど簡単にバグが見つかってしまう……。」
エンジニアやPMであれば、そんな苦い経験が一度はあるのではないでしょうか。筆者自身も、直近の案件でテスト工程の立て直しに関わる中で、改めてこの問題の根深さを痛感しています。予定していたテストをすべて消化しても、それが「意味のあるテスト」でなければ、品質を保証したことにはなりません。
特に、オフショア開発や複数チームが関わるプロジェクトでは、「言われたことだけを確認するテスト」になりがちです。本記事では、筆者が現場で失敗と改善を繰り返しながら実践している、現場を少しでも楽にするための「テストケース設計の極意」を共有します。
背景と課題
今の開発現場では、リリースサイクルの短縮が求められる一方で、品質に対する要求はますます高まっています。しかし、限られた工数の中で「すべての操作パターンを網羅する」のは物理的に不可能です。
そこで重要になるのが、「何を確認すれば、このシステムは安心だと言えるのか」という設計の視点です。ただ画面の項目を上から順に確認するだけのテストでは、データの整合性や複雑な条件分岐に潜むリスクを見逃してしまいます。関係者全員が「ここまで確認したから大丈夫だ」と納得できる、網羅性と効率のバランスが取れたテスト計画が、プロジェクトを無事に着地させるための生命線となります。
原因・失敗パターン:なぜ「テスト済み」が信じられないのか
せっかくテストを行っても、品質が上がらないのには構造的な理由があります。筆者が現場で見てきた6つの失敗パターンを振り返ってみます。
1. 正常ルートへの「生存バイアス」
- 事象:マニュアル通りに操作すれば動くことは確認されているが、不正な値の入力や、通信遮断などの異常系が考慮されていない。
- 背景・条件:開発進捗が厳しく、ハッピーパス(成功ルート)を早く通すことにチームの意識が偏っている状況。
- 影響範囲:本番環境でユーザーが少しでも予期せぬ操作をすると、システムがクラッシュしたり、中途半端なデータが保存されたりします。
2. テストケースの「再現性」を欠いた粒度のバラツキ
- 事象:「ログインを確認する」という1行だけの曖昧なケースと、ボタンの色を確認するだけの過度に細かいケースが混在している。
- 背景・条件:テスト設計の基準がなく、作成者個人のスキルや経験値に依存してしまっている状態。
- 影響範囲:誰がテストしても同じ結果になる「再現性」が失われ、テスト担当者の主観によって確認漏れが常態化します。
3. プログラムの論理境界(等号・不等号)への無関心
- 事象:入力制限が10文字のときに、境目である9文字、10文字、11文字といった「境界値」を狙ったテストが行われていない。
- 背景・条件:テストケースを仕様書のコピペで作成しており、コード上の「10文字以下」と「10文字未満」の差を意識していない。
- 影響範囲:境界値での計算ミスやバリデーションエラーが発生し、特定の条件下でシステムが正しく機能しません。


4. 画面(UI)とデータベース(DB)の乖離
- 事象:画面上の表示は「完了」と出ているが、DBの中身を確認すると、本来更新されるべきフラグや時刻が旧データのままになっている。
- 背景・条件:テストが「画面から見た動き」に限定されており、裏側のデータ構造を検証対象に含めていない。
- 影響範囲:その後の別機能での処理や、翌日の月次バッチのタイミングでデータ不整合による大規模な事故を引き起こします。
5. 「デグレード(先祖返り)」に対する過信
- 事象:機能Aの修正を行った際、その修正が影響を及ぼすはずの機能Bや機能Cの再テスト(回帰テスト)が行われない。
- 背景・条件:影響範囲の特定が開発者任せになっており、共通モジュールの変更が及ぼす破壊的影響を軽視している。
- 影響範囲:一つ直すと別が壊れる「もぐら叩き」の状態に陥り、いつまで経ってもリリース判定が出せない状況になります。
6. 条件の組み合わせによる「特殊ケース」の死角
- 事象:「会員ランクA + 初回購入 + クーポン利用」といった、複数の条件が重なった時だけ動く複雑なロジックがテストされない。
- 背景・条件:各機能を個別にテストするだけで満足し、ビジネスロジックが複雑に絡み合うシナリオを整理できていない。
- 影響範囲:特定パターンのユーザーのみがエラーになる、あるいは計算が間違っているといった、原因特定が極めて難しい不具合が本番で発生します。
解決策・実践ノウハウ(明日からできる!テスト設計6つのヒント)
現場の品質を底上げするために、筆者が大切にしている「描き方のコツ」をまとめました。
🛠漏れを防ぐ!テスト設計の実践アクション
- 「期待値」にデータベースの確認を加える
- テストシートの「期待される結果」欄に、「画面に完了と表示されること」だけでなく、「DBの注文テーブルのステータスが10(決済済)に更新されること」と具体的に書き込みます。
- 「三層構造」でテストの抜けを塞ぐ
- 第1層:単体確認(バリデーション等)、第2層:業務フロー(一連の流れ)、第3層:意地悪テスト(途中で戻る等)の3層で整理することで、視野が狭くなるのを劇的に防げます。
- 「境界値」を狙い撃ちにする
- 例えば100点満点なら、0, 1, 99, 100, 101の5パターンを確認。仕様が変わる「境目」の数字を狙うだけで、プログラムのわずかな不等号ミスを見つけ出せます。
- 開発者に「どこが不安か」を聞いてみる(リバースレビュー)
- テストケースができたら、開発担当者に「このテストで、あなたが書いたコードの懸念点は払拭されますか?」と尋ねます。開発者自身の不安な箇所こそが、最も手厚くテストすべきポイントです。
- 「影響の地図」を頭に描く
- 修正箇所そのものだけでなく、そのデータを使って「次に何が行われるか(夜間バッチ、帳票出力等)」までテストの対象を広げることで、二次被害を防げます。
- 「組み合わせテスト」を賢く絞り込む(ペアワイズ法・直交表)
- ペアワイズ法(オールペア法)等の手法を使い、専用のフリーツール(PICT等)で組み合わせを絞り込みます。全組み合わせを試す時間はなくても、主要なペアを網羅することでバグの大部分を効率的に検出できます。
テストケース設計のセルフチェックリスト
| チェック項目 | OKの基準 |
|---|---|
| DB確認 | 画面上の表示だけでなく、裏側のデータ更新も確認手順にあるか? |
| 境界値 | 入力制限や分岐の「境目」の数値がテスト項目に入っているか? |
| 異常系 | 「失敗した時」や「途中でやめた時」のケースが用意されているか? |
| 粒度 | 誰がテストしても同じ手順、同じ結果になる具体性があるか? |
| 組み合わせ | 複数の条件が重なる箇所で、ペアワイズ法などを使って効率よく網羅できているか? |
まとめ
「テストしたはず」という言葉が現場に飛び交う時、そこには必ず「何を、どこまで、どうやって」という認識のズレが潜んでいます。
筆者が現場で大切にしているのは、テストを単なる確認作業ではなく、開発チームと「品質を一緒に作り上げるプロセス」だと捉えることです。設計の段階でどれだけ具体的に詰められるかが、最終的なリリースの安心感を決めます。
まずは今のテストケースに、一つだけ「DBの中身」や「境目の数字」を足してみることから始めてみませんか。その小さな一歩が、現場を救う大きな力になると信じています。





