🫶

単体テスト設計に役立つ!7つの基本的なテスト技法まとめ

に公開

1年前にOS更改プロジェクトでテスターを担当した際に、「単体テストってどう作るの?」「どこまでやればいいの?」と悩んだ経験がありました。
この記事では、初心者でも理解しやすいように、単体テストでよく使われる7つのテスト技法をわかりやすく紹介します!

1.分岐網羅(Branch Coverage)

プログラム中の 「すべての分岐(ifやswitchなど)」を1回以上通ることを目指す方法です。
if文のtrue/false両方をテストするイメージ。

if (x > 0) {
    System.out.println("正の数です");
} else {
    System.out.println("0以下です");
}

x = 1(true)、x = 0(false)という2パターンでテストしましょう。

2.命令網羅(Statement Coverage)

プログラム中の 「すべての命令(文)」を1回以上実行することを目指します。
分岐の片方だけ通ればOKなので、分岐網羅よりは甘め。

if (x > 0) {
    System.out.println("Positive");
}
System.out.println("Done");

x = 1だけでも、すべての行が実行されるため命令網羅OK!

3.条件網羅(Condition Coverage)

複雑な条件式の中の それぞれの条件 がtrueとfalseの両方になるようにテストします。

if (a > 0 && b > 0)

→ 以下のようにパターンを変えてテスト

  • a = 1, b = 1(両方true)
  • a = 0, b = 1(aがfalse)
  • a = 1, b = 0(bがfalse)

4.パス網羅(Path Coverage)

プログラムのすべての実行経路(パス)を網羅します。
理想ではあるけど、分岐が増えると組み合わせ爆発するため、実務では現実的な範囲で採用します。

if (x > 0) {
    if (y > 0) {
        // パス1
    } else {
        // パス2
    }
} else {
    // パス3
}

→ パス1〜3すべてを通るテストが必要になります。

5.同値分割(Equivalence Partitioning)

入力をグループに分けて、それぞれから代表値を選んでテストする方法です。
例:年齢が「18歳以上ならOK」

  • 無効値グループ:〜17歳 → 例:17
  • 有効値グループ:18歳〜 → 例:18
    → 全部をテストせず、代表的な値で効率よくチェックします。

6.境界値分析(Boundary Value Analysis)

バグが起こりやすい 「境目(=境界)」の値を重点的にテストします。
同値分割とセットで使われることが多いです。

例:「1〜100の値を受け付ける」

  • 境界値テスト例:0(NG) / 1(OK) / 100(OK) / 101(NG)

7.モック・スタブを使ったテスト

外部APIやDBに依存する処理を テスト用の代替物(モック/スタブ) に置き換えて検証する方法です。

  • スタブ:決まった値を返すシンプルな置き換え
  • モック:呼び出し回数や値を細かく確認できる、より高機能な置き換え

SpringやJestなど、多くのテストフレームワークでモック/スタブ機能が使えます。

テスト技法の使い分け早見表

テスト技法 主な目的・効果 適用シーンの例 特徴
分岐網羅(Branch) 条件分岐すべてのルートを通る ロジックが複雑なif文やスイッチ文のある処理 バグの見逃しを減らす、定番の網羅法
命令網羅(Statement) コード中のすべての命令を1回以上実行する 単純な関数や前処理・後処理など 最も基本的、分岐が少ない時に使う
条件網羅(Condition) 複合条件式の各要素を true/false にする &&|| を含む条件式 論理バグの発見に強い
パス網羅(Path) すべての実行パターンをカバー 重要処理やクリティカルパスの完全チェック 理想的だが、パターン爆発しやすい
同値分割 入力をグループ分けし代表値でテスト ユーザー入力、バリデーション、フォームチェック テストケース数を抑えつつ効率的
境界値分析 境界線付近の値でバグを検出 数値、範囲指定のある入力(年齢、金額など) 実務でかなり有効、同値分割と相性◎
モック・スタブ 外部依存を切り離して動作確認 DBやAPIに依存するロジックのテスト 単体テストを“純粋”にするために必須

Discussion