この記事ではテスト手法についてIT初心者にも分かりやすく解説します。
テスト手法
- ホワイトボックステストはプログラムの内部構造に着目してテストする方法、ブラックボックステストはプログラムの内部構造を意識せずに仕様通りかどうかテストする方法。
- 限界値分析と同値分析はブラックボックステストで使われるテスト手法。
- ファジングはブラックボックステストで使われるテスト手法で、
様々な異常系データを大量に入力して挙動を確認する。 - トップダウンテストは上位モジュールから下に結合しながらテストする方法、ボトムアップテストは下位モジュールから上に結合しながらテストする方法。
テストの網羅性
- ホワイトボックステストでは、どこまでテストをするのか(テストの網羅性)を決めてからテストを行う。
- 命令網羅では、全ての命令を少なくとも1回は通るようにテストする。
- 判定条件網羅(分岐網羅)では、分岐が発生する全ての処理において、結果が真の場合と偽の場合の両方をテストする。
- 条件網羅では、分岐が発生する全ての処理において、各条件式が真の場合と偽の場合の両方をテストする。
- 複数条件網羅では、分岐が発生する全ての処理において、起こり得る全てのパターンをテストする。
信頼度成長曲線(ゴンペルツ曲線)
- 信頼度成長曲線はプログラムが高品質であることを判断するために使うツール。
- バグが途中から加速度的に発見される、最終的にバグの検出は収束する、の2点を満たせれば高品質である。
応用情報ではテスト手法に関する問題が出題されます。是非最後までご覧ください。
テストの流れ
テストはシステムの開発が完了した後に行われます。テストの目的は開発したプログラムが想定通りに動くのかを確かめることで、プログラム内に存在する欠陥をバグと言います。
テストでは段階的に確認する範囲を大きくします。プログラムの機能毎に行う単体テストから始め、プログラム同士を組み合わせて確認する結合テストを行い、最後にシステム全体で要件を満たしているか確認するシステムテストを行います。
ホワイトボックステストとブラックボックステスト
ホワイトボックステストとブラックボックステストは単体テストで行われる検証方法です。
ホワイトボックステストはコーディング等、プログラムの内部構造に焦点を当てて行うテストでプログラム内の処理が正常に動作するかを確認します。
一方、ブラックボックステストはプログラムの内部構造は意識せず、仕様通り動くかどうかを確認します。
ホワイトボックステストとブラックボックステストでは着目している箇所が異なるので、テストケースの作り方も当然異なってきます。
限界値分析と同値分割
ブラックボックステストのテストケース作成方法に限界値分析と同値分割があります。
例えば、20歳以上60歳以下の場合は支払いが発生するというプログラムを考えます。
限界値分析
限界値分析では判定が変わる境目を検証するようなテストケースを作成します。今回の例では、19歳、20歳、60歳、61歳のテストケースを作ります。
同値分割
同値分割ではそれぞれの判定の中からランダムに1つずつテストケースを作成します。今回の例では、10歳(20歳未満)、30歳(20歳以上60歳以下)、80歳(60歳超え)のテストケースを作ります。
ファジング
ファジングもブラックボックステストで用いられるテストの手法の1つです。
ファジングでは、ファズと呼ばれる異常系のデータを大量にプログラムに処理させ、正しく処理できるかどうかを確認します。異常系のデータとは、想定外で処理対象外となるようなデータのことです。例えば、0~100歳が入力できる年齢欄に、「999」や「abc」と入力されることは想定外なので、異常系のデータとなります。
異常系のデータが入力されたからと言って、プログラムがフリーズしてしまうと困りますよね。例えば、年齢欄に「abc」と入力したら「0~100の数字を入力してください」と応答して欲しいですよね。このようにプログラムでは、異常系のデータが入力されたとしても、何かしら応答(処理)するように作られている必要があります。
トップダウンテストとボトムアップテスト
トップダウンテストとボトムアップテストは結合テストで行われる検証です。
結合テストではモジュール同士が正常に連携出来ているかどうかを確認します。モジュール同士の関係性には、データを渡す側⇔データを貰う側、データを処理する側⇔処理したデータを集約する側、のように上下関係があります。
トップダウンテストでは上位のモジュールから下に下にモジュールを結合しながらテストをしていきます。
逆にボトムアップテストでは下位のモジュールから上へ上へモジュールを結合しながらテストをしていきます。
モジュール
モジュールとはシステムを構築するための部品のことです。
部品という意味で言えばプログラムもモジュールの一つと言えますね。
スタブとドライブ
スタブ
上位のモジュールは完成しているが、下位のモジュールが完成していない。しかし、上位のモジュールが他のモジュールと連携出来るのか検証したい、という場合があります。この時、下位のモジュールの代わりに使うのがスタブです。
スタブは基本何の処理も行わないか、上位モジュールに返す値のうち1つだけを設定しておいて、正常にデータのやり取りが出来るかを確かめる程度の簡単な処理を仕込むこともあります。
ドライブ
スタブとは逆に、下位のモジュールは完成しているが上位のモジュールは未完成の場合に、下位のモジュールが他のモジュールと連携出来るかを確かめるために上位のモジュールの代わりに使うのがドライブです。
ドライブは上位のモジュールの代わりにテスト用に簡単な処理を実行して下位のモジュールにデータを渡せるようになっています。
テストの網羅性
ホワイトボックステストを行う際、どこまでテストをするのかを決めてからテストを行います。どこまでテストをするのかをテストの網羅性と言いますが、テストの網羅性の基準には4つの種類があります。
命令網羅 | 全ての命令を1回以上確認する |
---|---|
判定条件網羅 (分岐網羅) |
分岐が発生する処理において、結果が真の場合と偽の場合の両方をテストする |
条件網羅 | 分岐が発生する処理において、各条件式が真の場合と偽の場合の両方をテストする |
複数条件網羅 | 分岐が発生する処理において、起こり得る全てのパターンをテストする |
それぞれのテストケースについて以下のプログラムを例に考えてみます。
命令網羅
命令網羅では全ての命令を1回以上実行します。
よって、処理1が実行できれば良いので、①か②か③のどれかを実行すればOKです。
判定条件網羅(分岐網羅)
全ての分岐で、結果が真の場合と偽の場合の両方を確認します。
よって、分岐1で結果がYesになる①か②か③のどれかと、結果がNoになる④を実行すればOKです。
条件網羅
全ての分岐で、個々の条件が真の場合と偽の場合の両方を確認します。
上の例で言うと、「A>5」と「B=3」が個々の条件に該当します。
よって、「A>5」が真の場合と偽の場合、「B=3」が真の場合と偽の場合を確認できる、①と④、もしくは、②と③を実行すればOKです。
②と③では、②で「A>5」が偽、「B=3」が真を確認出来て、③で「A>5」が真、「B=3」が偽を確認出来るので、「A>5」の真と偽、「B=3」の真と偽の両方を確認出来ます。
複数条件網羅
複数条件網羅では起こり得る全てのパターンを確認します。
なので、①~④の全てを実行します。
信頼度成長曲線(ゴンペルツ曲線)
バグを発見するためにテストをしますが、どれだけテストをしてもプログラムにバグが残っていないことを証明することは不可能です。
本当はバグを0にして納品したいのですが、それを判断することは出来ないので、納品できるくらい十分な品質が担保されたことを判断するためのツールとして、信頼度成長曲線(ゴンペルツ曲線)が使われます。
信頼度成長曲線では、横軸にテストの件数、縦軸に検出した誤りの件数を置きます。
品質の高いプログラムは次のような特徴を持ちます。
①バグが途中から加速度的に検出される
②バグの検出は最終的に収束する
応用情報技術者試験での出題例
令和6年度春期問47
応用情報技術者
午前試験 令和6年度春期問47
ソフトウェア信頼度成長モデルの一つであって,テスト工程においてバグが収束したと判定する根拠の一つとして使用するゴンペルツ曲線はどれか。
正解は”ウ”
理想的なゴンペルツ曲線は次のような特徴を持ちます。
①バグは途中から加速度的に検出される。
②バグの検出は最終的に収束する。
これらの条件を満たしているのはウです。
令和5年度秋期問46
応用情報技術者
午前試験 令和5年度秋期問46
問題を引き起こす可能性があるデータを大量に入力し,そのときの応答や挙動を監視することによって,ソフトウェアの脆弱性を検出するテスト手法はどれか。
ア 限界値分析 イ 実験計画法 ウ ファジング エ ロードテスト
正解は”ウ”
ファジングでは様々な異常系のデータの大量に入力し、テスト対象の挙動を確認します。
よって、答えはウです。
令和4年度秋期問45
応用情報技術者
午前試験 令和4年度秋期問45
ファジングに該当するものはどれか。
ア Webサーバに対し,ログイン,閲覧などのリクエストを大量に送り付け,一定時間内の処理量を計測して,DDoS攻撃に対する耐性を検査する。
イ ソフトウェアに対し,問題を起こしそうな様々な種類のデータを入力し,そのソフトウェアの動作状態を監視して脆弱性を発見する。
ウ パスワードとしてよく使われる文字列を数多く列挙したリストを使って,不正にログインを試行する。
エ マークアップ言語で書かれた文字列を処理する前に,その言語にとって特別な意味をもつ文字や記号を別の文字列に置換して,脆弱性が悪用されるのを防止する。
正解は”イ”
ファジングでは様々な異常系のデータの大量に入力し、テスト対象の挙動を確認します。
よって、答えはイです。
令和4年度秋期問48
応用情報技術者
午前試験 令和4年度秋期問48
流れ図で示したモジュールを表の二つのテストケースを用いてテストしたとき,テストカバレージ指標であるC0(命令網羅)とC1(分岐網羅)とによる網羅率の適切な組みはどれか。ここで,変数V~変数Zの値は,途中の命令で変更されない。
正解は”イ”
命令網羅では、全ての命令を1回は通るようにテストケースを作ります。
分岐網羅では、全ての分岐を1回は通るようにテストケースを作ります。
テストケース1は次のルートを通ります。
テストケース2は次のルートを通ります。
テストケース1と2で、命令は全て通っているので命令網羅は100%です。
分岐は、(W≠0) and (X≠0)の分岐のNoと(Y≠0) and (Z≠0)の分岐のNoの2つはテスト出来ていませんが、残り8つの分岐はテスト出来ています。よって、分岐網羅は80%です。
令和4年度春期問45
応用情報技術者
午前試験 令和4年度春期問45
ファジングに該当するものはどれか。
ア サーバにFINパケットを送信し,サーバからの応答を観測して,稼働しているサービスを見つけ出す。
イ サーバのOSやアプリケーションソフトウェアが生成したログやコマンド履歴などを解析して,ファイルサーバに保存されているファイルの改ざんを検知する。
ウ ソフトウェアに,問題を引き起こしそうな多様なデータを入力し,挙動を監視して,脆弱性を見つけ出す。
エ ネットワーク上を流れるパケットを収集し,そのプロトコルヘッダやペイロードを解析して,あらかじめ登録された攻撃パターンと一致するものを検出する。
正解は”ウ”
ファジングでは様々な異常系のデータの大量に入力し、テスト対象の挙動を確認します。
よって、答えはウです。
令和4年度春期問47
応用情報技術者
午前試験 令和4年度春期問47
次の流れ図において,判定条件網羅(分岐網羅)を満たす最少のテストケースの組みはどれか。
ア (1) A=0,B=0 (2) A=1,B=1
イ (1) A=1,B=0 (2) A=1,B=1
ウ (1) A=0,B=0 (2) A=1,B=1 (3) A=1,B=0
エ (1) A=0,B=0 (2) A=0,B=1 (3) A=1,B=0
正解は”イ”
判定条件網羅なので、1つ目、2つ目の判定条件のどちらもYesとNoを通る必要があります。なので、下図の赤線を全て通るようにテストケースを作れればOKです。
ア (1) 1つ目の判定条件:No 2つ目の判定条件:No
(2) 1つ目の判定条件:No 2つ目の判定条件:No
全ての分岐を通っていないので、NGです。
イ (1) 1つ目の判定条件:Yes 2つ目の判定条件:Yes
(2) 1つ目の判定条件:No 2つ目の判定条件:No
全ての分岐を通るので、OKです。
テストケース2つで分岐網羅出来ているので、答えはイです。