テスト設計技法
同値分割・境界値分析・デシジョンテーブルなどテストケースを網羅的かつ効率的に設計する技法
テスト設計技法とは、有限のテスト実行コストで最大の欠陥検出率を達成するために、テストケースを体系的に導き出す手法群だ。闇雲にテストを増やしてもカバレッジは上がるが、重要なバグを見落とすことがある。効果的なテストは「どのデータで・どの条件を・どの順で実行するか」を論理的に選択することで成立する。
同値分割(Equivalence Partitioning)は入力ドメインを同じ扱いを受けるクラスに分割し、各クラスから代表値を1つ選ぶ。例えば年齢入力(0〜120が有効)を「負の数・有効範囲・120超」の3クラスに分け、各クラスから1ケースずつ選ぶ。境界値分析(Boundary Value Analysis)はクラスの境界値(-1・0・1や119・120・121等)を選ぶ。バグは境界付近に集中する傾向があるためだ。この2技法は補完的に使われる。
デシジョンテーブルは複数の条件の組み合わせとその結果を表として整理し、カバーすべき組み合わせを漏れなく特定する。状態遷移テストは状態機械モデルを使い、状態間の遷移と不正なイベントへの応答を検証する。ペアワイステスト(All-Pairs Testing)は複数のパラメータを総当たりせず、任意の2パラメータの全組み合わせをカバーする最小ケース集合を生成し、指数的なテスト量を現実的なサイズに削減する。リスクベーストテストは、障害発生確率×影響度でテストの優先順位を付けるアプローチだ。
コードレビューで着目するポイント
- 境界値(境界の1つ内側・境界値・1つ外側)がテストケースに含まれているか
- 複数の入力条件が組み合わさる場合にデシジョンテーブルで網羅性を確認しているか
- 有効な入力のみでなく無効な入力・空値・nullのテストケースが含まれているか
- 状態遷移を持つコンポーネントで不正な順序のイベントをテストしているか
- パラメータが多い場合にペアワイス手法で組み合わせを削減しているか
- テストケースの優先順位付けがリスク(影響度・発生頻度)に基づいているか
- テストの名前が「どの条件でどの結果になるか」を明示しているか
典型的なアンチパターン
ハッピーパスのみのテスト: 正常系のみを検証し、エラー・境界・無効入力をテストしない。本番環境では想定外の入力が必ず発生し、テストされていない経路でバグが露呈する。
組み合わせ爆発の総当たり: 5パラメータ×3値=243ケースを全て書こうとする。ペアワイス技法を使えば50ケース以下で同等の欠陥検出率が得られることが多く、総当たりは現実的でない。
テストケース名の曖昧さ: test('should work', ...) や test('case1', ...) のような名前で条件が伝わらない。テストが失敗したとき、何の条件でどの動作が壊れたかを名前だけで判断できないためデバッグコストが上がる。
参考リソース
- Rex Black『Managing the Testing Process』(Wiley、2009)— テスト計画・設計の実践書
- Glenford Myers『The Art of Software Testing』第3版(Wiley、2011)
- JSTQB『ソフトウェアテスト教科書 JSTQB Foundation』— 同値分割・境界値分析の標準解説
- Pairwise Testing Tool https://pairwise.teremokgames.com — ペアワイステストケースの自動生成
- allpairs https://github.com/mgalgs/allpairs — OSSのペアワイス生成ツール
- 1. 📄アーキテクチャスタイル
- 2. 📄ドメインモデリング
- 3. 📄モジュール分割と依存管理
- 4. 📄データモデリング
- 5. 📄API設計
- 6. 📄整合性とトランザクション
- 7. 📄非同期処理(Queue/Event)
- 8. 📄キャッシング
- 9. 📄ユーザーリサーチ
- 10. 📄情報アーキテクチャ
- 11. 📄インタラクションデザイン
- 12. 📄UX原則とヒューリスティクス
- 13. 📄アクセシビリティ(UX観点)
- 14. 📄UXメトリクス
- 15. 📄スケーラビリティ
- 16. 📄可用性とレジリエンス
- 17. 📄オブザーバビリティ
- 18. 📄環境・インフラ設計
- 19. 📄データマイグレーション
- 20. 📄セキュリティ設計原則
- 21. 📄データ保護とマルチテナント
- 22. 📄LLMセキュリティ
- 23. 📄ビジュアルデザイン原則
- 24. 📄デザインシステム
- 25. 📄コンポーネント設計
- 26. 📄スタイリング
- 27. 📄状態管理
- 28. 📄フロントエンドパフォーマンス
- 29. 📄アクセシビリティ(実装観点)
- 30. 📄アニメーションとインタラクション
- 31. 📄設計原則
- 32. 📄デザインパターン(GoF)
- 33. 📄エンタープライズパターン
- 34. 📄クリーンコード
- 35. 📄リファクタリング
- 36. 📄型設計とコントラクト
- 37. 📄関数型プログラミング概念
- 38. 📄エラーハンドリング
- 39. 📄テスト戦略と哲学
- 40. 📄テスト種別(機能テスト)
- 41. 📄テスト種別(UI・ビジュアル)
- 42. 📄テスト種別(契約・境界)
- 43. 📄テスト種別(非機能テスト)
- 44. 📄テストダブル
- 45. 📄テスト設計技法
- 46. 📄並行処理・マルチスレッド
- 47. 📄パフォーマンス最適化
- 48. 📄ドキュメント管理
- 49. 📄バージョン管理と開発プロセス
- 50. 📄脅威モデリング
- 51. 📄通信保護(TLS)
- 52. 📄暗号化・機密情報管理
- 53. 📄認証・セッション管理
- 54. 📄認可・アクセス制御
- 55. 📄入力バリデーション
- 56. 📄インジェクション攻撃
- 57. 📄出力エンコーディング
- 58. 📄エラーハンドリング(セキュリティ観点)
- 59. 📄SSRF(サーバーサイドリクエストフォージェリ)
- 60. 📄依存関係管理
- 61. 📄設計・実装 参考書籍
- 62. 📄セキュリティ参考資料
- 63. 📄正規化(データベース正規化)