テストは、プログラム内に残存するエラーを検知するために、プログラムを実行することです。 限られた時間内に、被テストプログラムが目標とする品質指標を達成しているかを判定します。
ねらいは 2 つあります。
すべてを試すことはできません。 32 ビット整数を 2 つ受け取る関数でさえ、入力の組み合わせは約 1800 京通りあります。 だからテストとは、「どれを試せば効率よく誤りが見つかるか」を選ぶ技術です。 やみくもに数を打つことではありません。
| 段階 | やること |
|---|---|
| 計画 | 品質目標値の設定とテスト手順の計画 |
| 準備 | テスト環境の準備とテストケース設計 |
| 実行 | テスト実行と結果確認・記録 |
| 評価 | 結果が品質目標値を満たすかを判定。満たせば終了、満たさなければ繰り返す |
| 名前 | 役割 |
|---|---|
| ドライバ | テスト実行を制御し、テスト入力と結果出力を行うプログラム。 被テストモジュールを呼び出す側の代わり |
| スタブ | 被テストモジュールから呼び出すモジュールがまだ無い場合の、 ダミーの呼び出され側 |
覚え方。被テストモジュールの上にいるのがドライバ(運転する人)、
下にいるのがスタブ(切り株)。
トップダウンにテストを進めるとスタブが多く要り、
ボトムアップに進めるとドライバが多く要ります。
プログラムの仕様に基づき、可能な入力の組み合わせとその入力に対する出力を選択する方法です。 中身は見ません。
プログラムの入力条件だけから、テスト入力空間を分割する方法です。 同値クラスとは、入力条件についてプログラムが同じ扱いをするはずの値の範囲を指します。
| 有効同値クラス | プログラムにとって有効な入力 |
| 無効同値クラス | プログラムにとって無効な入力 |
[手順1]入力条件ごとに、有効同値クラスと無効同値クラスを設定する。
[手順2]テストケースを設定する。
①できるだけ多くの有効同値クラスを用いる ②無効同値クラスは1 つだけをカバーする。
なぜ無効クラスは 1 つずつなのか。 無効な値を 2 つ同時に入れると、片方でエラーになった時点で処理が止まり、 もう片方が検査されたかどうか分からなくなるからです。
誤りは境界に集まります。
< と <= の書き間違い、0 と 1 の取り違え、配列の端の扱い ──
バグの多くは境目で起きます。だから境界そのものと、その両隣を狙って試します。
プログラムの内部構造に基づいてテストケースを選ぶ方法です。 どの経路を通ったかを数え、網羅率で品質を測ります。
| 基準 | 満たす条件 |
|---|---|
| 命令網羅 | すべての命令を 1 回以上実行する |
| 分岐網羅(判定網羅) | すべての分岐の真・偽を 1 回以上通る |
| 条件網羅 | 各条件式の真・偽をそれぞれ 1 回以上とる |
| 複数条件網羅 | 条件の真偽の組み合わせをすべて通る |
if (a > 0) { x = x + 1; } ← 命令1
if (b > 0) { x = x * 2; } ← 命令2
return x; ← 命令3
分岐網羅は命令網羅より厳しい。
上の例で a>0 かつ b>0 の 1 件だけを試すと、
命令はすべて実行されるので命令網羅は 100% です。
しかし a>0 が偽の場合を一度も通っていないので分岐網羅は 50% にとどまります。
「全部の行を通った」からといって安心はできません。