以下、図面を参照して、開示の技術の実施形態の一例を詳細に説明する。
(第1実施形態)
ソフトウエア開発において、シンボリック実行(symbolic execution)技術を利用して、被検査プログラムの動作を検証する手法がある。
シンボリック実行技術とは、被検査プログラムに含まれる変数に具体的な数値を代入する代わりに、数値を代表するシンボル値を代入することで被検査プログラムを疑似的に実行し、被検査プログラムの実行結果を評価する技術である。
そこで、まず被検査プログラムのシンボリック実行について簡単に説明する。
図1は、一例としてCOBOL言語で記述された被検査プログラムを示した図である。なお、以降、被検査プログラムを例示する場合、COBOL言語で記述された被検査プログラムを示すものとするが、被検査プログラムがCOBOL言語以外の他のプログラム言語で記述されていてもよいことは言うまでもない。
図1の13行目のIF文は、変数である性別が‘男性’の場合には15行目に処理を分岐させ、性別が‘男性’でない場合には17行目に処理を分岐させる、条件分岐命令の一例である。
また、図1に示した被検査プログラムには、19行目にもIF文が記述されており、19行目のIF文では、性別が‘女性’の場合には21行目に処理を分岐させ、性別が‘女性’ではない場合には23行目に処理を分岐させる。
図2は、図1の被検査プログラムをフローチャートで示した図である。
このような被検査プログラムに対してシンボリック実行を行うと、変数である性別の値は、被検査プログラムの外部から与えられるため、シンボリック実行の際には不定であり、変数である性別の値はシンボル値として指定される。なお、このように、シンボリック実行の際、シンボル値に置き換えられる変数を外部変数という。
そして、シンボリック実行の結果、図3に示すような実行可能なパス1、パス2、及びパス3を含む3個のパス、及びパス毎のパス条件が抽出される。ここで、パス条件とは、パスが終了するまでに経由する条件分岐のうち、シンボル値を含む全ての条件を積(AND条件:以下、記号∧で表示する)で連結した条件である。換言すれば、パス条件とは、パスに含まれる条件分岐を通過する際に満たすべき論理的な制約ということができる。また、パスが実行可能とは、パス条件が充足可能であることをいう。
パス1は、図2のステップS10、ステップS12、ステップS16、及びステップS20を経由するパスであり、パス2は、図2のステップS10、ステップS14、ステップS16、及びステップS18を経由するパスである。更に、パス3は、図2のステップS10、ステップS14、ステップS16、及びステップS20を経由するパスである。
パス1、パス2、及びパス3の各々のパス条件は、論理的に成立するため、充足可能である。なお、パス条件において、‘!’はNOT条件を表す。すなわち、‘!=’は右辺と左辺がイコールでないことを表している。
一方、パス4は、図2のステップS10、ステップS12、ステップS16、及びステップS18を経由するパスであるが、この際、パス4のパス条件は、(性別=男性)∧(性別=女性)となる。従って、パス4のパス条件は論理的に成立しない。すなわち、パス4のパス条件は充足可能でないためパス4は実行可能と判定されず、パスとして抽出されない。
なお、パス条件の充足可能性の判定には、例えばSAT(satisfiability)、又はSMT(satisfiabilitymodulo theory)ソルバ等の制約ソルバが利用される。
このようにしてシンボリック実行により抽出された実行可能なパスの各々がテストケースとして生成され、パス毎のパス条件を充足する外部変数の値が、各テストケースに対応した被検査プログラムのテストデータとなる。
シンボリック実行におけるパス探索のアルゴリズムとして、パス網羅を実現するパス抽出法の1つである、深さ優先探索アルゴリズムが用いられることがある。
深さ優先探索アルゴリズムは、被検査プログラムの開始点から終了点に向かって1つのパスを探索した後、探索したパス上をパスの分岐点がある地点まで遡り、当該分岐点でまだ選択されていない分岐先の経路を順次辿ることを繰り返すアルゴリズムである。
シンボリック実行では、深さ優先探索アルゴリズムにより探索されたパスに対応するパス条件に対して、既に説明した制約ソルバを用いてパスの充足可能性を判定し、実行可能なパスを抽出する。
しかし、シンボリック実行時のパスの探索に深さ優先探索アルゴリズムを用いた場合、抽出されるパスの個数が、現実的には処理しきれない程度の膨大な数になる、所謂パス爆発が発生することがある。
パス爆発が発生する原因としては、以下の2つの場合が考えられる。
パス爆発の1つ目の原因は、被検査プログラムの実行しうるパスの個数が無限にある場合である。例えば、被検査プログラムに繰り返し処理が含まれ、且つ、繰り返し終了条件にシンボル値が含まれる場合がこのケースに相当する。
例えば、図4に示した被検査プログラムは、10行目から14行目にかけて繰り返し処理が含まれており、繰り返し処理を実行する度に、カウンタ変数の値を1ずつ増加させ、カウンタ変数の値が閾値変数より大きくなった場合に、繰り返し処理を終了する。
ここで、閾値変数は外部変数であるため、シンボリック実行の際、シンボル値として実行される。すなわち、シンボリック実行の際には閾値変数の値が不定となることから、繰り返し処理を継続するパスが常に存在し、パスの個数が無限となる。
また、図5に示した被検査プログラムは、15行目に実行先を外部処理に分岐させるPERFORM文を含んでおり、16行目に、外部処理に含まれるCALL文の戻り値に従って実行先を決定する条件分岐を含んでいる。なお、外部処理はサブルーチンとも称される場合がある。
16行目の条件分岐では、戻り値が0の場合に外部処理を再帰呼び出しするため、CALL文の戻り値がシンボル値である場合、CALL文の戻り値が不定となることから、再帰呼び出し処理を継続するパスが常に存在し、パスの個数が無限となる。
パス爆発の2つ目の原因は、シンボリック実行におけるパス抽出の際、パス抽出に要する分析時間が現実的な時間を超過したり、パス抽出に要するメモリ量が、コンピュータに実装されているメモリ量を超過したりする場合である。例えば、被検査プログラムに、条件分岐命令が連続して多用されている場合がこのケースに相当する。
ここで、パス抽出に要する分析時間が現実的な時間を超過するとは、例えば、被検査プログラムに含まれるパスを抽出し終えるまでに要する時間が、予め予定された被検査プログラムの動作検証工程期間内に収まらない場合等をいう。
例えば、図6に示した被検査プログラムは、独立したIF文を20個含んでいる。このような独立したIF文がN個連続する場合、パス数は2のN乗個となり、図6の例では2の20乗個、すなわち1048576個のパスが被検査プログラムから抽出される。
一例として、コンピュータに実装されているメモリ量が1GB(ギガバイト)である場合、独立したIF文を15個含む被検査プログラムのパスを抽出することができる。しかし、独立したIF文を16個含む被検査プログラムのパスを抽出しようとすると、メモリ不足が発生し、被検査プログラムからパスを抽出できない。
この場合、コンピュータに実装するメモリ量を6倍の6GBに増設しても、独立したIF文を18個含む被検査プログラムのパスまでしか抽出することができない。この例からもわかるように、独立したIF文が連続することで、容易にパス爆発が発生することが理解される。
そこで、シンボリック実行におけるパス爆発を防止するパス抽出法として、深さ優先探索アルゴリズムに代表されるパス網羅より抽出パス数が抑制される分岐網羅、命令網羅等が用いられる場合がある。なお、命令網羅とは、被検査プログラムに含まれる全ての命令を実行するパス集合を抽出するパス抽出法である。
従来のパス爆発を防止するパス抽出法として、例えば、分岐ランダム探索方式、制御フローグラフ(Control Flow Graph:CFG)を利用する方式、及びDART等が存在する。
分岐ランダム探索方式とは、シンボリック実行で到達した条件分岐が分岐可能ならば、分岐先をランダムに選択して被検査プログラムからパスを抽出する方法である。CFGを利用する方式とは、まず、シンボリック実行する際に通過する可能性のある被検査プログラムの全経路をグラフで表した、所謂CFGを生成する。そして、生成したCFG上の未通過の命令文にシンボリック実行ラインが到達するように条件分岐の重み付けを行い、条件分岐の分岐先を、分岐条件の重み付けに基づいて決定する方法である。
また、DARTとは、分岐ランダム探索方式の改良版であり、まず、外部変数に具体的な値をランダムに設定した上で被検査プログラムを実行し、当該パス上のパス条件を収集する。次に、収集したパス条件から、既に通過したパスと異なるパスを通過する値を生成して、被検査プログラムから順次パスを抽出する。
以下に、図6に示した被検査プログラムから、DARTを用いてパスを抽出する例について説明する。
手順A:項目1〜項目20の各々の外部変数の値を、仮に‘1’として設定する。
手順B:項目1〜項目20の各々の外部変数の値によりパス条件を収集する。例えば、手順Aで設定した外部変数値を用いた場合、「(項目1=1)∧(項目2=1)∧・・・∧(項目20=1)」のパス条件が収集される。
手順C:次に、手順Bで収集したパス条件の一部を否定したパス条件、例えば「!(項目1=1)∧(項目2=1)∧・・・∧(項目20=1)」を作成し、パス条件を充足する値を導き出す。本例の場合、例えば、項目1=‘2’、項目2〜項目20=‘1’の値が得られる。
以降、パス抽出に関する終了条件、例えば分岐網羅を満たすまで手順B及び手順Cを繰り返し、被検査プログラムからパスを抽出する。
しかしながら、分岐ランダム探索方式、CFGを利用する方式、及びDARTには、以下に示すような問題点が存在する。
分岐ランダム探索方式では、条件分岐の分岐先をランダムに選択するため、未通過の分岐先を意図的に選択することができない。従って、分岐網羅を実現するテストケースを得ようとした場合、パス探索の繰り返し回数が増大する上、被検査プログラムから抽出されるパス数も偶然性に左右されるという問題点が存在する。
CFGを利用する方式では、被検査プログラムを静的解析して、被検査プログラムに含まれる全経路を予めグラフ化した上で、更に、条件分岐の重み付けを実施する必要がある。従って、1つのパスに数十程度の条件分岐が含まれるような大規模な被検査プログラムへCFGを利用する方法を適用した場合、被検査プログラムの静的解析に要する計算量が増大し、計算時間及びメモリ量等の制約から適用困難となる場合がある。
また、DARTでは、分岐網羅を実現するパス集合を生成する際、分岐網羅を実現する最小のパス集合に比べて、より多くのパスを含んだパス集合を生成してしまうという問題点が存在する。
例えば、既に説明したように、DARTによって図6に示した被検査プログラムからパスを抽出する場合、まず、手順Aで収集したパス条件に対応したパスが1つ抽出される。そして、手順Aで収集したパス条件に対して、(項目1=1)から(項目20=1)までの各分岐条件を順次否定しながら20個のパスを抽出することから、手順Aで抽出したパスと合わせて、合計21個のパスが抽出されることになる。
しかし、図6に示した被検査プログラムの場合、例えば、各条件分岐において全てTHEN側に分岐するパスと、全てELSE側に分岐するパスとの2つのパスで分岐網羅を実現することができるため、分岐網羅を実現する最小のパス数は2となる。
一方、開示の技術は、従来の分岐網羅に用いられるパス抽出法と比較して、より少数のパスで分岐網羅度を向上させることができるパス集合を被検査プログラムから抽出する。
図7には、本実施の形態に係るテストケース生成装置10が示されている。テストケース生成装置10は、入力部12、シンボリック実行部14、制御部16、深さ優先探索部18、管理部20、選択部22、生成部24、検出部26、及び出力部28を含む。
テストケース生成装置10は、シンボリック実行技術により被検査プログラム30を実行し、被検査プログラム30の動作を検証するためのテストケース32を生成するための装置である。
入力部12は、被検査プログラム30を受け付け、被検査プログラム30をテストケース生成装置10内部に取り込む。
シンボリック実行部14は、入力部12を介して受け付けた被検査プログラム30に含まれる外部変数に具体的な値を設定する代わりにシンボル値を設定する。そして、外部変数をシンボル値としたまま、制御部16によって探索された被検査プログラム30に含まれるパスを模擬的に実行し、被検査プログラム30からパスを抽出する。そして、実行したパス毎にパス条件を抽出し、1つのパスと当該パスに対応したパス条件の組み合わせを1つのテストケースとして、複数のテストケースを生成する。また、各テストケースのパス条件を充足する外部変数の値を生成し、テストケースに対応した被検査プログラム30のテストデータとする。
制御部16は、シンボリック実行の際に、後述する深さ優先探索部18、管理部20、選択部22、生成部24、及び検出部26の各機能部を制御して、被検査プログラム30に含まれるパスの探索を実行する。そして、制御部16は、探索したパスをシンボリック実行部14に引き渡す。
深さ優先探索部18は、深さ優先探索アルゴリズムに基づいて、被検査プログラム30から網羅的にパスを探索する。
図8は、深さ優先探索部18において実行される、図6に示した被検査プログラムのパス探索のアルゴリズムを説明した図である。
任意のパス1が探索されると、パス1終点から(項目20=1)の分岐点まで遡り、未選択の分岐側を選択してパス2を探索する。次に、パス2終点から未選択の分岐先を有する分岐点、この場合(項目19=1)の分岐点まで遡り、未選択の分岐側を選択してパス3を探索する。以後、同様の処理を繰り返して、被検査プログラム30に含まれるパスを網羅的に探索する。
なお、深さ優先探索部18は、被検査プログラム30からパスを網羅的に探索する場合に制御部16によって呼び出される機能部であり、テストケース生成装置10が分岐網羅によるパス抽出を実行する場合には、必須の機能部ではない。
管理部20は、制御部16によって探索されたパスの実行順に基づいて、被検査プログラム30に含まれる条件分岐毎に、分岐先への分岐実行回数を管理する。以下では、管理部20の機能について詳細に説明する。
図9は、本実施の形態に係る被検査プログラム30の一例を示した図である。図9に示した被検査プログラム30には、条件分岐命令であるIF文が13行目、19行目、及び25行目の合計3箇所に存在する。また、16行目、20行目、26行目、及び36行目に、被検査プログラム30の終了を意味する「EXIT PROGRAM」が存在する。
図10は、図9に示した被検査プログラム30をフローチャートで示した図である。ステップS30、ステップS34、及びステップS38の各処理が、それぞれ図9の被検査プログラム30の13行目、19行目、及び25行目の条件分岐に対応する。また、ステップS32、ステップS36、及びステップS40の各処理が、それぞれ図9の被検査プログラム30の14行目、22行目、及び28行目の処理に対応する。
図11は、管理部20で実行される、図9に示した被検査プログラム30の管理内容を示した図である。まず、管理部20は、被検査プログラム30から条件分岐命令であるIF文を取得する。そして、管理部20は、制御部16によって初めて被検査プログラム30のパス探索が開始される前の状態、すなわち初期状態において、各IF文の分岐実行回数を、例えば「直接=(0、0)」のように初期化する。ここで、「直接」とは、対応するIF文がPERFORM文等で呼び出される外部処理のIF文として実行されるものではないことを意味している。また、(0、0)とは、並び順に、IF文におけるTHEN側の分岐実行回数、ELSE側の分岐実行回数を表している。
例えば、制御部16によって、図10に示すステップS30→ステップS32→ステップS34→エンドで表されるパスが探索されたとする。この場合、13行目のIF文ではTHEN側の分岐(THEN分岐)が選択されたため、IF文(13行目)のTHEN側の分岐実行回数を1増やして、「直接=(1、0)」とする。また、19行目のIF文でもTHEN分岐が選択されたため、IF文(19行目)の分岐実行回数を、「直接=(1、0)」とする。
次に、制御部16によって、例えば、ステップS30→エンドで表されるパスが探索されたとする。この場合、13行目のIF文ではELSE側の分岐(ELSE分岐)が選択されたため、IF文(13行目)のELSE側の分岐実行回数を1増やして、「直接=(1、1)」とする。
引き続き、制御部16によって、例えば、ステップS30→ステップS32→ステップS34→ステップS36→ステップS38→エンドで表されるパスが探索されたとする。この場合、上記と同様の方法により、IF文(13行目)の分岐実行回数を「直接=(2、1)」、IF文(19行目)の分岐実行回数を「直接=(1、1)」、IF文(25行目)の分岐実行回数を「直接=(1、0)」とする。
以下、制御部16によってパスが探索される度に、上記に説明した方法に従って、探索されたパスによって実行されたIF文の分岐実行回数を更新する。
なお、条件分岐命令には、IF文の他に、複数の異なる処理の中から条件に合った処理を選択するEVALUATE文のような多分岐命令も含まれる。
図12は、EVALUATE文が含まれる被検査プログラム30の例を示した図である。
図12に示した被検査プログラム30には、12行目及び23行目に2つのEVALUATE文が含まれている。
管理部20は初期状態において、12行目のEVALUATE文の分岐実行回数を、例えば「直接=(0、0、0、0)」のように初期化する。ここで(0、0、0、0)とは、並び順に、変数1が‘A’の場合の分岐実行回数、変数1が‘B’の場合の分岐実行回数、変数1が‘C’の場合の分岐実行回数、変数1が‘A’、‘B’、‘C’の何れの場合にも該当しない場合の分岐実行回数を表している。
また、管理部20は初期化状態において、23行目のEVALUATE文の分岐実行回数を、例えば「直接=(0、0、0)」のように初期化する。
そして、管理部20は、IF文における分岐実行回数の管理と同様に、EVALUATE文の分岐実行回数を管理する。例えば制御部16によって、14行目及び25行目のDISPLAY文を実行するパスが探索された場合、EVALUATE文(12行目)の分岐実行回数は、「直接=(1、0、0、0)」となる。また、EVALUATE文(23行目)の分岐実行回数は、「直接=(1、0、0)」となる。
選択部22は、制御部16が被検査プログラム30からパスを探索する際に、制御部16から呼び出される機能部であり、パスが条件分岐に到達する毎に予め定めたパス選択規則に従って、分岐先を選択する。ここで、パス選択規則とは、条件分岐における分岐先を選択するための規則である。
パス選択規則の一例として、例えば、選択部22は、パス上の条件分岐命令が分岐可能である場合に、管理部20によって管理される条件分岐毎の分岐実行回数に基づいて、分岐実行回数が少ない方の分岐を選択する。なお、条件分岐の分岐実行回数が同数である場合には、予め定めた選択規則に従って、分岐先を選択する。
ここで、予め定めた選択規則とは、例えば条件分岐命令における最初の分岐を選択する等の規則をいう。具体的には、一例として、IF文の分岐実行回数が同数である場合、THEN分岐を選択する。なお、予め定めた選択規則はこれに限定されるものではなく、例えば、ELSE分岐を選択するようにしてもよい。
また、条件分岐命令が分岐可能とは、条件分岐命令における各々の分岐の分岐条件が、共に充足可能である状態をいう。
例えば、図9に示した被検査プログラム30の13行目のIF文は、(項目1=1)か否かが分岐条件となる。この場合、THEN分岐は分岐条件:(項目1=1)がTRUEの場合に選択される。一方、ELSE分岐は分岐条件:(項目1=1)がFALSEの場合に選択されるが、これは、分岐条件:!(項目1=1)がTRUEの場合に選択されると解釈することができる。
分岐条件に含まれる変数:項目1は外部変数であるため、図9に示した被検査プログラム30単体でシンボリック実行した場合には、変数:項目1はシンボル値に置き換えられる。従って、分岐条件:(項目1=1)の真偽値を確定することができない。
そこで選択部22は、THEN分岐の分岐条件:(項目1=1)、及びELSE分岐の分岐条件:!(項目1=1)の充足可能性を判断する。この場合、THEN分岐の分岐条件とELSE分岐の分岐条件は共に充足可能であることから、選択部22は、図9に示した被検査プログラム30の13行目のIF文を分岐可能と判定し、THEN分岐とELSE分岐の2つの分岐の中から分岐先を選択する。
図13は、選択部22において、既に説明したパス選択規則のみに従って、図9に示した被検査プログラム30から探索されたパスの一例を示した図である。
図11に示したように、1回目のパス探索前では、管理部20によって管理される条件分岐毎の分岐実行回数は初期状態にある。
従って、1回目のパス探索では、IF文(13行目)は分岐可能であり、且つ、分岐実行回数が(0、0)であることから、THEN分岐が選択される。そして、IF文(19行目)も分岐可能であり、且つ、分岐実行回数が(0、0)であることから、THEN分岐が選択され、図10におけるステップS30→ステップS32→ステップS34→エンドで表されるパス1が選択される。
次いで、2回目のパス探索では、IF文(13行目)の分岐実行回数が管理部20によって(1、0)に更新されていることから、分岐実行回数がより少ないELSE分岐が選択され、図10におけるステップS30→エンドで表されるパス2が選択される。
次いで、3回目のパス探索では、IF文(13行目)の分岐実行回数が管理部20によって(1、1)に更新されていることから、THEN分岐が選択される。そして、IF文(19行目)の分岐実行回数も管理部20によって(1、0)に更新されていることから、分岐実行回数がより少ないELSE分岐が選択される。そして、IF文(25行目)の分岐実行回数は初期状態のまま(0、0)であることから、THEN分岐が選択され、図10におけるステップS30→ステップS32→ステップS34→ステップS36→ステップS38→エンドで表されるパス3が選択される。
以降、分岐網羅が実現されるまで、選択部22において同様のパス選択規則を繰り返すことで、図13におけるパス1からパス7までの7個のパスが選択される。
生成部24は、選択部22によって選択された被検査プログラム30のパスに対して、既に選択部22によって選択されたパス(既出パス)であることを示すための、パスの重複を検出するためのルール(重複パス検出ルール)を生成する。
図14は、図9に示した被検査プログラム30を例にして、生成部24における重複パス検出ルールの生成方法の一例を示した図である。
生成部24は、後述する検出部26により生成される優先分岐番号と、選択部22でパス選択規則に従って選択されたパスと、に基づいて、重複パス検出ルールを生成する。ここで、優先分岐番号とは、選択部22がパス選択規則に従った場合に、次に選択される条件分岐毎の分岐先を表す番号である。
図14に示すように、初期状態では管理部20によって管理される全ての条件分岐の分岐実行回数は(0、0)となるため、条件分岐の各々では、パス選択規則に基づいてTHEN分岐が選択されることになる。従って、例えばTHEN分岐を‘0’、ELSE分岐を‘1’で表した場合、検出部26では、IF文(13行目)、IF文(19行目)、IF文(25行目)の各々の条件分岐の分岐先を‘0’に設定した優先分岐番号を生成する。
一方、シンボリック実行部14によって、選択部22で選択されたパスに沿ってシンボリック実行が行われ、被検査プログラム30からパスが抽出されると、管理部20によって管理される条件分岐毎の分岐実行回数が、抽出されたパスの実行に伴い更新される。
生成部24は、抽出されたパスによって被検査プログラム30の分岐網羅度が向上した場合に、抽出されたパスによって実行された条件分岐に対応した優先分岐番号を重複パス検出ルールとして生成する。
例えば、生成部24は、図14において、1回目のシンボリック実行により図13に示すパス1が抽出された場合、「優先分岐番号が{(IF文(13行目)=0)∧(IF文(19行目)=0)}ならば、パス1と重複する」というルール1を生成する。
図14では、説明を簡略化するため、例えば、被検査プログラム30に含まれる各々の条件分岐に対応した優先分岐番号のうち、何れの優先分岐番号が重複パス検出ルールに適用されるのかを示す識別子‘*’を優先分岐番号に対応した判定欄に付与している。
1回目のシンボリック実行後、検出部26は、管理部20によって管理される条件分岐毎の分岐実行回数に基づいて、優先分岐番号を生成する。1回目のシンボリック実行後、IF文毎の分岐実行回数は図14に示すように、{(1、0)、(1、0)、(0、0)}となる。ここで、1番目の小括弧はIF文(13行目)の分岐実行回数、2番目の小括弧はIF文(19行目)の分岐実行回数、3番目の小括弧はIF文(25行目)の分岐実行回数を表す。
従って、パス選択規則に基づいて、1回目のシンボリック実行後に生成される優先分岐番号は(1、1、0)となる。ここで、1番目の数値はIF文(13行目)の優先分岐番号、2番目の数値はIF文(19行目)の優先分岐番号、3番目の数値はIF文(25行目)の優先分岐番号を表す。
そして生成部24は、2回目のシンボリック実行により図13に示すパス2が抽出された場合、「優先分岐番号が(IF文(13行目)=1)ならば、パス2と重複する」というルール2を生成する。
2回目のシンボリック実行後、管理部20によって管理される条件分岐毎の分岐実行回数は、図14に示すように、{(1、1)、(1、0)、(0、0)}となる。従って、パス選択規則に基づいて、2回目のシンボリック実行後に生成される優先分岐番号は、(0、1、0)となる。そして生成部24は、3回目のシンボリック実行により図13に示すパス3が抽出された場合、「優先分岐番号が{(IF文(13行目)=0)∧(IF文(19行目)=1)∧(IF文(25行目)=0)}ならば、パス3と重複する」というルール3を生成する。
以降、同様の処理に従って、生成部24は、シンボリック実行によるパスの抽出が終了するまで、重複パス検出ルールを生成する。なお、優先分岐番号は、分岐情報の一例である。
既に説明したように、選択部22でパス選択規則のみに従って図9に示した被検査プログラム30からパスの選択をした場合、例えば、図13に示すような分岐網羅を実現する7つのパスが選択される場合がある。
しかし、この場合、パス4及びパス6はパス2と重複したパスであり、パス5はパス1と重複したパスである。従って、パス4、パス6、及びパス5に基づいたシンボリック実行から新たなテストケースが生成されることはなく、テストケースの生成時間が無駄になるばかりか、被検査プログラム30の品質向上に寄与しない重複したテストケースが生成されることになる。
従って、検出部26は、管理部20によって管理される条件分岐毎の分岐実行回数に基づき、パス探索前にパス選択規則に従って優先分岐番号を生成し、優先分岐番号によって表されるパス候補を取得する。そして、検出部26は、選択部22によるパスの選択前に、パス候補に対応した優先分岐番号と、生成部24で生成された重複パス検出ルールとを比較して、次のシンボリック実行により抽出される予定のパスが、既出パスと一致するか否かを検出する。
図15及び図16は、図9に示した被検査プログラム30に対する検出部26の処理を示した図である。
検出部26は、初期状態における条件分岐毎の分岐実行回数に基づいて、パス選択規則に従い、優先分岐番号を生成する。この際に生成される優先分岐番号は(0、0、0)となる。そして、検出部26は、生成された優先分岐番号と、生成部24によって生成された重複パス検出ルールとを比較して、重複パス検出ルールの中に、生成された優先分岐番号によって表されるパス候補と重複するルールが存在するか否かを判定する。
そして、検出部26は、生成された優先分岐番号によって表されるパス候補と重複するルールが存在する場合には、シンボリック実行部14でのシンボリック実行によるパス抽出処理が行われないようにする。一方、検出部26は、生成された優先分岐番号によって表されるパス候補と重複するルールが存在しない場合には、シンボリック実行部14でのシンボリック実行によるパス抽出処理が行われるようにする。
具体的には、テストケース生成装置10が初期状態の場合、まだ重複パス検出ルールが存在しないため、選択部22において図13のパス1が選択され、生成部24においてパス1に対応した重複パス検出ルール:ルール1が生成される。
1回目の重複パス検出処理後、管理部20によって管理される条件分岐毎の分岐実行回数は、図15に示すように、{(1、0)、(1、0)、(0、0)}となる。従って、次に検出部26によって生成される優先分岐番号は、(1、1、0)となる。この場合、重複パス検出ルールにはルール1しか存在しないため、生成された優先分岐番号によって表されるパス候補と重複するルールは存在しない。従って、選択部22において図13のパス2が選択され、生成部24においてパス2に対応した重複パス検出ルール:ルール2が生成される。
2回目の重複パス検出処理後、管理部20によって管理される条件分岐毎の分岐実行回数は、図15に示すように、{(1、1)、(1、0)、(0、0)}となる。従って、次に検出部26によって生成される優先分岐番号は、(0、1、0)となる。この場合、重複パス検出ルールにはルール1及びルール2が存在するが、生成された優先分岐番号によって表されるパス候補と重複するルールは存在しない。従って、選択部22において図13のパス3が選択され、生成部24においてパス3に対応した重複パス検出ルール:ルール3が生成される。
3回目の重複パス検出処理後、管理部20によって管理される条件分岐毎の分岐実行回数は、図15に示すように、{(2、1)、(1、1)、(1、0)}となる。従って、次に検出部26によって生成される優先分岐番号は、(1、0、1)となる。この場合、重複パス検出ルールにはルール1、ルール2、及びルール3が存在し、生成された優先分岐番号によって表されるパス候補とルール2が一致する。従って、重複パス検出ルールと一致するパス候補に従ったシンボリック実行によるパス抽出処理が省略される。具体的には、選択部22におけるパスの選択処理、及び生成部24における重複パス検出ルールの生成処理が省略される。ただし、生成された優先分岐番号によって表されるパス候補と、重複パス検出ルールとが一致した場合であっても、管理部20は、パス候補の生成に伴って、条件分岐毎の分岐実行回数を更新する。
4回目の重複パス検出処理後、管理部20によって管理される条件分岐毎の分岐実行回数は、図16に示すように、{(2、2)、(1、1)、(1、0)}となる。従って、次に検出部26によって生成される優先分岐番号は、(0、0、1)となる。この場合、重複パス検出ルールにはルール1、ルール2、及びルール3が存在し、生成された優先分岐番号によって表されるパス候補とルール1が一致する。従って、重複パス検出ルールと一致するパス候補に従ったシンボリック実行によるパス抽出処理が省略される。
5回目の重複パス検出処理後、管理部20によって管理される条件分岐毎の分岐実行回数は、図16に示すように、{(3、2)、(2、1)、(1、0)}となる。従って、次に検出部26によって生成される優先分岐番号は、(1、1、1)となる。この場合、重複パス検出ルールにはルール1、ルール2、及びルール3が存在し、生成された優先分岐番号によって表されるパス候補とルール2が一致する。従って、重複パス検出ルールと一致するパス候補に従ったシンボリック実行によるパス抽出処理が省略される。
6回目の重複パス検出処理後、管理部20によって管理される条件分岐毎の分岐実行回数は、図16に示すように、{(3、3)、(2、1)、(1、0)}となる。従って、次に検出部26によって生成される優先分岐番号は、(0、1、1)となる。この場合、重複パス検出ルールには、生成された優先分岐番号によって表されるパス候補と重複するルールは存在しない。従って、選択部22において図13のパス7が選択され、生成部24においてパス7に対応した重複パス検出ルール:ルール4が生成される。なお、ルール4は、「優先分岐番号が{(IF文(13行目)=0)∧(IF文(19行目)=1)∧(IF文(25行目)=1)}ならば、パス7と重複する」というルールとなる。
7回目の重複パス検出処理後、管理部20によって管理される条件分岐毎の分岐実行回数は、図16に示すように、{(4、3)、(2、2)、(1、1)}となる。この場合、被検査プログラム30に含まれる条件分岐毎の分岐実行回数の各々が1以上であることから、パス1、パス2、パス3、及びパス7によって分岐網羅が実現されることになる。従って、検出部26は重複パスの検出処理を終了する。
以上に説明したテストケース生成装置10は、例えば、図17に示すコンピュータ40で実現することができる。コンピュータ40は、CPU42、メモリ44、及び不揮発性の記憶部46を含み、これらはバス48を介して互いに接続される。
また、記憶部46はHDD(Hard Disk Drive)又はフラッシュメモリ等によって実現できる。記憶媒体としての記憶部46には、コンピュータ40を被検査プログラム30に対するテストケース生成装置10として機能させるためのテストケース生成プログラム50が記憶されている。CPU42は、テストケース生成プログラム50を記憶部46から読み出してメモリ44に展開し、テストケース生成プログラム50に含まれる各種プロセスを順次実行する。
テストケース生成プログラム50は、シンボリック実行プロセス52、制御プロセス54、管理プロセス56、選択プロセス58、生成プロセス60、検出プロセス62、深さ優先探索プロセス64、入力プロセス66、及び出力プロセス68を含む。
CPU42は、シンボリック実行プロセス52を実行することで、図7に示すシンボリック実行部14として動作する。また、CPU42は、制御プロセス54を実行することで、図7に示す制御部16として動作する。また、CPU42は、管理プロセス56を実行することで、図7に示す管理部20として動作する。また、CPU42は、選択プロセス58を実行することで、図7に示す選択部22として動作する。また、CPU42は、生成プロセス60を実行することで、図7に示す生成部24として動作する。また、CPU42は、検出プロセス62を実行することで、図7に示す検出部26として動作する。また、CPU42は、深さ優先探索プロセス64を実行することで、図7に示す深さ優先探索部18として動作する。また、CPU42は、入力プロセス66を実行することで、図7に示す入力部12として動作する。また、CPU42は、出力プロセス68を実行することで、図7に示す出力部28として動作する。
以上により、テストケース生成プログラム50を実行したコンピュータ40が、テストケース生成装置10として動作する。なお、テストケース生成プログラム50は、開示の技術におけるテストケース生成プログラムの一例を示したものである。
なお、テストケース生成装置10は、例えば半導体集積回路、より詳しくはASIC(Application Specific Integrated Circuit)等で実現することも可能である。
次に、本実施の形態に係るテストケース生成装置10の作用を説明する。本実施の形態に係るテストケース生成装置10は、入力部12に被検査プログラム30が入力されると、図18に示すテストケース生成処理を実行する。なお、以下では、入力部12に入力される被検査プログラム30として、図9に示した被検査プログラム30を例に説明するものとする。また、テストケース生成プログラム50を記憶部46から読み出してメモリ44に展開する際、メモリ44の予め定めた領域に記憶される、被検査プログラム30の条件分岐毎の分岐実行回数は、{(0、0)、(0、0)、(0、0)}に初期化される。また、生成部24によって生成される重複パス検出ルールも、何れのルールも含まないように初期化される。
ステップS100では、入力部12が、入力部12に入力された被検査プログラム30を取得して、例えばメモリ44に記憶する。更に、入力部12は、被検査プログラム30が入力されたことをシンボリック実行部14に通知する。
ステップS102では、シンボリック実行部14が、被検査プログラム30に対するパス探索の終了条件を満たしたか否かを判定する。
ここで、パス探索の終了条件とは、以下の3つの条件のうち、何れか1つの条件が成立することを言う。
(終了条件1)既出パスにより分岐網羅が達成されること。
(終了条件2)分岐網羅度が収束回数に亘って変化しないこと。
(終了条件3)パスの探索回数が、パス探索回数に達すること。
(終了条件1)は、例えば、管理部20によってメモリ44に記憶された、被検査プログラム30に含まれる条件分岐毎の分岐実行回数の各々が1以上となっている場合に、パス探索を終了する条件である。
(終了条件2)は、例えば、被検査プログラム30に含まれる全ての分岐数に対する実際にパス探索された分岐数の割合が、予め定めた収束回数に亘って連続して変化しない場合に、パス探索を終了する条件である。
具体的には、条件分岐毎の分岐実行回数が{(1、1)、(1、0)、(0、0)}であれば、被検査プログラム30に含まれる全ての分岐数は6であり、実際にパス探索された分岐数は3であるので、分岐網羅度は50%となる。この分岐網羅度の状態からパス探索を繰り返しても、収束回数連続して分岐網羅度が50%のまま変化しない場合に、条件が成立したものとして判定される。
(終了条件3)は、シンボリック実行部14が制御部16へパス探索指示を通知して制御部16にパスの探索を実施させた回数が、予め定めたパス探索回数に達した場合に、パス探索を終了する条件である。
なお、収束回数及びパス探索回数は、予め記憶部46に記憶されているものとするが、例えば、入力部12を介して取得し、記憶部46に記憶するようにしてもよい。
シンボリック実行部14によってパス探索の終了条件が成立したと判定された場合には、シンボリック実行を終了してステップS104へ移行する。パス探索の終了条件がまだ成立していないと判定された場合には、シンボリック実行部14が制御部16へパス探索指示を通知し、ステップS106へ移行する。
ステップS106では、制御部16は、シンボリック実行部14からのパス探索指示によってパス探索を開始する。まず、制御部16は、検出部26へ重複パス検出処理の実行指示を通知し、検出部26に重複パス検出処理を実行させる。
図19は、ステップS106の重複パス検出処理の内容を示したフローチャートである。
ステップS200で、検出部26は、メモリ44の予め定めた領域に記憶されている、被検査プログラム30の条件分岐毎の分岐実行回数を参照し、パス選択規則に基づいて優先分岐番号を生成する。
例えば、テストケース生成装置10が初期状態にある場合、被検査プログラム30の条件分岐毎の分岐実行回数は{(0、0)、(0、0)、(0、0)}であるから、パス選択規則に基づいて生成される優先分岐番号は(0、0、0)となる。
そして、ステップS202で、検出部26は、ステップS200で生成した優先分岐番号と、後述するステップS124の処理によって生成部24により生成される重複パス検出ルールとを比較する。そして、重複パス検出ルールの中に、ステップS200で生成した優先分岐番号の少なくとも一部と一致するルールが存在する場合、検出部26は、生成した優先分岐番号によって表されるパス候補が既出パスと重複することを、制御部16に通知する。
そして、ステップS108では、制御部16は、検出部26から重複パス検出処理の結果を受け取り、重複パス検出処理の結果に基づいて、今回のパス探索によって抽出される予定のパス候補が、既出パスと重複するか否かを判定する。
そして、パス候補が既出パスと重複する場合にはステップS110へ移行し、パス候補が既出パスと重複しない場合にはステップS112へ移行する。
ステップS110では、制御部16が、管理部20へ被検査プログラム30に含まれる条件分岐毎の分岐実行回数の更新を要求する。管理部20は、検出部26で生成されたパス候補に対応した優先分岐番号の値に基づいて、例えばメモリ44の予め定めた領域に記憶された条件分岐毎の分岐実行回数を更新する。そして、ステップS102へ移行して、被検査プログラム30に含まれるパスの探索を繰り返す。
一方、ステップS112では、制御部16が、メモリ44に記憶された被検査プログラム30から命令文を1行読み込む。そして、ステップS114では、制御部16が、ステップS112において読み込んだ命令文と共に、選択部22へ分岐選択処理の実行指示を通知し、選択部22に分岐選択処理を実行させる。
ステップS114では、選択部22は、制御部16から通知された命令文が条件分岐命令であれば、条件分岐命令が分岐可能か否かを判断する。そして、選択部22は条件分岐命令が分岐可能である場合に、既に説明したパス選択規則に従って分岐先を選択する。なお、ステップS114の分岐選択処理の詳細については後ほど説明する。
ステップS116では、制御部16が、管理部20へ被検査プログラム30に含まれる条件分岐毎の分岐実行回数の更新を要求する。
図20は、管理部20で実施される、ステップS116における分岐実行回数管理処理の内容を示したフローチャートである。
ステップS400では、管理部20は、ステップS112の処理で制御部16が読み込んだ命令文が条件分岐命令か否かを判定し、否定判定の場合には分岐実行回数管理処理を終了する。一方、肯定判定の場合には、ステップS402へ移行する。
ステップS402では、管理部20は、ステップS114での分岐選択処理の結果、選択部22が選択した条件分岐命令の分岐先を、メモリ44の予め定めた領域から取得する。条件分岐命令がIF文である場合、選択部22によってメモリ44の予め定めた領域には、例えば‘TRUE’又は‘FALSE’が記憶され、条件分岐命令がEVALUATE文であれば、分岐先番号が記憶されている。この場合、例えば分岐先番号が‘1’の場合には、EVALUATE文の最初のWHEN文が実行されたことを意味し、分岐先番号が‘2’の場合には、EVALUATE文の2番目のWHEN文が実行されたことを意味する。
ステップS404では、管理部20は、ステップS402の処理で取得した条件分岐命令の分岐先に基づいて、対応する条件分岐命令の分岐実行回数を1つ増加して、例えばメモリ44の予め定めた領域に記憶する。
以上、ステップS400〜ステップS404の処理によって、ステップS116の分岐実行回数管理処理が実行される。
次に、ステップS118では、制御部16が、ステップS112の処理で読み込んだ命令文が被検査プログラム30の終了を示す命令文、例えば「EXIT PROGRAM」であるか否かを判定する。否定判定の場合には、ステップS120へ移行する。ステップS120では、まだ1つのパスの探索が終了していない状態であるため、制御部16は、次に読み込むべき命令文が格納されているメモリ44上のアドレスを更新する。そして、ステップS112へ移行し、ステップS112〜ステップS120の処理を繰り返すことによって、被検査プログラム30から1つのパスを探索する。
なお、ステップS120では、制御部16が、例えば被検査プログラム30から次に読み込むべき命令文の行番号を順次メモリ44に記憶して、パス探索の終了後に被検査プログラム30の実行経路が特定できるようにしておく。
一方、ステップS118の処理において肯定判定となった場合には、ステップS122へ移行する。なお、ステップS118の処理が肯定判定になるということは、被検査プログラム30から1つのパスが探索されたことを表している。また、ステップS122へ移行する際、制御部16は、探索されたパスに対応する条件分岐毎の分岐実行回数をパス探索回数と関連付けて、メモリ44の予め定めた領域に待避する。
ステップS122では、制御部16は、ステップS112〜ステップS120の処理によって新たに探索されたパスを考慮した被検査プログラム30の分岐網羅度(最新分岐網羅度)を算出する。なお、既にステップS102の処理で説明したように、被検査プログラム30の分岐網羅度は、例えばメモリ44に記憶されている条件分岐毎の分岐実行回数を参照することで算出される。
そして、制御部16は、最新分岐網羅度と、例えばメモリ44に記憶されている既出パスによって算出された被検査プログラム30の分岐網羅度(既出パス分岐網羅度)とを比較して、分岐網羅度が向上したか否かを判定する。
分岐網羅度が向上しない、すなわち最新分岐網羅度が既出パス分岐網羅度と等しい場合には、後述するステップS124及びステップS126の処理を行わずに、ステップS102へ移行し、被検査プログラム30から次のパスを探索する。一方、分岐網羅度が向上した、すなわち最新分岐網羅度が既出パス分岐網羅度よりも大きい場合には、ステップS124へ移行する。
ステップS124では、制御部16は、生成部24へ重複パス検出ルールの生成指示を通知する。この場合、生成部24は、新たに探索したパスに対応する条件分岐毎の分岐実行回数と、前回探索したパスに対応する分岐条件毎の分岐実行回数と、の差分から、新たに探索したパスに含まれる条件分岐毎の分岐先を特定する。そして、生成部24は、特定した新たに探索したパスに含まれる条件分岐毎の分岐先と、図19のステップS200で検出部26によって生成された優先分岐番号とに基づいて、新たに探索したパスに対応した重複パス検出ルールを生成する。
具体的には、図14に示したように、例えば条件分岐毎の優先分岐番号のうち、新たに探索したパスが通過した条件分岐の優先分岐番号を重複パス検出ルールとして、メモリ44の予め定めた領域に記憶する。
このようにして生成された重複パス検出ルールは、前述したステップS106の重複パス検出処理で用いられる。
なお、新たに探索したパスの特定方法はこれに限らず、探索したパスが特定できる方法であれば何れの方法を用いてもよい。
ステップS126では、シンボリック実行部14は、探索されたパスに基づいてシンボリック実行を行い、探索されたパスが実行可能である場合に、被検査プログラム30から探索されたパスに対応するパス条件を抽出する。そして、シンボリック実行部14は、シンボリック実行によって抽出したパス及び当該パスに対応するパス条件を組み合わせた情報を、テストケースとして生成し、例えばメモリ44の予め定めた領域に記憶する。
テストケース生成後、ステップS102へ移行して、被検査プログラム30から次のテストケースを生成する処理を繰り返す。
そして、ステップS102の処理において、シンボリック実行部14によってパス探索の終了条件が成立したと判定された場合、出力部28は、ステップS104の処理において、生成されたテストケースを、例えばメモリ44等にまとめて出力する。
なお、テストケースの出力先はメモリ44に限定されず、例えば、コンピュータ40と有線回線又は無線回線で接続された図示しない端末装置や、USB(Universal Serial Bus)メモリ等の可搬型記憶装置等であってもよい。
このように、本実施の形態に係るテストケース生成装置10は、新たなパスが探索されたとしても分岐網羅度が向上しなければ、新たなパスに対応した優先分岐番号が重複パス検出ルールとして使用されることがない上、シンボリック実行が行われることもない。
従って、探索された全てのパスに対応した優先分岐番号から重複パス検出ルールを生成し、シンボリック実行を行う場合と比較して、分岐網羅度の向上につながらない無駄なテストケースを予め排除することができる。また、分岐網羅度の向上につながらない無駄なテストケースを予め排除することから、テストケースの生成に要する時間を短縮することができる。
次に、ステップS114における分岐選択処理の内容について説明する。
図21は、選択部22で実施される、ステップS114における分岐選択処理の内容を示したフローチャートである。
ステップS300では、選択部22は、図18のステップS112の処理で制御部16が読み込んだ命令文が条件分岐命令か否かを判定し、否定判定の場合には分岐選択処理を終了する。一方、肯定判定の場合には、ステップS302へ移行する。
ステップS302では、選択部22は、読み込まれた条件分岐命令から分岐条件を取得し、例えばメモリ44の予め定めた領域に記憶する。なお、ステップS302の処理によって、探索中のパスに含まれる条件分岐命令の分岐条件が、順にメモリ44の予め定めた領域に記憶される。
ステップS304では、選択部22は、被検査プログラム30を参照して、ステップS302の処理で取得した分岐条件の真偽値を確定することができるか否かを評価する。例えば、分岐条件が(項目1=1)である場合、被検査プログラム30において項目1の値が具体的な数値として確定しているならば、分岐条件の真偽値を確定することができる。
ステップS306では、選択部22は、ステップS304の処理によって評価された分岐条件の真偽値が確定するか否かを判定する。そして、肯定判定の場合にはステップS308へ移行する。
ステップS308では、ステップS302で取得した分岐条件の真偽値を確定し、選択部22は、ステップS302の処理で取得した分岐条件と、当該分岐条件での確定した真偽値とを関連付けて、例えばメモリ44の予め定めた領域に記憶する。そして、図21に示した分岐選択処理を終了する。
一方、ステップS306の処理において、ステップS304の処理によって評価された分岐条件の真偽値を確定できないと判定された場合には、ステップS310へ移行する。
ステップS310では、選択部22は、ステップS302の処理でメモリ44に記憶した、現在探索中のパスに含まれる全ての分岐条件の充足可能性を評価する。
例えば、現在探索中のパスに含まれる過去の分岐条件の中に、(性別=‘男性’)という分岐条件が存在して、当該分岐条件に対応する真偽値が‘TRUE’であったとする。この場合、単独の分岐条件では真偽値を確定させることができない(性別=‘女性’)という分岐条件がステップS302の処理で取得されたとしても、過去の分岐条件の真偽値から、真偽値を‘FALSE’に確定させることができる。
このようにして、ステップS312では、選択部22は、ステップS302の処理で取得した分岐条件の分岐先が確定可能か否かを判定する。そして、肯定判定の場合にはステップS314へ移行する。
ステップS314では、ステップS302で取得した分岐条件の真偽値を確定し、選択部22は、ステップS302の処理で取得した分岐条件と、当該分岐条件の真偽値とを関連付けて、例えばメモリ44の予め定めた領域に記憶する。そして、図21に示した分岐選択処理を終了する。
一方、ステップS312の処理において否定判定となった場合には、ステップS316へ移行し、選択部22は、既に説明したパス選択規則に従って、ステップS302の処理で取得した分岐条件の分岐先を選択する。そして、選択部22は、ステップS302の処理で取得した分岐条件と、選択した真偽値とを関連付けて、例えばメモリ44の予め定めた領域に記憶する。そして、図21に示した分岐選択処理を終了する。
以上のようにして、コンピュータ40上で図18に示すテストケース生成処理が実行される。
この様に、本実施の形態に係るテストケース生成装置10は、検出部26によりパス探索前に既出パスと重複するパス候補を検出し、重複するパス候補をパス探索前に予め排除する。従って、本実施の形態に係るテストケース生成装置10は、検出部26を含まない場合と比較して、テストケース生成時間を短縮することができる。また、検出部26は重複するパス候補を予め排除するため、本実施の形態に係るテストケース生成装置10は、DART等の従来のパス抽出法と比較して、より少ないパス数で分岐網羅を実現するパスを抽出することができる。
(第2実施形態)
次に、開示の技術の第2実施形態について説明する。なお、第1実施形態と同一の部分には同一の符号を付して説明を省略し、第1実施形態と異なる部分を中心に説明する。
図22に、本実施の形態に係るテストケース生成装置10Aを示す。
本実施の形態に係るテストケース生成装置10Aが、図7に示した第1実施形態におけるテストケース生成装置10と異なる点は、管理部20が管理部20Aになった点であり、その他は同一であるので説明は省略する。
図23は、外部処理に条件分岐命令が含まれた被検査プログラム30の一例を示した図である。
図23に示した被検査プログラム30は、19行目から26行目までが外部処理であり、20行目にIF文が含まれている。そして、外部処理は、12行目、14行目、及び16行目の3個のPERFORM文から呼び出される。
この場合、管理部20Aは、初期状態において被検査プログラム30を解析し、20行目にIF文を検出した場合、第1実施形態における管理部20と同様に、IF文の分岐実行回数を、例えば「直接=(0、0)」のように初期化する。
そして、制御部16によって被検査プログラム30のパスが探索されると、まず、12行目のPERFORM文から外部処理が呼び出される。そして、パス選択規則に従って、20行目のIF文のTHEN分岐が実行され、外部処理の呼出元に実行先が復帰する。
この際、管理部20Aは、外部処理の呼出元毎にIF文の分岐実行回数を管理する。具体的には、初めての呼出元から外部処理呼び出しによってIF文を実行した場合に、例えば「Perform#12=(1、0)」といった分岐実行回数を記録する。ここで、‘#’の前の‘Perform’は外部処理を呼び出した命令文を表し、‘#’の後ろに続く‘12’の数値は、外部処理の呼出元行番号を示す。
引き続き、14行目のPERFORM文から外部処理が呼び出されると、パス選択規則に従って、20行目のIF文のTHEN分岐が実行され、外部処理の呼出元に処理が復帰する。この際、管理部20Aは、外部処理がこれまでとは異なる呼出元から呼び出されたことから、例えば「Perform#14=(1、0)」といった分岐実行回数を記録する。
更に、16行目のPERFORM文から外部処理が呼び出されると、パス選択規則に従って、20行目のIF文のTHEN分岐が実行され、外部処理の呼出元に処理が復帰する。この際、管理部20Aは、外部処理がこれまでとは異なる呼出元から呼び出されたことから、例えば「Perform#16=(1、0)」といった分岐実行回数を記録する。
すなわち、図23に示した被検査プログラム30の20行目のIF文に対して、直接=(0、0)、Perform#12=(1、0)、Perform#14=(1、0)、及びPerform#16=(1、0)の4つの分岐実行回数が管理される。
次に、本実施の形態に係るテストケース生成装置10Aの作用を説明する。テストケース生成装置10Aのテストケース生成処理は、図18に示す第1実施形態におけるテストケース生成装置10のテストケース生成処理と同一である。ただし、ステップS116の分岐実行回数管理処理の内容が異なるため、以下に、本実施の形態に係る分岐実行回数管理処理について説明する。
図24は、管理部20Aで実施される、分岐実行回数管理処理の内容を示したフローチャートである。図24に示す分岐実行回数管理処理が図20に示す分岐実行回数管理処理と異なるのは、ステップS403、ステップS406、及びステップS408の処理が追加された点である。その他の処理は図20に示す分岐実行回数管理処理と同一であるため、説明を省略する。
ステップS403では、管理部20Aは、制御部16が図18に示すステップS112の処理で読み込んだ条件分岐命令が、外部処理呼び出しによって読み込まれた条件分岐命令か否かを判定する。具体的には、ステップS120の処理でメモリ44に記録された被検査プログラム30の実行経路を参照して判定すればよい。
そして、ステップS403の処理による判定が否定判定の場合には、既に説明したステップS404へ移行する。一方、肯定判定の場合には、ステップS406へ移行する。
ステップS406では、管理部20Aは、ステップS120の処理でメモリ44に記録された被検査プログラム30の実行経路を参照して、図18に示すステップS112の処理で読み込んだ条件分岐命令のサブルーチン階層を取得する。
ここで、条件分岐命令のサブルーチン階層とは、条件分岐命令に至るまでの外部処理の呼出過程を示すものである。
例えば、N1行目のPERFORM文から外部処理Aが呼び出され、外部処理Aに含まれるN2行目のPERFORM文から外部処理Bが更に呼び出され、外部処理Bに条件分岐命令が含まれる場合のサブルーチン階層について説明する。
この場合、条件分岐命令は、外部処理A、外部処理Bの順に呼び出されるため、条件分岐命令のサブルーチン階層は、例えば外部処理の呼出元の行番号を用いて、「Perform#(N1、N2)」と取得される。
なお、N1行目にあるPERFORM文から呼び出された外部処理Aの中に条件分岐命令が含まれる場合には、図23で既に説明したように、条件分岐命令のサブルーチン階層は、「Perform#N1」と取得される。
そして、ステップS408では、管理部20Aは、ステップS402の処理で取得した条件分岐命令の分岐先に基づいて、サブルーチン階層に対応する条件分岐命令の分岐実行回数を1つ増加して、例えばメモリ44の予め定めた領域に記憶する。
以上、ステップS400〜ステップS408の処理によって、図18に示すステップS116の分岐実行回数管理処理が実行される。
このように、本実施の形態に係る管理部20Aは、条件分岐毎に分岐実行回数を管理するのに加え、更に、条件分岐命令が外部処理に含まれる場合、条件分岐命令に到達するまでに経由した外部処理の呼出元毎に条件分岐の分岐実行回数を管理する。
従って、被検査プログラム30が外部処理の中に条件分岐を含む場合、単に条件分岐毎に分岐実行回数を管理する場合と比較して、効率よく分岐網羅を実現するテストケースを生成することができる。
以上、開示の技術を実施の形態を用いて説明したが、開示の技術は上記実施の形態に記載の範囲には限定されない。開示の技術の要旨を逸脱しない範囲で上記実施の形態に多様な変更または改良を加えることができ、当該変更または改良を加えた形態も開示の技術の技術的範囲に含まれる。例えば、開示の技術の要旨を逸脱しない範囲で、図18〜図21、及び図24に示した処理の順序を変更してもよい。
また、上記では開示の技術に係るテストケース生成プログラムの一例であるテストケース生成プログラム50が記憶部46に予め記憶(インストール)されている態様を説明したが、これに限定されるものではない。開示の技術に係るテストケース生成プログラムは、コンピュータ読取可能な記録媒体に記録されている形態で提供することも可能である。例えば、開示の技術に係るテストケース生成プログラムは、CD−ROM、DVD−ROM、及びUSBメモリ等の可搬型記録媒体、並びに、フラッシュメモリ等の半導体メモリ等に記録されている形態で提供することも可能である。
また、実施形態に開示したテストケース生成装置10、10Aは、単一のコンピュータ40上で実現されるものとして説明した。しかし、プロセスを異なるコンピュータの記憶部46に記憶させ、各々のコンピュータを有線又は無線の通信回線で接続した分散処理の形態で、テストケース生成装置10、10Aを実現するようにしてもよい。
また、実施形態に開示したテストケース生成装置10、10Aは、ネットワークを経由して被検査プログラム30を受け付け、生成したテストケースをネットワークを経由して出力する、所謂ネットサービスの態様をとるようにしてもよい。
以上の第1実施形態及び第2実施形態を含む実施形態に関し、更に以下の付記を開示する。
(付記1)
被検査プログラムに含まれる条件分岐の分岐先への分岐実行回数を管理する管理部と、
前記管理部により管理された前記分岐実行回数から得られる経路候補に対応した分岐情報と、既に抽出された前記被検査プログラムの既出経路に対応した分岐情報と、を比較して、前記経路候補が前記既出経路に含まれる重複経路か否かを検出する検出部と、
前記条件分岐の前記分岐実行回数に応じた予め定めた規則に基づいて分岐先を決定して、前記被検査プログラムの開始から終了までの経路を選択する選択部と、
前記選択部により選択された前記経路に対応した分岐情報を、前記既出経路に対応した分岐情報として生成する生成部と、
前記検出部により前記経路候補が前記重複経路ではないと検出された場合、前記選択部及び前記生成部の各々による処理が実行され、前記検出部により前記経路候補が前記重複経路であると検出された場合、前記選択部及び前記生成部の各々による処理が実行されないように、前記選択部及び前記生成部を制御する制御部と、
を有するテストケース生成装置。
(付記2)
前記管理部は、前記条件分岐が、前記被検査プログラムの呼出元から呼び出されるサブルーチンに含まれる条件分岐である場合には、前記条件分岐の各々について、前記条件分岐に対応した前記分岐実行回数を管理すると共に、前記サブルーチンの呼出元毎に前記条件分岐に対応した前記分岐実行回数を管理する
付記1記載のテストケース生成装置。
(付記3)
前記制御部は、前記管理部で管理される前記分岐実行回数に基づいて算出される、前記選択部による新たな前記経路の選択前の分岐網羅度と、前記管理部で管理される前記分岐実行回数に基づいて算出される、前記選択部による新たな前記経路の選択後の分岐網羅度と、を比較し、新たな前記経路の選択後の分岐網羅度が新たな前記経路の選択前の分岐網羅度と同じ場合には、前記選択部により選択された新たな前記経路に対応した分岐情報を、前記既出経路に対応した分岐情報として生成しないように前記生成部を制御する
付記1又は付記2記載のテストケース生成装置。
(付記4)
被検査プログラムに含まれる条件分岐の分岐先への分岐実行回数を管理し、
前記分岐実行回数から得られる経路候補に対応した分岐情報と、既に抽出された前記被検査プログラムの既出経路に対応した分岐情報と、を比較して、前記経路候補が前記既出経路に含まれる重複経路か否かを検出し、
前記経路候補が前記重複経路ではないと検出された場合、前記条件分岐の前記分岐実行回数に応じた予め定めた規則に基づいて分岐先を決定して、前記被検査プログラムの開始から終了までの経路を選択し、前記経路に対応した分岐情報を、前記既出経路に対応した分岐情報として生成し、前記経路候補が前記重複経路であると検出された場合、前記経路候補に対応した前記経路を選択せずに、且つ、前記経路に対応した分岐情報を、前記既出経路に対応した分岐情報として生成しないように制御する
ことを含むテストケース生成方法。
(付記5)
前記条件分岐が、前記被検査プログラムの呼出元から呼び出されるサブルーチンに含まれる条件分岐である場合には、前記条件分岐の各々について、前記条件分岐に対応した前記分岐実行回数を管理すると共に、前記サブルーチンの呼出元毎に前記条件分岐に対応した前記分岐実行回数を管理する
付記4記載のテストケース生成方法。
(付記6)
前記分岐実行回数に基づいて算出される、新たな前記経路の選択前の分岐網羅度と、前記分岐実行回数に基づいて算出される、新たな前記経路の選択後の分岐網羅度と、を比較し、新たな前記経路の選択後の分岐網羅度が新たな前記経路の選択前の分岐網羅度と同じ場合には、新たな前記経路に対応した分岐情報を、前記既出経路に対応した分岐情報として生成しないように制御する
付記4又は付記5記載のテストケース生成方法。
(付記7)
コンピュータに、
被検査プログラムに含まれる条件分岐の分岐先への分岐実行回数を管理し、
前記分岐実行回数から得られる経路候補に対応した分岐情報と、既に抽出された前記被検査プログラムの既出経路に対応した分岐情報と、を比較して、前記経路候補が前記既出経路に含まれる重複経路か否かを検出し、
前記経路候補が前記重複経路ではないと検出された場合、前記条件分岐の前記分岐実行回数に応じた予め定めた規則に基づいて分岐先を決定して、前記被検査プログラムの開始から終了までの経路を選択し、前記経路に対応した分岐情報を、前記既出経路に対応した分岐情報として生成し、前記経路候補が前記重複経路であると検出された場合、前記経路候補に対応した前記経路を選択せずに、且つ、前記経路に対応した分岐情報を、前記既出経路に対応した分岐情報として生成しないように制御する
ことを含む処理を実行させるためのテストケース生成プログラム。
(付記8)
コンピュータに、
被検査プログラムに含まれる条件分岐の分岐先への分岐実行回数を管理し、
前記分岐実行回数から得られる経路候補に対応した分岐情報と、既に抽出された前記被検査プログラムの既出経路に対応した分岐情報と、を比較して、前記経路候補が前記既出経路に含まれる重複経路か否かを検出し、
前記経路候補が前記重複経路ではないと検出された場合、前記条件分岐の前記分岐実行回数に応じた予め定めた規則に基づいて分岐先を決定して、前記被検査プログラムの開始から終了までの経路を選択し、前記経路に対応した分岐情報を、前記既出経路に対応した分岐情報として生成し、前記経路候補が前記重複経路であると検出された場合、前記経路候補に対応した前記経路を選択せずに、且つ、前記経路に対応した分岐情報を、前記既出経路に対応した分岐情報として生成しないように制御する
ことを含む処理を実行させるためのプログラムを記録したコンピュータ読み取り可能な記録媒体。