🫶
単体テスト設計に役立つ!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