1. ホワイトボックス
ホワイトボックステスト とは、内部構造に着目し、コードの中身(分岐・ループ・条件)を見てテストする手法です。主に単体テストで使われます。
命令網羅、分岐網羅、条件網羅 等があります。その他にも基本パステスト、ループテスト等の考え方があります。
1.1. 命令網羅
命令網羅 とは、プログラム中のすべての命令(ステートメント)が少なくとも1回は実行されることを確認するテストです。
「処理が実行されたか」に着目します。
if (A && B) {
doSumthing();
}
doOther();
この場合、命令網羅では
- doSomething()
- doOther()
が実行されるテストケースを用意します。
| No | A | B | 実行 |
|---|---|---|---|
| 1 | true | true | doSomething(), doOther() |
1.2. 分岐網羅
分岐網羅 とは、各判定において、すべての分岐結果(true/false)を少なくとも1回通過することを確認するテストです。
「分岐の両方(true/false)を通ったか」に着目します。
if (A && B) {
doSumthing();
}
doOther();
分岐網羅ではifの結果(true / false)を両方通すテストケースを用意します。
| No | A | B | 判定 |
|---|---|---|---|
| 1 | true | true | true |
| 2 | false | true | false |
1.3. 条件網羅
条件網羅 とは、各基本条件が、それぞれ少なくとも1回はtrueとfalseの両方を取ることを確認するテストです。
「各条件がtrueとfalseを両方取ったか」に着目します。
if (A && B) {
doSumthing();
}
doOther();
各条件(AとB)それぞれがtrue/falseを取るテストケースを用意します。
| No | A | B |
|---|---|---|
| 1 | true | true |
| 2 | false | true |
| 3 | true | false |
条件網羅の定義では
- A=true, B=true
- A=false, B=false
で、それぞれtrue/falseの値を取り、定義上は条件網羅を満たしますが、これは推奨されません。
AとBと両方を同時に変えると、A単独の影響やB単独の影響がわからなくなるため、Aだけ変える、Bだけ変える、といったテストケースを用意することが推奨されます。
1.4. 基本パステスト
基本パステストとは、プログラム中の独立した実行経路(基本パス)をすべて少なくとも1回は通過することを確認するテスト手法です。
例として以下のフローがあったとします。
この場合、独立した経路(基本パス)を選ぶと、
| No | 経路 |
|---|---|
| 1 | 1 → 2 → 3 → 4 → 6 → 7 → 8 |
| 2 | 1 → 2 → 3 → 5 → 6 → 7 → 8 |
| 3 | 1 → 2 → 7 → 8 |
となります。
サイクロマティック複雑度
サイクロマティック複雑度とはプログラムの「独立した実行経路の数(=最低限必要なテストパス数)」を表す値で、以下の計算式で求めることができます。
独立した実行経路の数 = 分岐の数 + 1
1.5. ループテスト
ループテスト とは、for文やwhile文などの繰り返し処理において、0回・1回・複数回・境界回数などの実行回数で正しく動作することを確認するホワイトボックステスト手法です。
ループテストでは以下を確認します。
- 0回実行される場合(条件が最初からfalse)
- 1回だけ実行される場合
- 複数回実行される場合
- 最大回数(制限がある場合)
- 境界値(N回ループのN-1, N, N+1)
while (i < 10) {
i++;
}
この場合、テストケースは以下となります。
| ケース | i初期値 | 実行回数 |
|---|---|---|
| 0回 | 10 | 0回 |
| 1回 | 9 | 1回 |
| 複数回 | 8 | 2回 |
| 最大回数 | 0 | 10回 |
| 境界 | 9 / 10 / 11 | 境界確認(1回/0回/0回) |
for (int i = 0; i < N; i++) {
sum += i;
}
- N の値が最大10と決まっていると仮定
この場合、テストケースは以下となります。
| ケース | Nの値 | 実行回数 |
|---|---|---|
| 0回 | 0 | 0回 |
| 1回 | 1 | 1回 |
| 複数回 | 2 | 2回 |
| 最大回数 | 10 | 10回 |
| 境界 | 9 / 10 / 11 | 境界確認(9回/10回/仕様外) |
2. ブラックボックス
ブラックボックステスト とは、ブプログラムの内部構造を考慮せず、入力に対する出力や振る舞いが仕様通りかを確認するテスト手法です。主に単体テストの一部 や 結合テスト で使われます。
同値分割、境界値分析、デシジョンテーブル、状態遷移テスト があります。その他にも エラー推測 等があります。
2.1. 同値分割
同じ結果になる入力をグループ化して、それぞれのグループの代表値をテストする方法です。
前提の仕様(通販サイトの注文ルール)が次の通りとします。
- 合計金額(商品合計)により送料無料条件あり
- 送料は基本500円
- 5,000円以上で送料無料
この場合、合計金額(商品合計)を同値分割すると以下となります。
| 同値クラス | 代表値 | 結果 |
|---|---|---|
| 送料発生クラス | 1,000円 | 送料500円 |
| 送料無料クラス | 10,000円 | 送料無料 |
2.2. 境界値分析
仕様の境界(上限・下限)の前後をテストする方法です。
前提の仕様(通販サイトの注文ルール)を同じく次の通りとします。
- 合計金額(商品合計)により送料無料条件あり
- 送料は基本500円
- 5,000円以上で送料無料
この場合、合計金額(商品合計)の境界値は以下となります。
| 金額 | 結果 |
|---|---|
| 4,999円 | 送料500円 |
| 5,000円 | 送料無料 |
| 5,001円 | 送料無料 |
2.3. デシジョンテーブル
条件の組み合わせと結果を表で整理してテストする方法です。
前提の仕様(通販サイトの注文ルール)を同じく次の通りとします。
- 合計金額(商品合計)により送料無料条件あり
- 送料は基本500円
- 5,000円以上で送料無料
- クーポン利用可(クーポン利用で割引適用)
- 在庫切れの場合は注文不可
在庫、クーポン利用の有無、5,000円以上の条件に着目します。
| 在庫 | クーポン | 5,000円以上 | 結果 |
|---|---|---|---|
| ○ | ○ | ○ | 注文OK + 割引適用 + 送料無料 |
| ○ | × | ○ | 注文OK + 割引無し + 送料無料 |
| ○ | ○ | × | 注文OK + 割引適用 + 送料あり |
| ○ | × | × | 注文OK + 割引無し + 送料あり |
| × | ○ | ○ | 注文NG |
| × | × | × | 注文NG |
2.4. 状態遷移テスト
状態が変わるシステムの遷移をテストする方法です。
前提の仕様(スマホのロック)を次の通りとします。
- 状態
- ロック中
- 解除状態
- 一定時間ロック状態
- イベント
- 正しいパスコード入力
- 誤ったパスコード入力
- 3回連続誤入力(結果として発生するイベント)
- 待機時間経過
- ロックボタン操作
- 状態遷移ルール
- ロック中
- 正しいパスコード → 解除状態
- 誤ったパスコード → ロック中(失敗回数増加)
- 3回連続誤入力 → 一定時間ロック状態
- 一定時間ロック状態
- 待機時間経過 → ロック中
- 解除状態
- ロックボタン → ロック中
- ロック中
この場合、状態遷移テストとして以下の通り縦軸に状態、横軸にイベントとして整理します。
| 状態 \ イベント | 正しいパスコード | 誤ったパスコード | 3回連続誤入力 | 待機時間経過 | ロックボタン |
|---|---|---|---|---|---|
| ロック中 | 解除状態 | ロック中 | 一定時間ロック状態 | - | - |
| 一定時間ロック状態 | - | - | - | ロック中 | - |
| 解除状態 | - | - | - | - | ロック中 |
2.5. エラー推測
経験ベースで「壊れそうなところ」を予測してテストする方法です。
例えばログイン画面でをテストする場合、以下のようなケース(怪しい入力)を予測できます。
- パスワード空
- IDにスペース
- 超長い文字列
- SQLっぽい入力(' OR 1=1)
以上