組み合わせテストケース生成ツール 「PictMaster」 とソフトウェアテストの話題 -62ページ目

制御構造が並列型の場合の制御パステスト

プログラムの制御構造を大きく2つに分けるとしたら、並列型直列型に分けることができます。並列型は条件文が横方向に接続する構造を持ち、直列型は条件文が縦方向に接続する構造を持ちます。

今回は制御構造が並列型の場合の制御パステストについて取り上げます。
並列型の例として以下のソースリストを示します。

リスト1.並列型制御構造のソースリストの例

組み合わせテストツール PictMaster と AllPairII を使う-ソースリスト訂正版


このソースリストをフローチャートで表したものを以下に示します。なお、制約表を用いて制御パステストの制約を記述する場合はフローチャートの作成は不要です。ソースリストからそのまま制約表に記述することができます。ここでは制御構造の特徴を表すためにフローチャートを用いています。

組み合わせテストツール PictMaster と AllPairII を使う-並行型制御パス
図1.並列型制御構造のフローチャートの例

このフローチャートを見ると、制御パステストの命令網羅、条件網羅(真と偽の両方を通る)および経路網羅のいずれの網羅基準を採用してもテストケース数は8個となります。
並列型制御構造では、必要とされるテストケース数は最大でも条件文の数+1となります

リスト1のソースリストをもとに作成したモデルと制約表の例を以下に示します。

組み合わせテストツール PictMaster と AllPairII を使う-モデルと制約表

図2.並列型制御構造のモデルと制約表の例


この制約表は、制約の数を圧縮してあります。「制約対象が次の制約条件となる」というルールで記入しますが、複数の制約を1つにまとめられる場合があります。

生成したテストケースの例を以下に示します。

表1.並列型制御構造のテストケースの例

組み合わせテストツール PictMaster と AllPairII を使う-生成結果

この例では、最少テストケース生成を行なってもテストケース数は常に8個でした。但し、生成エンジンにJennyを指定し最少テストケース生成を300回行なうと7個となりました。これはあきらかに必要なテストケースが1個欠落しています。PICTでは300回行なっても常に8個でした。

どうもJennyはバグの可能性が付きまとうようで生成エンジンとしては使用を控えた方がよさそうです。

ループ回数に最小値、最大値、ループ回数オーバを指定した制御パステストの例

制御パステストで従来から問題になっていたのはプログラムがループを含む場合の扱いでした。単純に制御パスをカバーしようとするとループ回数によっては膨大な制御パスが発生してしまいます。

All-Pair法を適用した制御パステストでは、ループ回数に同値分割・境界値分析の考え方を導入し、実質上のループ回数を大きく削減することができます。

ループ回数に最小値、最大値、ループ回数オーバの3つの条件を指定した制御パステストの例を挙げてみます。

ソースリストを以下に示します。この処理内容に意味はありません。制御パスに関係する条件文やFor文を多く取り入れ、生成される制御パステストのテストケースを検証するためのものです。

リスト1.ループ検証用プログラム

組み合わせテストツール PictMaster と AllPairII を使う-ソースリスト

このプログラムの制御パステスト用に内容を記入したツールAllPairIIの記入内容の一部を以下に示します。

図1.ツールの記入内容

組み合わせテストツール PictMaster と AllPairII を使う-モデルと制約表の一部

ツールによって生成された制御パステストのテストケースを以下に示します。

表1.制御パステスト用テストケースの例

組み合わせテストツール PictMaster と AllPairII を使う-生成結果の一例

今回の例では最少テストケース生成の結果、テストケース数は13個となりました。プログラム中の変数「flag」の値により、パスが正しく通るように考慮してあります。No.1のテストケースは生成エンジンの制限事項に合わせるために追加したもので特に意味はありません。

今回の例でも、最少テストケース生成を行なうと、生成数は一定ではありませんでした。一定した回数にならなくとも、生成されたテストケースは正しいようなので問題はないのかもしれません。

まだまだ調査の余地がありそうです。

今回のプログラムでは、PICTでも高速にテストケースの生成ができました。Jennyでの生成結果も問題ないようです。

今回の内容を記述したAllPairIIを以下のリンク先を保存することでダウンロードすることができます。

ループ回数別制御パステスト用ツールの記入例

このツールを実行するには、リリースされている正式なAllPairIIまたはPictMasterもダウンロードしてください。AllPairIIにJennyが同梱されています。またPICTのインストール方法も説明されています。

制御パステストにAll-Pair法を適用する上での制限事項について

1月8日の記事で大きなコンポーネントの制御パステストにAll-Pair法を適用する事例を紹介しましたが、ツールの処理能力上の制限から、正しいテストケースが得られていないことが分かりました。具体的には生成エンジンのJennyの処理能力をオーバーする多くのパラメータを持つコンポーネントだったようだと言うことです。

適用事例で示したコンポーネントの条件文の数では、Jennyの動作が不安定になるようです。症状としては、制約表が正しいにも関わらず、「組み合わせに現れない値がある」というエラーが表示されたり、テストケースが生成されても網羅されない値があったりします。

これらの症状は対象のパラメータ数がJennyにとって多すぎることが考えられます。事実、パラメータの少ない対象の場合は正常に処理されています。一方、PICTの場合はパラメータ数が多くても動作が不安定になることはありませんが、処理時間が非常にかかります。パラメータの「Next」を削除して1回の生成時間を30秒程度までには短縮できましたが、傾向としてはJennyよりはるかに処理時間がかかります。

1月8日の適用事例では、PICTで最少テストケース生成を行なうと、初期条件値によってテストケース数が異なる結果となります。本来、制約表の記述に間違いがなく完全であれば、初期条件値が変わっても同一のテストケース数になるはずです。1月8日の適用事例の制約表でいくつかの間違いを修正してみたのですが、まだテストケース数が一定しません。

ツールの処理能力が充分であればいろいろチェックができるのですが、このパラメータ数のコンポーネントでは難しいようです。

以上のことから、現状のツールでは適用できるパラメータ数に制限があることをお知らせします。

大きなコンポーネントの制御パステストにAll-Pair法を適用する

制御パステストにAll-Pair法を適用する事例を何回か取り上げてきましたが、今回はより大きく複雑なコンポーネントの制御パステストにAll-Pair法を適用してみました。

適用したプログラムはAllPairIIのプロシージャである「値一致チェック」です。これは制約表に記入された値の未定義チェック、値の前に付加されることのある演算子の妥当性チェックを行ない、エラーを検出した場合はエラーメッセージを表示しプログラムの実行を停止します。全体で90ステップあり、For文や分岐文が多数存在します。プログラムはVBAで書かれています。

ソースリストを以下に示します。

リスト1.「値一致チェック」プロシージャのソースリスト

組み合わせテストツール PictMaster と AllPairII を使う-ソースリスト


このプログラムの制御パステストのテストケースを生成するモデルと制約表の一部を以下に示します。

表1.モデルと制約表
組み合わせテストツール PictMaster と AllPairII を使う-モデル訂正

組み合わせテストツール PictMaster と AllPairII を使う-制約表訂正

パラメータ名の数字はソースリストの行番号、そのあとの英字は制御パスに影響するIf文やFor文を示しています。以上のモデルと制約表はソースリストを見ながら記入することができます。自分が書いたプログラムなら内容を理解しているはずだからです。フローチャートを作成する必要はありません。今回のように大きく複雑な場合は時間がかかるかもしれませんがそのうち慣れるでしょう。

プログラムが複雑で大きいため、制約の数は40となりました。PictMasterの最大数である30を超えるため、AllPairIIを使用しています。使用する生成エンジンはJennyがよいでしょう。このくらいの規模になるとPICTでは生成時間がかかりすぎて実用的でないからです。

制御パステストでのパラメータはプログラムの制御パスに影響を及ぼす、If文、Else文、For文、Next文、Exit文、End文(プログラムを停止するコマンド)などが対象となります。パラメータの値はIf文なら真となる条件、偽となる条件、If文がElseを持たない場合は偽となる場合を表すためにOtherなどの文を用います。For文などのループの場合は、ループ回数の最小値、最大値などを値として使用します。これはループ回数に同値分割・境界値分析の考え方を適用し、制御パスの爆発を防ぐものです。For文に値として最小値、最大値を採用すると全体のテストケース数が多くなりすぎる場合は値として単に「For」のみとする場合もあります。この場合はテスト実施時にループ回数を決めることになります。

ただし、ここで述べたことは私の方法を述べただけであり、もっと他によりよい記述方法があるかもしれません。言い換えると、制約表への記述内容には色々なバリエーションが考えられるということです。これは生成したテストケースの分かりやすさ(パラメータと値の名称の分かりやすさ)と制約表への記入のしやすさとのトレードオフの問題でもあります。

生成した制御パステストのテストケースを以下に示します。

表2.制御パステストのテストケースの例

組み合わせテストツール PictMaster と AllPairII を使う-生成結果

組み合わせテストツール PictMaster と AllPairII を使う-生成結果2


このテストケースには最後の部分が含まれていません。このテストケースでは21個のテストとなりました。テストケースは一例であり、ほとんどの場合この例とは内容が異なります。
このテストケースではFor文のループ回数は明記していません

以上、掲載したモデルと制約表は一部分ですが、以下のURIから全体をダウンロードすることができます。リンク先を保存することでダウンロードできます。

All-PairII 制御パステスト

All-PairII 制御パステストのテストケースの一例

「All-PairII 制御パステスト」を実行するには生成エンジンの「Jenny」をインストールしておく必要があります。AllPairIIをダウンロードされていない方は、リリースされているAllPairIIをダウンロードして「Jenny」をインストールして下さい。

制御パステストにAll-Pair法を適用すると条件網羅のテストケースが得られますが、単なる条件網羅と異なり、2パラメータ間の組み合わせを網羅したものとなるため、通常の条件網羅よりテストケース数は若干多くなります。例えばIF文が2個連続した場合と、10個連続した場合、通常の条件網羅ではテストケース数はどちらも2個ですが、All-Pair法による場合は当然ながら10個連続した場合、テストケース数は2個連続した場合(4個)より多い数(8個)になります。これが経路網羅では2の10乗となり、1024個のテストケースとなります。

All-Pair法を適用した場合の制御パステストの分類では、「深い条件網羅」とでも言えるものとなります。その深さは採用する値の数で調節することができます。制御パステストの3つの大分類に1つ新しく追加したくなります。

状態遷移テストへのAll-Pair法の適用(その2)

状態遷移テストへのAll-Pair法の適用については、2008年12月14日 の記事で1回取り上げました。そのときの方法は、状態の往復を表すのに状態図を展開する方法でした。しかしこの方法では複雑な状態遷移図には適用できません。今回は、状態遷移図を展開することなく、状態間の往復を網羅する方法を説明します。

状態遷移図を図1に示します。この状態遷移図では状態間を自由に往復できるようになっています。状態遷移はs0から始まり、s0に戻ることで終了するものとします。この状態遷移図で遷移可能なすべてのルートをAll-Pair法を用いて網羅することができます。

組み合わせテストツール PictMaster と AllPairII を使う-状態遷移図
図1.状態遷移図

すべての遷移ルートを網羅するといっても限度がありますので、網羅する条件として状態 s1 を最大3回まで通るすべての遷移ルートを網羅することにします。s1を最大何回まで通るようにするかは、パラメータとして取り上げる状態の数で調整することができます。
この条件でのモデルと制約表を以下に示します。ここで値はイベントと次の遷移先を表しています。

組み合わせテストツール PictMaster と AllPairII を使う-モデルと制約表

図2.モデルと制約表

例によって制約表の記入方法は、制約対象が次の制約で制約条件となる、という単純なルールに基づいて機械的に記入することができます。こうして生成された組み合わせ結果を表1に示します。

表1.状態s1を最大3回通る状態遷移ルート


生成結果のNo.1は1つのパラメータに値は2つ以上必要という生成エンジンの制限に合わせるためで特に意味はありません。その結果、状態s1を最大3回通る遷移ルートは13通りという結果となりました。この程度なら実際にルートを追ってみて確かめることができるのではないでしょうか。

それでは、また。