＜目次＞「プログラム の実行履歴を用いた利用モデルの作成方法について」
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.

2003.03.06

香川大学
高木 智彦 ，古川 善吾

背景
目的統計的テスト（概要）
統計的テスト（手順）
テストケース作成支援システム
利用モデル （概要）
利用モデル （作成手順）
利用モデル （プログラムとの対応付け）
利用モデル （適用例）
テストケースの作成
本手法の効果と問題点
今後の研究方針

1

1. 背景

2

3. 統計的テスト （概要）

• 統計的テストは，大量のテストケースを用いて，ソフトウェアの実際の利用状況における信頼性を評価できる．
• ただし，利用モデル（ソフトウェアの利用状況の要約）の作成にコストがかかる点が問題．

• ユーザの使用特性を外部仕様の観点から統計的に分析し，テストケースに反映させる．
• 使用頻度の高い機能にテストの重心を置くことによって，ユーザがよく使う機能に含まれるバグを重点的に検出．

2. 目的
GCC（GNU Compiler Collection) およびテストカバレッジ
ツール gcov の機能を利用して，効率的に利用モデルを作成する方法を確立する．

＜従来のテスト＞
・全体を満遍なくテストする・網羅基準（C 0，C 1）によるテスト十分性評価＜統計的テスト＞
・使用頻度の高い機能にテストの 重点を置く
・MTTF（Mean Time To Failure）によるテスト十分性評価

3

4. 統計的テスト （手順）4

5. テストケース作成支援システム

1) 利用モデルの構築
・利用 モデル：ソフトウェアの利用状況に関する要約．
マルコフ連鎖（遷移確率付き状態遷移図）で表 される．

2) テストケースの生成
・テストケース：初期状態から終了状態に至る，状態と遷移 の列．
マルコフ連鎖の遷移確率を満たす．

3) テストの実施
4) テストモデルの構築
・テストモデル：テスト履歴の要約．マルコフ連鎖 で表 される．

5) 信頼性（テスト十分性）の評価
5

図10, 図 1111．
． テストケース作成支援システム

61

6. 利用モデル （概要）

7. 利用モデル （作成手順）
1) 状態遷移図とプログラムを用意する．
・ソフトウェアの外部仕様をまとめる．
・入出力に関する機能を漏れなく記述する．

• 利用モデル ：ソフトウェアの利用状況の要約．
• 実際の利用状況を反映したテストケースを得るためのモデル2) プログラム 中に標識コメントを挿入する．

・状態遷移図の状態や 遷移に対応するプログラムのコード行に標識コメントを挿入する．

• マルコフ連鎖（遷移確率付き状態遷移図）
で表す．

3) プログラムを実行する．

• ソフトウェアの仕様として作成される状態遷移図と，ユーザのソフトウェアに対する使用特性を用いて作成する．

・GCCを用いて，プログラムをコンパイルし実行．
・gcovを用いて，プログラムの各コード行が実行される頻度（累積の 実行回数）を取得する．

4) 実行履歴を状態遷移図に関連付ける．
・標識コメントを手がかりに ，コード行の実行回数を状態や遷移に関連付ける．
・遷移確率を計算し，利用モデルを完成 させる．

ソフトウェアのプロトタイプや過去のバージョンの実行履歴
7

8. 利用モデル （プログラムとの対応付け）

8/* std:メインメニュー */int menu̲screen(void) {int num;do {printf("******************************¥n");printf("* アドレス帳メインメニュー *¥n");printf("******************************¥n");printf("○ 機能を選択して下さい．¥n");printf("データ追加 ：1 データ削除 ：2¥n");printf("データ一覧 ：3 終了：4¥n");scanf("%d", &num);} while (num < 1 ￨￨ num > 4);
return num;}

9. 利用モデル （適用例）

標識コメントの直後のコード行の実行回数を状態や遷移の実行回数とみなす．

データ追加
氏名を入力

氏名

住所

電話番号を入力

電話番号

備考

住所を入力

備考を入力

“データ追加”を選択＜標識コメントの挿入位置＞

起動============================================“データ一覧”を選択

メインメニュー

データ一覧

while ((menu̲item = menu̲screen()) != END) {switch (menu̲item) {case ADD:/* std: "データ追加"を選択 */add̲item();break;
case DELETE:/* std: "データ削除"を選択 */delete̲item();break;
case DISPLAY:/* std: "データ一覧"を選択 */display();break;}}
10“終了”を選択① 関数宣言の直前（状態に対応）② 関数呼び出しの直前（遷移に対応）③ 入出力ステートメントの直前（状態に対応）④ その他“データ削除”を選択

データ削除
該当データ発見

キー入力

削除

該当エラーメッセージ
データなし

9

図1． アドレス帳プログラム の状態遷移図

データ追加

データ追加
100% [60/60] 氏名を入力100% [60/60] 電話番号
100% [60/60]
を入力
氏名
住所
電話番号
備考
100% [60/60] 住所を入力100% [60/60]備考を入力“データ追加”を選択 100% [60/60]
18% [60/332] “データ一覧”を選択
起動
100%
41% [136/332][127/127] メインメニュー
データ一覧
38% [127/332]
100%“終了”を選択[136/136]“データ削除”を選択100% [9/9]
3% [9/332]
データ削除
該当データ
78% [7/9]
100% [9/9]発見削除
100% [7/7]キー入力
該当エラーメッセージ
100% [2/2]
データなし22% [2/9]
図6． アドレス帳プログラム の利用モデル例/* std:メインメニュー */int menu̲screen(void) {332
int num;
332
do {
332
printf("******************************¥n");332
printf("* アドレス帳メインメニュー *¥n");332
printf("******************************¥n");332
printf("○ 機能を選択して下さい．¥n");332
printf("データ追加 ：1 データ削除 ：2¥n");332
printf("データ一覧 ：3 終了：4¥n");
332scanf("%d", &num);332} while (num < 1 ￨￨ num > 4);332
return num;
332 }===============================================
332 while ((menu̲item = menu̲screen()) != END) {205
switch (menu̲item) {60
case ADD:/* std: "データ追加"を選択 */60
add̲item();
60
break;
case DELETE:/* std: "データ削除"を選択 */9delete̲item();
9break;case DISPLAY:/* std: "データ一覧"を選択 */136
display();136
break;
205}
205 }
11

氏名を入力

氏名

電話番号を入力

住所

電話番号

備考住所を入力

備考を入力“データ追加”を選択“データ一覧”を選択

起動

メインメニュー

データ一覧“終了”を選択“データ削除”を選択“検索データ表示”を選択

データ削除
該当データ発見削除

キー入力
該当 エラーメッセージ
データなし

検索データ表示該当データ発見表示

キー入力
該当 エラーメッセージ
データなし

図7． 新機能を追加したアドレス帳プログラムの状態遷移図

122

データ追加100% [60/60] 氏名を入力 100% [60/60] 電話番号を入力 100% [60/60]
氏名
住所
電話番号
備考
100% [60/60] 住所を入力 100% [60/60] 備考を入力

10. テストケースの作成“データ追加”を選択 100% [60/60]
15% [60/332]
起動“データ一覧”を選択
100% [127/127]
33% [136/332]
メインメニュー
データ一覧
30% [127/332]
100% [136/136]“終了”を選択
100%

データ追加
氏名を入力

氏名

“データ削除”を選択 “検索データ表示”を選択
2% [9/332] 100% [9/9]
20%
データ削除
該当データ 78% [7/9]
100% [9/9]発見
100% [7/7]削除
キー入力
該当 エラーメッセージ100% [2/2]
データなし 22% [2/9]

電話番号を入力

電話番号

住所を入力

備考

備考を入力

“データ追加”を選択“データ一覧”を選択

起動

メインメニュー

データ一覧“終了”を選択“データ削除”を選択

データ削除
該当データ
発見

検索データ表示該当データ 50%
発見
100%
表示
100%
キー入力
該当 エラーメッセージ100%
データなし 50%
図8． 新機能を追加したアドレス帳プログラムの利用モデル例

住所

キー入力

「初期状態」→起 動→「メインメニュー」→“データ追 加”を選 択→「データ追加」（「初期状態」→ラムダ遷 移→ 「氏名」→ 氏名 を入力 →「住所」→住 所を入力→ 「電話番号 」→電 話 番 号を入力→「備 考」→ 備考 を入 力→「終了状態」）→ラムダ 遷移→ 「メインメニュー」→“データ一覧” を選 択→「データ一覧 」→
ラムダ遷移 →「メインメニュー」→“ 終了”を選 択→「終了状態」

削除

該当エラーメッセージ
データなし

13

11. 本手法の効果と問題点

14

12. 今後の研究方針＜効果＞• 図の流用が可能• 過去のバージョンが利用可能• 仕様とプログラム間の矛盾点の発見• テストの実施や信頼性評価の考察＜問題点＞• 本手法の客観的な有効性の調査• テスト支援システムの試作• 標識コメントの挿入が煩雑• テストモデルの作成が不可能

15163