⾼信頼システム08
ソフトウェアの⾼信頼化02
テストに関して7⽉22⽇（⽉）13：00から筆記⽤具，授業資料，電卓，⾃筆ノートのみ使⽤可．
1

ブラックボックステスト
プログラムのソースコードを利⽤せずに（⾒ずに）テストを⾏う．
⼤規模ソフトウェアのテストに有効．
ほとんどのソフトウェアがこの⼿法でテストされている•同値分割法（同値クラステスト）•境界分析法（境界値テスト）•ディシジョンテーブル•状態遷移テスト2

ソフトウェアの振る舞い
同値・境界値テストの対象部分
⼊⼒処理

計算

ソフト
ウェア

データ保存

3

出⼒処理

例：プリントダイアログ0を⼊れると．．．

4

同値分割法
⼊⼒領域を「同値クラス」（部分集合）に分割，部分集合に⼊る⼊⼒値を等価（同値）とみなし，テストケースを削減する⽅法

5

例＜要求仕様＞
⼊⼒ A ：1から999まで⼊⼒可能
⼊⼒ B ：1から499まで⼊⼒可能テストの際にどのような⼊⼒でテストを⾏うか？

6テストケースを作ってみる：有効同値と無効同値

⼊⼒範囲を同値に分割する
⼊⼒A：
無効同値（〜0）

有効同値（1〜999）

無効同値（1000〜）

有効同値（1〜499）

無効同値（499〜）

⼊⼒B：無効同値（〜0）7⾮常に強いテストケース
有効同値と無効同値をしっかりカバーできるように① A=0 B=00はチェックした⽅が良い② A=-20 B=-20
⼊⼒B③ A=0 B=250④④ A=-5 B=750 有効同値
499
⑤ A=500 B=250⑥ A=500 B=0⑦ A=500 B=550⑧ A=1100 B=250⑨ A=1100 B=550
A: 1〜999, B: 1〜499
であれば良い

1②⑦⑨③⑤⑧① 1⑥999 ⑩8⼊⼒A

実践的なテストケース

テストケースを減らすにはできるだけ少ない同値で全ての範囲を網羅できるように① A=0 B=0

② A=-20 B=-20③ A=0 B=250④ A=-5 B=750⑤ A=500 B=250⑥ A=500 B=0⑦ A=500 B=550⑧ A=1100 B=250⑨ A=1100 B=550

⼊⼒B
⑨499
⑤1②① 1
9999

⼊⼒A実践的なテストケース2① A=0 B=0② A=-20 B=-20③ A=0 B=250④ A=-5 B=750⑤ A=500 B=250⑥ A=500 B=0⑦ A=500 B=550⑧ A=1100 B=250⑨ A=1100 B=550

⼊⼒B
④499
⑤
1

① 1
10999 ⑩

⼊⼒A同値クラステストの課題
有効同値が1個に対して，無効同値9個もある
実際のプログラムは複雑→ 無効同値のテストケースを作って実⾏するのに時間がかかる．

実際の現場では，ある程度，無効同値のテストを省略する必要がある
でも，プログラムがフリーズしたり，データが破壊されるのは避けなくてはいけない11

実はプログラムに対する仮定があります
想定されているプログラム
if (0 < a && a <= 999 && 0 < b && b <= 499)//正しい値が⼊⼒された時の処理
else//間違った値が⼊⼒された時の処理想定されていないプログラム (同値が別の命令⽂で処理されている)
if (0 < a && a <= 100 && 0 < b && b <= 499)//正しい値が⼊⼒された時の処理（ここに間違いがあったら有効同値では検出できない）
else if (100 < a && a <= 999 && 0 < b && b <= 499)
else//正しい値が⼊⼒された時の処理//間違った値が⼊⼒された時の処理
12

境界値テスト
使⽤条件の境界となる値と，その隣の値に対してテストを⾏う⽅法
同値分割法とセットで使われる．

バグは「境界」に潜んでいる可能性が⾼い
無効同値と有効同値の境⽬•境界を表す条件の誤解•コーディング時の条件の記述誤り

13境界を表す条件の誤解
境界を表す仕様の記述⽅法は多様な表現がある：「以上」，「以下」，「未満」，「より⼩さい」，「〜を超える」，「〜を下回る」，「〜まで」，「〜と同じになった場合」などなど．

14

例
料⾦を処理するプログラムの仕様例

曖昧な点はないですか？

•7歳まで無料（0歳から？）•7歳以上，20歳未満は⼦供料⾦•21歳以上は⼤⼈料⾦

7歳は無料？それとも⼦供料⾦？
20歳の料⾦は定義されていない

仕様の曖昧な点を確認することが重要！！
改善の例•0歳以上，7歳 未満は 無料•7歳以上，20歳 以下 は⼦供料⾦•21歳以上は⼤⼈料⾦
15コーディング時の条件の記述誤り•0歳以上，7歳 未満は 無料•7歳以上，20歳 以下 は⼦供料⾦•21歳以上は⼤⼈料⾦
if 0<= 年齢 and 年齢<7 then
料⾦=無料
else if 7<=年齢 and 年齢<=20 then
料⾦＝⼦供料⾦
else if 21<=年齢 then
料⾦＝⼤⼈料⾦

16

エラーの4タイプ

๏タイプ1：等号や不等号の間違い
if 0<=年齢 and 年齢<=7 then
料⾦=無料
else if 7<=年齢 and 年齢<=20 then・・・・・・

๏タイプ2：数字の書き間違いなど

if 0<= 年齢 and 年齢<=8 then
料⾦=無料
else if 7<=年齢 and 年齢<=20 then・・・・・・
17

エラーの4タイプ

๏タイプ3：境界がない

if 0<= 年齢 and 年齢<=7 then この⾏以降がコメントアウト
料⾦=無料// else if 7<=年齢 and 年齢<=20 then・・・・・・

๏タイプ4：余分な境界
if 0<= 年齢 and 年齢<7 then

料⾦=無料
else if 7<=年齢 and 年齢<=20 then
料⾦＝⼦供料⾦
else if 21<=年齢 and 年齢 <= 65 then
料⾦＝⼤⼈料⾦18

境界をテストするには：On-Oﬀポイント法※
異なる同値領域に属するデータのうち，距離が最⼩となるデータを⽤いてテストする

無料

無効-101

⼦供料⾦
6 7

⼤⼈料⾦20 21

年齢

良いテストケース： 年齢=-1, 0, 6, 7, 20, 21
このテストケースで，前述の四つエラータイプを検出可能か？

※ Beizer, 「ソフトウェアテスト技法」
19同値クラステストのみの場合
年齢=-5, 3, 15, 30 (他の値もあり得ます）
このテストケースで，前述の四つエラータイプを検出可能か？

20

練習問題
あるインターネットショッピングサイトで，商品を期間限定販売できる機能を追加した．次の仕様の時に境界値テストでテストする
値を求めなさい．

仕様•販売開始：4⽉1⽇

0時00分00秒•販売終了：4⽉5⽇ 23時59分59秒

21ディシジョンテーブル
全ての⼊⼒の組み合わせ，出⼒・動作を表にする＜要求仕様＞
⼊⼒ A ：1から999まで⼊⼒可能
⼊⼒ B ：1から499まで⼊⼒可能
出⼒：A × B
状態

ルールルール ルール2 ルール3 ルール4

C1: A=正しい1True

True

False

False

C2: B=正しい

True

False

True

False

⾏う

⾏う

動作
A1: 計算値出⼒

⾏うA2:⼊⼒エラー処理

⾏う

⼊⼒数が多くなると，表のサイズが膨⼤となる→ ⼊⼒数が少なくて，動作が複雑なプログラムに適する
22

状態遷移テスト
アプリケーションは状態により挙動が異なる
例：ワープロ・エディタの状態遷移
起動

システム

メニューコマンド

終了
状態
イベント

ダイアログ
オープン

⼊⼒待ち

ダイアログ閉じる
システム

⼊⼒待ち

ダイアログオープン

起動

A

NA（⼆つ⽬のインNA（⼆つ⽬のインスタンススタンスが起動しが起動しないことを確認）ないことを確認）

メニューコマンドNA

ファイルダイアロ
グオープン

NA

⼊⼒

NA

⼊⼒待ち

NA

ダイアログ閉じる

NA

NA

⼊⼒待ち

アプリケーション終了

NA

システム

NA(終了しないことを確認)

23

A=Available, NA=Not Available