ソフトウェア工学1 第10回テストtsnaka/lecture/se1/第10回...
TRANSCRIPT
ソフトウェア工学1第10回 テスト1
2017年6月20日
中島
1
授業内容
• テストの重要性
• テストとは
• テストケース設計技法(同値分割,限界値分析)
2
テストの重要性: 市場不具合のインパクト(1)
障害発生時の社会的影響大
国内の著名な事故例:
MIZUHOシステム障害(2002年4月)
⇒ 要求決定遅れ→開発期間圧迫→検証少
Suica/Pasmo窓口処理停止(2007年10月)
⇒ インタフェース仕様誤解+検証抜け
失敗知識DB(MIZUHO)http://www.sozogaku.com/fkd/
SUICA/PASMOhttp://www.itmedia.co.jp/news/articles/0710/12/news117.html
IPA/SEC 重要インフラ情報システム信頼性研究会報告書
http://sec.ipa.go.jp/reports/20090409.html3
テストの重要性: 市場不具合のインパクト(2)
続き
1. 年をまたぐ際の処理を、2月に対して実行
2. 文字入力の推測変換時:学習機能がリセット
3. 2バイトの変数によるI/F発注側: 0, 1, 2のときの仕様のみ記述請負側: 3の時のエラー処理忘れ
不正データ3により、プログラムが異常状態へ
4
ソフトウェア単体テスト
ソフトウェア結合テスト
ソフトウェア総合テスト
テストケース作成
テスト実行
テストは時間(コスト)がかかる
ソフトウェア要求分析
ソフトウェア外部設計
ソフトウェア内部設計
ソフトウェア結合テスト
ソフトウェア総合テスト
ソフトウェア単体テスト
コーディング
テストは開発全体の4-5割の工数を消費している
5
テストの準備(環境、データ)
テスト結果の文書化
再テスト実行
原因究明
不具合から欠陥へ
修正
設計のやり直し
さらに,不具合があると・・・
テスト作業はデバッグとは違う!
例: 総合テストでは,18時間/件
ソフトウェア開発工程
用語の定義: 不具合 と 欠陥
• 不具合: テスト(あるいは運用)で,期待する出力を得られないという事象
• 欠陥: ソフトウェア(ドキュメントやプログラム)に組み込まれた誤り
6
int main(void){
int i, x[9];for (i=0; i<10; i++) {
x[i] = func(i);…
}}
欠陥
プログラム
Tsnaka% a.outSegmentation fault
実行
不具合
• 「不具合」は「欠陥」と1対1でない(多対多,欠陥0の場合も有)• 「不具合」から「欠陥」を見つけるには「原因究明」作業が必要!
テストとは:
被テストプログラム
仕様 入力 出力期待値
( I1, O1 )( I2, O2 )
・・・
入力照合
出力
OK/NG
テストケース
テスト実行
不具合を検知するためにプログラムを実行すること
7
実習1.テストケース
• 自然数 A, Bを端末から入力し,差の絶対値|A-B|を求め画面に出力するプログラムのテストケースを考えよ.
入力の検査
入力に対する出力の検査
(A-B>0 → A-B)(A-B=0 → 0)(A-B<0 → B-A)
c1 3 1 2c2 2 2 0c3 2 5 3
→ 入力受け入れ→ メッセージ“不正な入力”A,Bいずれかが 0, -1, a, @, 1.1
テストケース A B |A-B|
A,Bとも,0より大きい整数の入力
8
入力 期待出力
入力 期待出力
テストとは: 何が難しいのか
• テストでは,プログラムに欠陥のないことを保証できない
テスト空間は膨大
テスト空間: すべての欠陥を発見できるテストの集合
テスト集合1
テスト集合2
テスト集合3
テスト集合4
残存欠陥
• 有限時間のテストでやり尽くすことはできない
9
1
2
N
パスの組み合わせ
2N
パスだけ考えても・・・
欠陥
テストとは: 課題と技法
テスト戦略
テスト妥当性評価
テスト実行支援
テスト容易性の考慮
テストケース設計技法
テスト技法
課題1
課題2
システム開発計画
準備
実行
評価
計画
実施設計プロセス
テストプロセス仕様
被テストプログラム
品質目標の設定
テスト手順の計画
テスト終了判定
テスト環境の準備
テストケース設計
テスト実行と結果記録
課題1 テストを有限時間で最大効率をあげるものにする
10
課題2 テストで品質を保証したい(完了基準の設定)
テストとは: 位置付け
ソフトウェア要求分析
ソフトウェア方式設計
ソフトウェア詳細設計
ソフトウェア結合テスト
ソフトウェア総合テスト
ソフトウェア単体テスト
ソフトウェア方式設計の確認
モジュール仕様の確認
ソフトウェア要求仕様書
ソフトウェア方式設計書
ソフトウェア詳細設計書
ソフトウェア要求仕様の確認
コーディング
11
• テストには段階がある• テストの各段階には,対応する要求分析・設計がある• より小さな範囲で 欠陥を見つけた方が得!
ソフトウェア全体
コンポーネント
モジュール(単体)
テストとは: 単体テスト
単体テスト← 詳細設計に対応ソフトウェア
コンポーネント
modeManager
モジュール群
void modeManager(int mode, int event, int* action, int* nextmode){
if (mode == M1 && event == PushB1) {*action = LightON;*nextmode = M2;
} else if (…) {
…}else {
…}
}
12
• 「単体」は,Cでは関数であることが多い.C++やJavaではクラスを単体とする場合もある.
入力 期待出力
mode event nextmodeactionM1 PushB1 LightON M2Case 1
PushB2 M1 ‐ M1Case 2
modeManagerの単体テスト仕様:
テストケース
テスト結果
OK
NG
注) 関数の仮引数だけでなく,以下も入出力になる.・ 入力: 外部変数,ファイル入力など・ 出力: 外部変数,戻り値,ファイル出力など
テストケース設計技法
• 少ないケース数で,漏れなく,欠陥の検出率を上げるテストケース集合を設計するやり方
13
• テストケース設計技法の種別
①ブラックボックステスト: 仕様に基づく抽出②ホワイトボックステスト: プログラムの構造に基づく抽出③ランダムテスト: ランダムな方法による抽出
テストケース設計技法 単体/結合テスト 総合テスト
ブラックボックス ○ ○
ホワイトボックス ○ ×
ランダム × ○
適用可能範囲
ブラックボックステスト
①同値分割: 入力条件のみに注目、代表値をとる
②限界値分析: 入出力条件の境界付近に注目
③状態ベース: 状態ベースの仕様より抽出
種別仕様に基づくテストケースの抽出方法
定義
14
ブラックボックステスト: 同値分割
・ 入力条件を網羅 → 論理的なミスを発見!・ 入力条件を見出すのが(意外と)難しい
入力条件のみに注目し入力空間を分割、その代表値をとる
※入力条件: プログラムの入力変数間の関係による場合分け
同値分割とは
特徴
同値クラス: ある入力条件について、プログラムにとって同じ扱い
を受けるはずの値の範囲
有効同値クラス:プログラムにとって有効な同値クラス
無効同値クラス:プログラムにとって無効な同値クラス
定義
15
S1.入力条件と同値クラスを見出す
16
例題: 現在年月日と,誕生年月日から,年齢を計算する.月は1-12, 日は1-31以外はエラーメッセージを出すこと.
入力条件1: 入力変数の個別の値 (正常な入力と異常な入力)
■ 年,月,日の正しさ
int age(int cyear, int cmonth, int cday, int byear, int bmonth, int bday)
入力条件
有効同値クラス 無効同値クラス
cyear ①すべてOK
cmonth ①1-12 ②0以下,③13以上
cday ①1以上31以下 ②0以下 ③32以上
byear ①すべてOK
bmonth ①1-12 ②0以下,③13以上
bday ①1以上31以下 ②0以下 ③32以上
S1.入力条件と同値クラスを見出す(続き)
17
入力条件2: 入力変数間の関係
■現在年月日と誕生年月日の前後関係
入力条件 有効同値クラス 無効同値クラス
現在年月日と誕生年月日の前後関係
①現在年月日>=誕生年月日 ②現在年月日<誕生年月日
入力条件3: プログラムの仕様 (入力による出力の違い)
入力条件 有効同値クラス 無効同値クラス
現在月日と誕生月日の前後関係
①現在月日>=誕生月日②現在月日<誕生月日
S2. テストケースを抽出する: テストマトリクス表
2-1) できるだけ多くの有効同値クラスを用いるテストケース
2-2) 無効同値クラスのひとつだけをカバ-するテストケ-ス
(1) 入力条件ごとに,同値クラスを並べる表を作る
同値クラス
個別の変数 cyear ①cmonth ①
②③
cday ①②③
byear ①bmonth ①
②③
bday ①②③①②①②
プログラムの仕様
月日の前後関係
変数間の関係
現在年月日の関係
入力条件 C1 C2
○ ○○ ○
○ ○
○ ○○ ○
○ ○
○ ○
○○
C3 C4 C5 C6 C7 C8 C9 C10 C11
○ ○ ○ ○ ○ ○ ○ ○ ○○ ○ ○ ○ ○ ○ ○
○○
○ ○ ○ ○ ○ ○ ○○
○○ ○ ○ ○ ○ ○ ○ ○ ○○ ○ ○ ○ ○ ○ ○
○○
○ ○ ○ ○ ○ ○ ○○
○○ ○ ○ ○ ○ ○ ○ ○
○○ ○ ○ ○ ○
○ ○ ○ ○
(2) 全ての同値クラスをカバ-するまで以下のテストケース設定を繰り返す。
18
S3. テストケースを完成する
19
各テストケースに対し,同値クラスに当てはまる入力値を割り当て,期待出力を計算する
入力 期待出力cyear cmonth cday byear bmonth bday age
C1 2015 6 23 1960 3 31 55C2 2015 6 23 1995 8 1 19C3 2012 0 23 1940 6 7 -1 "現在月が間違っています"C4 2020 13 5 1950 6 7 -1"現在月が間違っています"C5 2016 10 0 1950 6 7 -1"現在日が間違っています"C6 1996 4 32 1990 6 7 -1"現在日が間違っています"C7 2015 12 1 1700 0 20 -1"誕生月が間違っています"C8 2015 12 1 1800 13 20 -1"誕生月が間違っています"C9 2015 7 1 1900 1 0 -1"誕生日が間違っています"C10 2015 7 1 200 8 32 -1"誕生日が間違っています"C11 2000 3 29 2000 3 30 -1"年齢が計算できません”
No
小演習: 三角形判定プログラム(1)
20
checkTriangle関数の仕様: enum Result checkTriangle(double x, double y, double z);enum Result { nonTriangle, ordinalTriangle, isoscelesTriangle, quilateralTriangle};
この関数はx,y,zの3つの実数を入力とする。x,y,zはそれぞれ三角形の
3辺の長さを表すものとする。プログラムは、三角形が不等辺三角形ordinalTriangle ・二等辺三角形, isoscelesTriangle ・正三角形equilateralTriangleのうちのどれであるかを判定し戻り値で結果を返す.
問題: この関数の入力条件と同値クラスを,洗い出せ.
ヒント
21
入力条件1: 入力変数の個別の値 (正常な入力と異常な入力)
入力条件2: 入力変数間の関係
入力条件3: プログラムの仕様 (入力による出力の違い)
解答例
22
入力条件1: 入力変数の個別の値 (正常な入力と異常な入力)
入力条件2: 入力変数間の関係
入力条件3: プログラムの仕様 (入力による出力の違い)
入力条件 有効同値クラス 無効同値クラス
x ① >0 ② ≦0
y ① >0 ② ≦0
z ① >0 ② ≦0
入力条件 有効同値クラス 無効同値クラス
三角形の成立条件
① x<y+z & y<x+z & z<x+y ② x≧y+z ③ y≧x+z ④ z≧x+y
入力条件 有効同値クラス 無効同値クラス
3辺の等値関係
① x = y = z
② x = y & x ≠z ③x = z & x ≠y ④y = z & x ≠y
⑤ x≠y & x≠y & y≠z
同値分割の特徴と弱点
検知範囲
プログラムの入力処理における論理ミスに起因するもの例えば、無効同値クラス(cday≦0の場合)を忘れて、処理を続行しまうケースなどがある。
if (cday <= 31) { /* 処理*/ }
検出不能例
プログラミング上の実装ミス例えば、先の処理で、31は本来含まれるはずが=を忘れてしまって次のように実装してしまうケースがある。
if (cday>0 && cday < 31) { /* 処理*/ }
cday>0 忘れ!
本来は <=
テストケース C5で検出!
23
ブラックボックステスト:限界値分析
・プログラミング上の実装のミスを広範囲に発見できる
・プログラミングのセンスと経験が必要
入出力条件の境界付近に注目するテストケース技法
限界値分析とは
特徴
1) 入力条件だけでなく出力条件も考慮する.
• ファイル/表示出力/パケット出力などの出力の変わり目にも注目
2) 各条件の境目の値をテストケ-スとして選択する.
• 有効な同値クラスの端、及びその端と隣り合わせの無効値を選択
• 入力引数値/出力行数の変わり目、ループ実行0,1回, 終了条件
3) その他,プログラミング上のミスの
起こりそうなところを狙う.無効同値 有効同値
X>=a
xa-1, a24※実数のときは、境界点aのみ
境界値の取り方
25
入力条件
有効同値クラス 無効同値クラス
cyear ①すべてOK
cmonth ①1-12 ②0以下,③13以上
cday ①1以上31以下 ②0以下 ③32以上
byear ①すべてOK
bmonth ①1-12 ②0以下,③13以上
bday ①1以上31以下 ②0以下 ③32以上
入力条件 有効同値クラス 無効同値クラス
現在年月日と誕生年月日の前後関係
①現在年月日>=誕生年月日
②現在年月日<誕生年月日
入力条件 有効同値クラス 無効同値クラス
現在月日と誕生月日の前後関係
①現在月日>=誕生月日②現在月日<誕生月日
有効同値端: 1,12無効同値隣: 0,13
有効同値端: 1,31無効同値隣: 0,32
有効同値端: 現在=誕生無効同値隣: 現在+1day=誕生
有効同値端: 現在=誕生無効同値隣: 現在+1day=誕生※両方とも年は別
境界値を考慮したテストケースの修正
26
既存のケースで境界値を狙ったもの
境界値を狙って付け加えたもの
入力 期待出力cyear cmonth cday byear bmonth bday age
C1 2015 6 23 1960 3 31 55C2 2015 6 23 1995 8 1 19C3 2012 0 23 1940 6 7 -1 "現在月が間違っています"C4 2020 13 5 1950 6 7 -1"現在月が間違っています"C5 2016 10 0 1950 6 7 -1"現在日が間違っています"C6 1996 4 32 1990 6 7 -1"現在日が間違っています"C7 2015 12 1 1700 0 20 -1"誕生月が間違っています"C8 2015 12 1 1800 13 20 -1"誕生月が間違っています"C9 2015 7 1 1900 1 0 -1"誕生日が間違っています"C10 2015 7 1 200 8 32 -1"誕生日が間違っています"C11 2000 3 29 2000 3 30 -1"年齢が計算できません”C12 2015 5 1 1960 3 23 55C13 2015 5 31 1995 8 23 19C14 2015 1 2 1960 3 23 54C15 2015 12 20 1995 8 23 20C16 2015 2 2 1960 1 23 55C17 2015 3 20 1995 12 23 19C18 2000 3 30 2000 3 30 0C19 2001 3 30 2000 3 30 1C20 2001 3 29 2000 3 30 0
No
小演習: 三角形判定プログラム(2)
27
checkTriangle関数の仕様: enum Result checkTriangle(double x, double y, double z);enum Result { nonTriangle, ordinalTriangle, isoscelesTriangle, quilateralTriangle};
この関数はx,y,zの3つの実数を入力とする。x,y,zはそれぞれ三角形の
3辺の長さを表すものとする。プログラムは、三角形が不等辺三角形ordinalTriangle ・二等辺三角形, isoscelesTriangle ・正三角形equilateralTriangleのうちのどれであるかを判定し戻り値で結果を返す.
問題: この関数の同値クラスに対して,境界値を洗い出せ.
解答例
28
入力条件1: 入力変数の個別の値 (正常な入力と異常な入力)
入力条件2: 入力変数間の関係
入力条件3: プログラムの仕様 (入力による出力の違い)
入力条件 有効同値クラス 無効同値クラス
x ① >0 ② ≦0
y ① >0 ② ≦0
z ① >0 ② ≦0
入力条件 有効同値クラス 無効同値クラス
三角形の成立条件
① x<y+z & y<x+z & z<x+y ② x≧y+z ③ y≧x+z ④ z≧x+y
入力条件 有効同値クラス 無効同値クラス
3辺の等値関係
① x = y = z
② x = y & x ≠z ③x = z & x ≠y ④y = z & x ≠y
⑤ x≠y & x≠y & y≠z
解答例
29
入力条件1: 入力変数の個別の値 (正常な入力と異常な入力)
入力条件2: 入力変数間の関係
入力条件3: プログラムの仕様 (入力による出力の違い)
入力条件 有効同値クラス 無効同値クラス
x ① >0 ② ≦0
y ① >0 ② ≦0
z ① >0 ② ≦0
入力条件 有効同値クラス 無効同値クラス
三角形の成立条件
① x<y+z & y<x+z & z<x+y ② x≧y+z ③ y≧x+z ④ z≧x+y
入力条件 有効同値クラス 無効同値クラス
3辺の等値関係
① x = y = z
② x = y & x ≠z ③x = z & x ≠y ④y = z & x ≠y
⑤ x≠y & x≠y & y≠z
各値に対して・境界値 0.01・0
• x=y+z• y=x+z• z=x+y
• x=y=z=0• x=y=0,z≠0• x=z=0,y≠0• y=z=0,x≠0
課題1
• P20ページの課題で作成した三角形判定プログラムに対する入力条件と同値クラスから, P18にあるようなテストマトリックス表を作りなさい.
7/4(火)13:00 締め切り
14G32(中島研究室)のポストまたは授業まで
30