システム管理論 I / 第 8 回

テスト

少ない回数で、多くの誤りを見つける

この回のねらい

テストとは

テストは、プログラム内に残存するエラーを検知するために、プログラムを実行することです。 限られた時間内に、被テストプログラムが目標とする品質指標を達成しているかを判定します。

ねらいは 2 つあります。

  1. テストを、限られた時間内で最大の効率を上げるものにする
  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% にとどまります。 「全部の行を通った」からといって安心はできません。

← 第7回 第9回 オブジェクト指向設計(1) →