資格道場 › レッスン一覧 › システム開発技術
システム開発技術・9/12・13分

テスト技法とカバレッジ(網羅基準)

ゴール

ブラックボックステストとホワイトボックステストを選択肢の言い回しから見分けられるようになる。同値分割・境界値分析で必要なテストデータの個数を数え、命令網羅・判定条件網羅(分岐網羅)・条件網羅・複数条件網羅のテストケースを過去問の形で選べるようになる。

過去問で繰り返し出ている定番テーマで、同じ形の問題が何度も出ている。特にブラックボックス/ホワイトボックスの見分けは本試験系で10回(免除試験で25回)出題されている。型を覚えれば得点しやすく、実務でも受け入れテストの観点を決めるときにそのまま使える。

このレッスンで稽古する(用語チェック・過去問)

結論:テストには「外から見る」と「中を見る」の2つがある

テストの見方はブラックボックステスト(仕様だけを見て入力と出力を確かめる)と、ホワイトボックステスト(プログラムの中身=命令や分岐を見て、通ったかを確かめる)の2つに分かれる。試験ではこの2つを取り違えさせる選択肢が定番だ。

たとえば自動販売機なら、ブラックボックスは「お金を入れてボタンを押したら正しい飲み物とお釣りが出るか」を外から試すこと。ホワイトボックスは扉を開けて「この配線、この切り替えスイッチを全部一度は通したか」を確かめることにあたる。

ブラックボックス仕様だけを見る入力中は見ない出力正しい出力か確かめるホワイトボックス中身を見る入力真偽命令命令出力全部の命令・分岐を通したか
ブラックボックスは中を見ずに入力と出力だけを確かめ、ホワイトボックスは中の分岐と命令を全部通したかを確かめる。

ブラックボックスとホワイトボックスの比較(最頻出)

観点 ブラックボックステスト ホワイトボックステスト
見るもの 機能仕様(入力と出力) 内部構造(命令・分岐・条件)
テストデータの作り方 同値分割・境界値分析・決定表・状態遷移など 流れ図の分岐条件から作る(命令網羅・分岐網羅など)
基準になるもの 仕様どおりに動くか 網羅率(カバレッジ):命令や分岐をどれだけ通したか
分岐やモジュールが増えると 影響を受けにくい テストデータが急増する
冗長なコード(使われない余分な処理) 検出できない 通らない命令として見つけられる
主に使う場面 結合テスト・システムテストなど 単体テスト

見分けのコツ:選択肢に「網羅率」「内部構造」「分岐命令」「流れ図」が出てきたらホワイトボックスの記述。「機能仕様」「同値クラス」「限界値」が出てきたらブラックボックスの記述だ。

ブラックボックスは中を見ないので、仕様に関係ない余分なコードがあっても結果は正しく見える。だから「冗長なコードがあっても検出できない」はブラックボックスの正しい記述になる。

ブラックボックスのデータの作り方:同値分割と境界値分析

同値分割法は、入力を「同じ扱いをされるグループ(同値クラス)」に分け、各グループから代表値を1つずつ選ぶ方法。正しく処理される範囲を有効同値クラス、エラーになるべき範囲を無効同値クラスと呼ぶ。

**境界値分析(限界値分析)**は、グループの切れ目の値を重点的に試す方法。バグは境目に集まりやすいからだ。たとえば「20歳以上は購入可」なら19歳と20歳を試す。

プログラムで A≧a と書くべきところを A>a と書く誤りは、ちょうど A=a のときだけ結果が変わる。代表値だけを選ぶ同値分割では見逃しやすく、境界値を試す限界値分析なら見つけられる。

手法 選ぶ値 得意なこと
同値分割 各クラスの代表値(境界でない値) 少ないデータで全グループを確かめる
境界値分析(限界値分析) クラスの両端と、そのすぐ外側 ≧と>の取り違えなど境界の誤りを見つける
例:20歳以上は購入可無効同値クラス19歳以下(購入不可)有効同値クラス20歳以上(購入可)代表値代表値1920同値分割=各クラスの代表値を1つずつ境界値分析=切れ目の19歳と20歳を試す
「20歳以上は購入可」の数直線。同値分割は各クラスの代表値を1つずつ、境界値分析は切れ目の19歳と20歳を試す。

カバレッジ(網羅基準)4種の違い

**カバレッジ(網羅基準)**とは、ホワイトボックステストで「プログラムのどこまでを通したか」を測る物差しのこと。試験では次の4つを区別させる。

基準 何を満たせばよいか A OR B の判定での例
命令網羅 全ての命令を1回以上実行する 命令がある側(真)を1回通れば足りることがある
判定条件網羅(分岐網羅) 各判定の結果を真・偽の両方とも1回以上通す 判定全体が真になるケースと偽になるケース
条件網羅 判定の中の個々の条件を真・偽の両方とも1回以上取る A真・A偽・B真・B偽が全部出る(判定全体の真偽は問わない)
複数条件網羅 個々の条件の真偽の全組合せを試す (A,B)=(真,真)(真,偽)(偽,真)(偽,偽) の4通り

強さの関係(包含関係)は次のとおり。上を満たせば下も必ず満たすが、逆は成り立たない。

flowchart TD
  M["複数条件網羅(全組合せ)"] -->|"満たせば満たす"| D["判定条件網羅(分岐網羅)"]
  D -->|"満たせば満たす"| S["命令網羅"]

判定条件網羅は全分岐を通すので、どの分岐の先にある命令も実行される。だから「判定条件網羅を満たせば命令網羅も満たす」が正しい。命令網羅は、命令のない側(偽で何もせず飛ばす側)を通らなくても満たせるので、逆は成り立たない。

注意点として、条件網羅は判定条件網羅を含まない。A OR B で (A偽,B真) と (A真,B偽) を試すと各条件の真偽は揃うが、判定はどちらも真になり、偽の分岐を一度も通らない。

条件網羅だけでは偽の分岐が残るケース1A偽・B真→判定は真ケース2A真・B偽→判定は真A OR B真真の分岐2回とも通る偽偽の分岐一度も通らない条件網羅は満たすが、判定条件網羅(分岐網羅)は満たさない
A OR B で (A偽,B真) と (A真,B偽) を試すと条件網羅は満たすが、判定は2回とも真で、偽の分岐を一度も通らない。

最少テストケースを数えるコツ

  1. 流れ図の判定(ひし形)を全部書き出す。
  2. 基準ごとに「何が真・偽になればよいか」を決める。命令網羅なら命令の箱、分岐網羅なら各判定の真と偽、複数条件網羅なら条件の組合せだ。
  3. 判定が直列に並んでいるなら、1ケースで前後の判定を同時に満たせることを利用する(真→真、偽→偽の2ケースなど)。

「偽のときは何もせず飛ばす」形では、命令網羅は真の側を通る1ケースで済むことがある。分岐網羅では偽の側も通す必要があるので、最少でも2ケースになる。この差がよく問われる。

開始判定真命令偽終了命令網羅真を通る1ケース最少1ケース分岐網羅真と偽の両方最少2ケース
偽のときは何もせず飛ばす形では、命令網羅は真を通る1ケースで足りるが、分岐網羅は偽の側も通すので最少2ケースになる。

状態遷移テスト(短く)

状態遷移テストは、「待機中→ボタン押下→動作中」のように、設計で決めたイベントと状態の組合せどおりにシステムが動くかを確認する手法。状態遷移図や状態遷移表を使う。

「状態が変化しない計算処理向け」「内部状態に着目しない」「データフロー図・決定表で解析する」という選択肢は誤り。

テストの原則(短く)

テストの目的は誤りを見つけることで、「誤りがないことを証明する」ことはできない。正常なデータだけでなく、誤った入力(異常系)でも意図どおりに動くかを必ず確かめる。

テストデータは、先にテストケース(何をどう確かめるか)を決め、それに沿って準備する。正常データだけ用意する、エラーデータは不要、といった選択肢は誤り。

例題 1

同値分割+境界値分析でテストデータの最少個数を数える

整数 1~1,000 を有効とする入力値が,1~100 の場合は処理 A を,101~1,000 の場合は処理 B を実行する入力処理モジュールを,同値分割法と境界値分析によってテストする。次の条件でテストするとき,テストデータの最小個数は幾つか。 〔条件〕 ① 有効同値クラスの 1 クラスにつき,一つの値をテストデータとする。ただし,テストする値は境界値でないものとする。 ② 有効同値クラス,無効同値クラスの全ての境界値をテストデータとする。

ア 5
イ 6
ウ 7
エ 8

出典:平成28年度 秋期 基本情報技術者試験 午前 問48

解き方と答えを見る
  1. 入力の範囲を数直線で整理する:…0 | 1〜100(処理A)| 101〜1,000(処理B)| 1,001…
  2. 同値クラスを分ける。有効同値クラスは「1〜100」「101〜1,000」の2つ。無効同値クラスは「0以下」「1,001以上」の2つ。
  3. 条件①:有効同値クラスごとに、境界でない値を1つずつ選ぶ(例:50と500)。→ 2個
  4. 条件②:全ての境界値を選ぶ。有効側の境界は 1, 100, 101, 1,000 の4個。
  5. 無効側の境界も数える。0以下の境界は 0、1,001以上の境界は 1,001 の2個。
  6. 境界値の合計は 4 + 2 = 6個。
  7. 合計は 2(代表値)+ 6(境界値)= 8個。

答え:エ(8個)。無効側の境界値 0 と 1,001 を数え落とすと7個になるので注意。

例題 2

命令網羅に必要な最少テストケース数

流れ図で表される部分を命令網羅によってテストするとき,テストケースは少なくとも幾つ用意する必要があるか。
流れ図: 判定「a = 0」。Yes なら [x = 1],No なら [x = 2]。どちらも合流して判定「b = 0」へ。Yes なら [y = 1],No なら [y = 2]。どちらも合流して終了へ。

ア 2
イ 3
ウ 4
エ 5

出典:平成28年度 春期 基本情報技術者試験 午前 問49

解き方と答えを見る
  1. 命令の箱を全部書き出す:x=1、x=2、y=1、y=2 の4つ。
  2. 判定は「a=0」と「b=0」の2つが直列に並び、どちらも真偽両側に命令がある。
  3. ケース1:a=0、b=0 → x=1 と y=1 を実行。
  4. ケース2:a≠0、b≠0 → x=2 と y=2 を実行。
  5. 2ケースで4つの命令を全て1回以上実行できた。1ケースでは x=1 と x=2 を両方実行できないので、2未満にはできない。

答え:ア(2個)

例題 3

判定条件網羅(分岐網羅)に必要な最少テストケース数

流れ図において,判定条件網羅(分岐網羅)を満たす最少のテストケース数は幾つか。
流れ図: 判定 [X > 1](真のとき (X÷2)→X を実行、偽のときは飛ばす)→ 判定 [A=2 or B=0](真のとき (X+1)→X を実行、偽のときは飛ばす)→ 終了。

ア 1
イ 2
ウ 3
エ 4

出典:平成29年度 春期 基本情報技術者試験 午前 問49

解き方と答えを見る
  1. 判定は「X>1」と「A=2 or B=0」の2つ。どちらも偽の側は何もせず飛ばす形。
  2. 分岐網羅では、それぞれの判定で真と偽の両方を1回以上通す必要がある。
  3. ケース1:X>1 を真にし(例 X=4)、後段も真にする(A=2)。→ 両判定の『真』を通過。
  4. ケース2:X>1 を偽にし(例 X=0)、後段も偽にする(A≠2 かつ B≠0)。→ 両判定の『偽』を通過。
  5. 1ケースでは同じ判定の真と偽を同時に通れないので、最少は2ケース。(参考:命令網羅なら、ケース1だけで全命令を実行できる)

答え:イ(2個)

例題 4

判定条件網羅のデータを複数条件網羅に広げる

プログラムの流れ図で示される部分に関するテストデータを,判定条件網羅(decision coverage)によって設定した。このテストデータを複数条件網羅(multiple condition coverage)による設定に変更するとき,加えるべきテストデータのうち,適切なものはどれか。ここで,( ) で囲んだ部分は,一組みのテストデータを表すものとする。
流れ図: 上から「処理1」→ひし形の判定「A>6 or B=0」→Yes は下の「処理2」へ進み,No は右側を回って処理2の下の合流点へ。処理2の後も同じ合流点に至る。 ・判定条件網羅によるテストデータ (A=4,B=1),(A=5,B=0)

ア (A=3,B=0),(A=7,B=2)
イ (A=3,B=2),(A=8,B=0)
ウ (A=4,B=0),(A=8,B=0)
エ (A=7,B=0),(A=8,B=2)

出典:平成30年度 春期 基本情報技術者試験 午前 問49

解き方と答えを見る
  1. 判定「A>6 or B=0」の中の条件は「A>6」と「B=0」の2つ。複数条件網羅では、その真偽の4通り (真,真)(真,偽)(偽,真)(偽,偽) が全て必要。
  2. 既にあるデータを判定する。(A=4,B=1) → A>6は偽、B=0も偽 → (偽,偽)。
  3. (A=5,B=0) → A>6は偽、B=0は真 → (偽,真)。
  4. 足りないのは (真,偽) と (真,真)。どちらも A>6 が真なので、A は7以上が必要。
  5. エを判定する。(A=7,B=0) → (真,真)、(A=8,B=2) → (真,偽)。足りない2通りがそろう。
  6. 他の選択肢も確かめる。アの (3,0) は (偽,真) で重複。イの (3,2) は (偽,偽) で重複。ウの (4,0) は (偽,真) で重複。どれも1通り足りない。

答え:エ

例題 5

分岐網羅と条件網羅を同時に満たすデータを選ぶ

流れ図において,分岐網羅を満たし,かつ,条件網羅を満たすテストデータの組みはどれか。
流れ図: a←0, b←0 の処理 → 判定「x≧1 or y=1」(Yes: a←1 → 合流 / No: 合流) → 判定「y>1」(Yes: b←1 → 合流 / No: 合流) → 終了。 テストデータ表(x, y): ア=(2,2),(1,2) / イ=(1,2),(0,0) / ウ=(1,2),(1,1),(0,1) / エ=(1,2),(0,1),(0,2)

ア (x, y) = (2, 2), (1, 2)
イ (x, y) = (1, 2), (0, 0)
ウ (x, y) = (1, 2), (1, 1), (0, 1)
エ (x, y) = (1, 2), (0, 1), (0, 2)

出典:基本情報技術者試験 科目A免除 修了試験 20220123 実施分 問47

解き方と答えを見る
  1. 判定1は「x≧1 or y=1」(条件 x≧1、y=1)、判定2は「y>1」(条件 y>1)。
  2. 満たすべきこと:①3つの条件 x≧1・y=1・y>1 がそれぞれ真と偽の両方を取る(条件網羅)。②判定1と判定2がそれぞれ真と偽の両方になる(分岐網羅)。
  3. エを判定する。(1,2):x≧1真、y=1偽 → 判定1真。y>1真 → 判定2真。
  4. (0,1):x≧1偽、y=1真 → 判定1真。y>1偽 → 判定2偽。
  5. (0,2):x≧1偽、y=1偽 → 判定1偽。y>1真 → 判定2真。
  6. x≧1 は真偽そろい、y=1 も真偽そろい、y>1 も真偽そろう。判定1・判定2も真偽そろう。→ 両方満たす。
  7. 他を確かめる。アは x が全て1以上で x≧1 の偽が無い。イは y=1 の真が無い。ウは判定1が全て真で、偽の分岐を通らない。

答え:エ

要点(試験直前に読む)

  • 「網羅率・内部構造・分岐」はホワイトボックス、「機能仕様・同値クラス・限界値」はブラックボックス。ブラックボックスは冗長なコードを検出できない。
  • 同値分割と境界値の個数問題では、有効クラスの代表値に加えて、有効・無効の境界値を全部数える(1〜1,000を100で分けるなら 2+6=8個)。
  • 強さは 複数条件網羅 ⊃ 判定条件網羅(分岐網羅) ⊃ 命令網羅。上を満たせば下も満たすが、逆は成り立たない。
  • 分岐網羅は各判定の真と偽を通す。直列の判定なら「真→真」「偽→偽」の2ケースで済むことが多い。
  • 複数条件網羅は条件の真偽の全組合せ。既存データの組合せを判定し、足りない組合せだけを選ぶ。
  • テストは誤りを見つけるためのもの。異常系も確かめ、テストケースを先に決めてからデータを準備する。

ひっかけ

  • ブラックボックスの問題で、ホワイトボックスの特徴(網羅率を使う・内部構造に着目・分岐が増えるとデータが急増)を混ぜた選択肢 → 「中を見ているか」で判定する。
  • 包含関係の向きを逆にした選択肢(「命令網羅を満たせば判定条件網羅も満たす」)→ 命令網羅は何もしない側の分岐を通らなくても満たせるので誤り。
  • 条件網羅を満たすだけのデータ(A OR B に (偽,真)(真,偽))を分岐網羅の答えに見せる → 判定全体の結果が真と偽の両方出ているかを確かめる。
  • 同値分割の個数問題で無効側の境界値(0や1,001)を数え落とさせる → 数直線を書いて両端の外側まで数える。
  • 状態遷移テストを「内部状態に着目しない」「決定表やデータフロー図を使う」と説明した選択肢 → 状態遷移テストはイベントと状態の組合せを確かめる手法。

用語(14)

ブラックボックステスト ぶらっくぼっくすてすと(black box test)
プログラムの中身を見ずに、機能仕様どおりの入力と出力になるかを確かめるテスト。
⚠ ホワイトボックステスト。選択肢に「網羅率・内部構造・分岐」があればホワイト、「機能仕様・同値クラス・限界値」があればブラック。
ホワイトボックステスト ほわいとぼっくすてすと(white box test)
プログラムの内部構造(命令や分岐)に着目し、必要な部分が実行されたかを網羅率で確かめるテスト。
⚠ ブラックボックステスト。分岐やモジュールが増えるとテストデータが急増するのはホワイト側の特徴。
同値分割法 どうちぶんかつほう
入力を同じ扱いをされるグループ(同値クラス)に分け、各グループから代表値を選んでテストする方法。
⚠ 境界値分析。同値分割は「代表値」、境界値分析は「切れ目の値」を選ぶ。
有効同値クラス ゆうこうどうちくらす
仕様上、正しく処理されるべき入力値のグループ。
⚠ 無効同値クラス(エラーになるべきグループ)。個数問題では無効側も数える。
無効同値クラス むこうどうちくらす
仕様上、エラーとして扱われるべき入力値のグループ(範囲外の値など)。
⚠ 有効同値クラス。無効側の境界値(範囲のすぐ外の値)の数え落としが典型ミス。
境界値分析(限界値分析) きょうかいちぶんせき(げんかいちぶんせき)
同値クラスの切れ目にある値とそのすぐ外の値をテストデータにして、境目の誤りを見つける方法。
⚠ 同値分割。≧と>の取り違えのような境界の誤りを見つけるのは限界値分析。
カバレッジ(網羅基準) かばれっじ(coverage)
ホワイトボックステストで、命令・分岐・条件をどこまで実行したかを測る基準。
命令網羅 めいれいもうら(statement coverage)
プログラム中の全ての命令を1回以上実行させる基準。
⚠ 判定条件網羅。命令網羅は「何もしない側」の分岐を通らなくても満たせるので、一番弱い。
判定条件網羅(分岐網羅) はんていじょうけんもうら(decision coverage/branch coverage)
各判定の結果が真になる場合と偽になる場合の両方を1回以上通す基準。
⚠ 条件網羅。分岐網羅は判定全体の真偽、条件網羅は中の個々の条件の真偽を見る。満たせば命令網羅も満たす。
条件網羅 じょうけんもうら(condition coverage)
判定の中の個々の条件が、それぞれ真と偽の両方を1回以上取るようにする基準。
⚠ 判定条件網羅。条件網羅を満たしても判定全体が片方の結果しか出ないことがあり、分岐網羅を満たすとは限らない。
複数条件網羅 ふくすうじょうけんもうら(multiple condition coverage)
判定の中の個々の条件について、真偽の全ての組合せを試す基準。
⚠ 条件網羅。条件が2つなら、条件網羅は各条件の真偽がそろえばよいが、複数条件網羅は4通り全部が必要。
状態遷移テスト じょうたいせんいてすと
設計で決めたイベントと状態の組合せどおりに、システムの状態が変わるかを確認するテスト手法。
⚠ 決定表(ディシジョンテーブル)を使う手法。状態遷移テストは状態遷移図・状態遷移表を使い、状態が変わるシステムに向く。
テストケース てすとけーす
何を、どんな入力と期待結果で確かめるかを決めたテストの1単位。
⚠ テストデータ。先にテストケースを決め、それに沿ってテストデータを準備する。
冗長なコード じょうちょうなこーど
仕様上の結果に影響しない、余分で不要な処理。
⚠ ブラックボックステストでは結果が正しく見えるため検出できない。

このレッスンの過去問

このレッスンで稽古する