以下に添付図面を参照して、この発明にかかる生成装置、生成方法、および生成プログラムの実施の形態を詳細に説明する。本実施の形態は、上述したコンディションを用い、パスコンディション間に共通の条件式がある場合は、テスト入力データを流用し、流用できない場合に限り、制約ソルバによりテスト入力データを求める。これにより、パスごとに独立してテスト入力データを求めるよりも演算量が低減される。これにともない、テスト入力データを使用する期待値算出の計算量も低減される。
<テスト入力データの生成例>
図1は、生成装置によるテスト入力データの生成例を示す説明図である。図1のテスト入力データの生成例は、あるテスト対象プログラムをシンボリック実行した場合に得られた実行可能パス群とそれらのパスコンディション群を用いた例である。そして、図1のテスト入力データの生成例は、既存のテスト入力データを流用しながら、パスごとのテスト入力データを求める例である。
図1のテストデータ生成例では、パスごとのテスト入力データを求めるためにテスト入力データテーブル100が用いられる。図1において、テスト入力データテーブル100は、パスごとに、パスNo.項目とパスコンディション項目と既存解制約項目と解決済項目とを有する。パスNo.項目には、パスを特定する番号が格納される。パスコンディション項目には、パスコンディションが格納される。パスコンディションとは、上述したように、テスト対象プログラムがシンボリック実行された場合の実行可能な経路であるパス群の各パスでの条件式の系列(たとえば、x>=0,y>=0)である。図1の例では、パスコンディションを編集した要素条件式がパスコンディションとして格納される。要素条件式とは、パスコンディションに存在する編集後の条件式である。パスコンディションの編集については後述する。
既存解制約項目には、既存解制約が格納される。既存解とは、制約ソルバで求められたり、他の既存解から流用されたテスト入力データである。既存解制約とは、各パスのテスト入力データを求めるための条件である。すなわち、既存解となったテスト入力データそのものが、他のパスの充足解に流用される可能性があるため、既存解制約となる。テスト入力データとは、パスコンディションに含まれている変数が充足する値である。図1のパス2を例に挙げると、パス2のパスコンディションは[x<0,y<0]であるため、x、yが変数であり、パスコンディション内の条件式「x<0」を満たすx=−1、パスコンディション内の条件式「y<0」を満たすy=−1がテスト入力データである。
解決済項目には、解決済か未解決かを示すフラグが格納される。パスコンディションに含まれているすべての変数についてテスト入力データが得られたパスについては、解決済を示すフラグが格納される。テスト入力データが1つでも得られていない変数があるパスについては、未解決を示すフラグが格納される。図1では便宜上、解決済については「○」で表記し、未解決の場合は空欄とする。
つぎに、テスト入力データの生成例を時系列(A)〜(C)に沿って説明する。なお、初期状態では、パス1〜7のパスコンディションは得られており、既存解制約項目は空、解決済項目は「未解決」に設定されているものとする。
(A)まず、生成装置は、パス1〜パス7の中からいずれかのパス、ここでは、パス2を選択する。パスの選択の仕方によってはテスト入力データの生成効率は上がるが、ここでは、生成装置は、ランダムにパス2を選択したこととする。初期状態では、既存解制約項目が空であり、他の既存解を流用できないため、生成装置は、パス2のパスコンディションを制約ソルバに与える。
制約ソルバは、パスコンディションの生成元となるテスト対象プログラムのシンボリック実行により、パス2のパスコンディションを充足する変数x,yの値を充足解として返す。この場合、{x=−1,y=−1}が充足解である。生成装置は、充足解{x=−1,y=−1}をパス2の既存解制約項目に格納する。これにより、充足解{x=−1,y=−1}は、既存解制約となり、流用元として利用される。
また、パス2のパスコンディションは[x<0,y<0]であるが、このうち要素条件式「x<0」は、パス4,パス5,パス7にも存在する。すなわち、パス2,パス4,パス5,パス7のパス群は、変数xについて共通の要素条件式を充足しなければならない。したがって、生成装置は、要素条件式「x<0」を充足するパス2の既存解制約{x=−1}をパス4,パス5,パス7に流用する。すなわち、生成装置は、パス2の既存解制約{x=−1}をパス4,パス5,パス7の既存解制約項目に格納する。これにより、パス4,パス5,パス7の変数xについては、制約ソルバで解く必要がなくなり、テスト入力データの演算量の低減化を図ることができる。
変数yについても同様に、要素条件式「y<0」は、パス3,パス6にも存在する。すなわち、パス3,パス6のパス群は、変数yについて共通の要素条件式を充足しなければならない。したがって、生成装置は、要素条件式「y<0」を充足するパス2の既存解制約{y=−1}をパス3,パス6に流用する。これにより、生成装置は、パス2の既存解制約{y=−1}をパス3,パス6の既存解制約項目に格納する。これにより、パス3,パス6の変数yについては、制約ソルバで解く必要がなくなり、テスト入力データの演算量の低減化を図ることができる。
(B)つぎに、生成装置がパス6を選択したこととする。(A)ではパス6について変数xの値が得られていないが、パス6の変数xについての要素条件式「x>=0」と共通の要素条件式を有するパス1には既存解制約がなく、変数xの値が流用できない。この場合は、生成装置は、選択したパス6のパスコンディションとパス6の既存解制約{y=−1}とを制約ソルバに与える。
制約ソルバは、パスコンディションの生成元となるテスト対象プログラムのシンボリック実行により、パス6のパスコンディションおよび変数yの既存解制約{y=−1}とを充足する変数xの値を充足解として返す。この場合、{x=0}が充足解である。生成装置は、充足解{x=0}をパス6の既存解制約項目に格納する。これにより、充足解{x=0}は既存解制約となり、流用元として利用される。このように、制約ソルバでの求解を必要最小限にすることにより、テスト入力データの演算量の低減化を図ることができる。
また、これにより、パス6では、{x=0}が既存解制約となったため、{x=0}は、パス6と共通の要素条件式「x>=0」を有するパス1に流用される。生成装置は、(A),(B)に示したような流用や制約ソルバでの求解を、全パスの解決済項目がすべて「○」になるまで実行する。
(C)では、最終的に全パスの解決済項目がすべて「○」になった状態を示している。解決済項目がすべて「○」になったということは、全パスについてテスト入力データが得られたことを意味する。図1では、既存解制約項目において、塗りつぶした箇所が制約ソルバで求解したテスト入力データであり、それ以外の箇所は他のパスの既存解制約からの流用により設定されたテスト入力データである。
このように、従来では、パス1〜パス7において変数x,yのテスト入力データを制約ソルバにより14個求めなければならなかったのを、本実施の形態では、(C)において塗りつぶしていない7個で済むため、テスト入力データを求めるための演算量の低減化を図ることができる。また、期待値についても、テスト入力データを用いて求められるため、テスト入力データの種類数が少ないほど、期待値の演算量の低減化を図ることができる。
<テスト対象プログラム例>
図2は、テスト対象プログラムの一例を示す説明図である。また、図3は、戻り値クラスのプログラムの一例を示す説明図である。
図2に示すように、テスト対象プログラム200には、6個のIF文1〜6と1つの更新文1が記述されている。図2および図3のプログラムをシンボリック実行する場合、テスト対象関数targetFuncの引数であるxとyに対してシンボル値を指定して、シンボリック実行が行われる。戻り値クラスのプログラム300は、期待値a,b,cを戻り値として出力するプログラムである。
図4は、図2に示したテスト対象プログラム200のフロー図である。図4では、条件による分岐構造が示されている。
<シンボリック実行結果の例>
図5は、図2に示したテスト対象プログラム200のシンボリック実行結果の例を示すフロー図である。図5に示した実行結果は、図2および図3のプログラムのシンボリック実行結果である。なお、図5に示したパス1〜パス7は、図1で説明したパス1〜パス7である。
<パスコンディションの例>
図6は、パスコンディションの例を示す説明図である。図6のパスコンディションテーブル600において、パスコンディションは、図5に示した実行可能パス1〜パス7のパスコンディションであり、図1のパスコンディションの編集前のパスコンディションである。また、図6において、ケース項目には、ケース名が格納される。ケース名とは、実行可能パスの終点を示す識別子である。たとえば、図5を参照すると、パス7の終点は、「Case5」であるため、パス7のケース項目には、「Case5」が格納される。
図6において、たとえば、パス3のパスコンディションは、[((y+−10)<0)&&(((y+−10)+x)>=2)&&!(y>=0)&&(x>=0)]である。このパスコンディションは、4つの条件式をANDで結合したものである。先頭の条件式は「((y+−10)<0)」となっている。その理由は、図2のテスト対象プログラム200のIF文5の条件「y<0」が評価されるとき、変数yの値は、更新文1により「y−10」に更新されており、更新値に基づいてIF文5を評価したためである。
図7は、実行不能パスの例を示すフロー図である。図7において、パス8〜パス11は、パスコンディションが充足不可能なため、実行が不可能であったパスである。たとえば、パス8のパスコンディションは、[(y−10>=0)&&!(y−10<0)&&(x+(y−10)>=2)&&!(y>=0)&&(x>=0)]である。このパスコンディションの変数yに対する条件式を満たすyはあり得ない。したがって、パス8は、制約ソルバにより実行不能パスと判定される。
<所望の出力例>
図8は、所望の出力例を示す説明図である。図8では、所望の出力がテーブル化されている。所望の出力項目には、ケースごとに所望の出力が格納されている。所望の出力とは、たとえば、テスト対象プログラム200の仕様書等に記述された出力内容である。所望の出力の変数x,yにテスト入力データを与えると、戻り値クラスのプログラム300が実行されることにより期待値a,b,cが算出される。
<テスト入力データおよび期待値の例>
図9は、テスト入力データおよび期待値の例を示す説明図である。図9のテーブルは、図6のパスコンディションのテーブルに、入力項目と期待値項目とを追加したテーブルである。入力項目には、テスト入力データが格納されている。すなわち、図1に示した解決済の既存解制約が格納されている。期待値項目には、パスごとに期待値が格納されている。期待値は、パスごとに、テスト入力データを所望の出力に与えた場合の計算結果となる。
<生成装置のハードウェア構成例>
生成装置は、たとえば、CPU(Central Processing Unit)やプログラマブルなデバイス(FPGA(Field Programmable Gate Array)、PLD(Programmable Logic Device))などの機器に、ソフトウェアとして実装される。また、たとえば、ROM(Read Only Memory)、RAM(Random Access Memory)、ハードディスクなどのメモリが記憶装置として利用される。以下、ハードウェア構成例を図示する。
図10は、実施の形態にかかる生成装置のハードウェア構成例を示すブロック図である。図10において、生成装置は、CPU1001と、ROM1002と、RAM1003と、磁気ディスクドライブ1004と、磁気ディスク1005と、光ディスクドライブ1006と、光ディスク1007と、ディスプレイ1008と、I/F(Interface)1009と、キーボード1010と、マウス1011と、スキャナ1012と、プリンタ1013と、を備えている。また、各構成部はバス1000によってそれぞれ接続されている。
ここで、CPU1001は、生成装置の全体の制御を司る。ROM1002は、ブートプログラムなどのプログラムを記憶している。RAM1003は、CPU1001のワークエリアとして使用される。磁気ディスクドライブ1004は、CPU1001の制御にしたがって磁気ディスク1005に対するデータのリード/ライトを制御する。磁気ディスク1005は、磁気ディスクドライブ1004の制御で書き込まれたデータを記憶する。
光ディスクドライブ1006は、CPU1001の制御にしたがって光ディスク1007に対するデータのリード/ライトを制御する。光ディスク1007は、光ディスクドライブ1006の制御で書き込まれたデータを記憶したり、光ディスク1007に記憶されたデータをコンピュータに読み取らせたりする。
ディスプレイ1008は、カーソル、アイコンあるいはツールボックスをはじめ、文書、画像、機能情報などのデータを表示する。このディスプレイ1008は、たとえば、液晶ディスプレイ、プラズマディスプレイなどを採用することができる。
インターフェース(以下、「I/F」と略する。)1009は、通信回線を通じてLAN(Local Area Network)、WAN(Wide Area Network)、インターネットなどのネットワーク1014に接続され、このネットワーク1014を介して他の装置に接続される。そして、I/F1009は、ネットワーク1014と内部のインターフェースを司り、外部装置からのデータの入出力を制御する。I/F1009には、たとえばモデムやLANアダプタなどを採用することができる。
キーボード1010は、文字、数字、各種指示などの入力のためのキーを備え、データの入力をおこなう。また、タッチパネル式の入力パッドやテンキーなどであってもよい。マウス1011は、カーソルの移動や範囲選択、あるいはウィンドウの移動やサイズの変更などをおこなう。ポインティングデバイスとして同様に機能を備えるものであれば、トラックボールやジョイスティックなどであってもよい。
スキャナ1012は、画像を光学的に読み取り、生成装置内に画像データを取り込む。なお、スキャナ1012は、OCR(Optical Character Reader)機能を持たせてもよい。また、プリンタ1013は、画像データや文書データを印刷する。プリンタ1013には、たとえば、レーザプリンタやインクジェットプリンタを採用することができる。なお、光ディスクドライブ1006、光ディスク1007、ディスプレイ1008、キーボード1010、マウス1011、スキャナ1012、およびプリンタ1013の少なくともいずれか1つは、なくてもよい。
<生成装置の機能的構成例>
図11は、生成装置の機能的構成例を示すブロック図である。生成装置1100は、実行部1101と、記録部1102と、求解部1103と、分解部1104と、並び替え部1106と、関連付け部1105と、生成部1107と、を有する。実行部1101、記録部1102、および求解部1103は、生成装置1100の外部機能であってもよい。実行部1101、記録部1102、求解部1103、分解部1104、並び替え部1106、関連付け部1105、および生成部1107は、具体的には、たとえば、図10に示したROM1002、RAM1003、磁気ディスク1005、光ディスク1007などの記憶装置に記憶されたプログラムをCPU1001に実行させることにより、または、I/F1009により、その機能を実現する。
実行部1101は、テスト対象プログラム200のシンボリック実行をおこなう。具体的には、たとえば、図2および図3のプログラムが入力されると、実行部1101は、シンボリック実行をおこなって、図5に示したような実行可能パスとしてパス1〜パス7や図7に示したパス8〜パス11を得る。そして、実行部1101は、得られたパス群のうち実行可能パスであるパス1〜パス7についてパスコンディションを生成する。
記録部1102は、実行部1101によって生成されたパスコンディションを記憶装置に格納する。具体的には、たとえば、記録部1102は、図6に示したように、パスコンディションテーブル600にパスコンディション群を記録する。
求解部1103は、テスト対象プログラム200についてのパスコンディションを充足するテスト入力データを充足解として求める。具体的には、たとえば、求解部1103は、非特許文献1で示したような制約ソルバが採用される。求解部1103は、パスコンディションおよび一部の変数のテスト入力データが与えられると、他の変数のテスト入力データを求めることもできる。
分解部1104は、パスコンディション群の少なくとも1のパスコンディションを、論理積演算子を境界にして複数の条件式に分解する。具体的には、たとえば、分解部1104は、パスコンディションテーブル600からパスごとのパスコンディションを取得する。
図12は、分解部1104が取得したパスコンディション群を示す説明図である。パスコンディションは、論理積演算子「&&」により条件式が連結されている。分解部1104は、論理積演算子「&&」を削除して、パスコンディションを複数の条件式に分解する。このように、パスコンディションを分解することにより、生成装置1100は、パスコンディション間で条件式どうしを比較しやすくなり、共通の条件式の探索を効率よく実行することができる。
また、分解部1104は、複数の条件式を包含関係のある条件式どうしでまとめる。たとえば、条件式「y<0」と「y<10」の場合、「y<0」の部分に包含関係があるため、0≦y<10の部分が削除されることになる。すなわち、条件式「y<10」が削除される。このように、複数の条件式をまとめることにより、条件式の個数が少なくなり、生成装置1100は、共通の条件式の探索を効率よく実行することができる。
また、分解部1104は、複数の条件式のうち論理否定演算子を有する条件式から論理否定演算子を削除し、削除後の条件式に存在する比較演算子を反対の意味の比較演算子に変換する。具体的には、分解部1104は、論理否定演算子を有する条件式を肯定表現の条件式に変換する。たとえば、分解部1104は、論理否定演算子を有する条件式から論理否定演算子を削除し、削除後の条件式に含まれている不等号の比較演算子を、反対の意味の比較演算子に置換する。
たとえば、分解部1104は、「=<」を「>」に、「>=」を「<」に、「>」を「=<」に、「<」を「>=」に、置換する。このように、条件式を単純な表現に編集することにより、生成装置1100は、パスコンディション間で共通の条件式の探索を効率よく実行することができる。
図13は、分解部1104によるパスコンディションの分解例を示す説明図である。図13では、パス3のパスコンディションを例に挙げて説明する。まず、(A)は、編集前のパス3のパスコンディションを示している。
(B)は、(A)の状態から、論理積演算子「&&」を削除して、複数の条件式に分解した状態を示している。
(C)は、(B)の状態から、論理否定演算子「!」を有する条件式を編集した状態を示している。たとえば、論理否定演算子「!」を有する条件式「!(y>=0)」から論理否定演算子「!」が削除され、削除後の条件式「y>=0」の比較演算子「>=」が反対の意味を持つ比較演算子「<」に置換される。これにより、条件式「!(y>=0)」が条件式「y<0」になる。
(D)は、(C)の状態から条件式を整理した状態を示している。たとえば、(C)の条件式「(y+−10)<0」は、「y<10」に変換される。また、(C)の条件式「((y+ −10)+x)>=2」は、「x+y>=12」に変換される。
(E)は、(D)の状態から条件式を並べ替えた状態を示している。たとえば、変数の個数やアルファベット順、比較演算子の大小関係により、条件式が並べ替えられている。
(F)は、(E)の状態から包含関係のある条件式どうしをまとめた状態を示している。たとえば、条件式「y<0」と「y<10」の場合、「y<0」の部分に包含関係があるため、条件式「y<10」が削除される。(F)に示したパスコンディションが要素条件式となる。
図14は、分解部1104による分解結果例を示す説明図である。分解部1104は、図12のパスコンディション群を、図13に示した分解処理により、図14に示した分解結果を出力する。
また、図11に戻り、関連付け部1105は、パスコンディション群のうち、パスコンディション間に共通の条件式がある複数のパスと共通の条件式とを関連付けることにより、共通の条件式と複数のパスとの組み合わせ群を生成する。具体的には、たとえば、関連付け部1105は、まず、図14に示した分解部1104による分解結果を取得する。そして、関連付け部1105は、パスごとに、共通の条件式をパスコンディションに持つ他のパスを探索する。たとえば、パス1が選択された場合、関連付け部1105は、図14の分解結果におけるパス1のパスコンディション内の要素条件式「x>=0」を他のパス2〜パス7から探索する。
この場合、パス6のパスコンディションの中に要素条件式「x>=0」が存在する。したがって、要素条件式「x>=0」が、パス1とパス6の共通の条件式となる。このように、共通の条件式をもつパス群を、「関連パスコンディション組」と称す。関連付け部1105は、共通の条件式「x>=0」と、関連パスコンディション組{パス1,パス6}と、を関連付けて、関連パスコンディション組テーブルに格納する。
図15は、関連パスコンディション組テーブルの一例を示す説明図である。上述したパス1〜パス7の例で関連付けをおこなうと、図15のようになる。関連パスコンディション組テーブル1500は、ID項目と、関連パスコンディション組項目と、共通の条件式項目と、を有する。ID項目には、関連パスコンディション組と共通の条件式との組み合わせを一意に特定する識別番号が格納される。関連パスコンディション組項目には、関連パスコンディション組が格納される。共通の条件式項目には、関連パスコンディション組の各パスのパスコンディションに存在する共通の条件式が格納される。
また、図11に戻り、並び替え部1106は、関連パスコンディション組テーブル1500のレコードを並び替える。具体的には、たとえば、並び替え部1106は、優先ルールテーブルを参照することにより、関連パスコンディション組テーブル1500のレコードを並び替える。
図16は、優先ルールテーブルの一例を示す説明図である。優先ルールテーブル1600は、ルールID項目と、優先ルール項目と、を有する。ルールID項目には、優先ルールを一意に特定する識別番号が格納される。本例では、ルールIDが小さい優先ルールほど優先される。すなわち、ルールID:1の優先ルール(優先ルール1)が最優先される規則である。
優先ルール項目には、優先ルールが格納される。優先ルールとは、関連パスコンディション組のいずれを優先的に扱うかを決める規則である。テスト入力データを生成する際、関連パスコンディション組テーブル1500の最上位レコードの関連パスコンディション組から選択される。したがって、優先ルールは、テスト入力データの生成効率が上がるような規則となる。以下、優先ルール1,2について具体的に説明する。
優先ルール1は、「関連パスコンディション組に含まれるパスコンディションの個数が多い順」に関連パスコンディション組テーブル1500のレコードを並び替える規則である。関連パスコンディション組に含まれるパスコンディションの個数が多いほど、既存解の流用先が多くなり、効率的だからである。たとえば、関連パスコンディション組3は{パス2,パス4,パス5,パス7}であるが、パス2に既存解があると、パス4,パス5,パス7の3本のパスに流用されることになる。
優先ルール2は、「共通の条件式が、単一の変数である」関連パスコンディション組を上位となるように並べ替える規則である。共通の条件式の変数の個数が多い関連パスコンディション組が優先されると、求解部1103に与えられた場合に演算負荷がかかるが、できる限り流用したあとでは、変数が複数個あっても既存解が流用される変数も出現し、解が得られていない変数の個数が減少する。したがって、優先ルール2を適用して変数の個数が多いほど優先順位を下げることにより、テスト入力データの演算量の低減化を図ることができる。
図17は、優先ルールテーブル1600に従って並び替えたあとの関連パスコンディション組テーブル1500を示す説明図である。図15と比較すると、優先ルール1にしたがって、関連パスコンディション組内のパス本数が多いレコードほど、上位に格納されている。図17では、関連パスコンディション組3のパス本数が4本なので、最上位の関連パスコンディション組となる。また、関連パスコンディション組6は、パス本数は3本であるが、共通の条件式の変数の個数が2個であるため、6番目に位置している。ただし、関連パスコンディション組5とは変数の個数が同一であるが、パス本数が多いため、関連パスコンディション組5よりも上位となる。
生成部1107は、関連パスコンディション組テーブル1500を参照して、パスごとのテスト入力データを生成する。具体的には、たとえば、生成部1107は、図1に示したように、可能な限り、既存解を流用し、流用できない場合に限り求解部1103で充足解を求める。
図18は、生成部1107の詳細な機能的構成例を示すブロック図である。生成部1107は、選択部1801と、判断部1802と、対応付け部1803と、取得部1804と、設定部1805と、を有する。
選択部1801は、関連パスコンディション組テーブル1500の中からいずれかの関連パスコンディション組を選択する。関連パスコンディション組の選択はランダムでもよい。また、並び替え部1106により並び替えられた場合は、選択部1801は、関連パスコンディション組テーブル1500の最上位のレコードの関連パスコンディション組を選択する。これにより、選択部1801は、優先ルール1により、パス本数が多い関連パスコンディション組から優先選択することができるため、既存解の流用先が多くなる。したがって、求解部1103によるテスト入力データの演算量の低減化を図ることができる。
また、優先ルール2も適用されている場合、変数が複数個あっても既存解が流用される変数も出現し、解が得られていない変数の個数が減少する。したがって、上位の関連パスコンディション組から優先選択することにより、変数の個数が多い関連パスコンディション組の選択を抑制し、テスト入力データの演算量の低減化を図ることができる。
また、選択部1801は、選択された関連パスコンディション組に存在する複数のパスの中から、いずれかのパスを選択する。たとえば、図17の関連パスコンディション組3に存在する{パス2,パス4,パス5,パス7}の中からランダムにパスを1つ選択する。
また、選択部1801は、選択された関連パスコンディション組に存在する複数のパスの中から、パスコンディションに含まれており、かつ、充足解が得られていない変数の個数が最小であるパスを選択する。ここで、「パスコンディションに含まれており、かつ、充足解が得られていない変数」とは、パスコンディションには規定されているが求解部1103や流用により値が得られていない変数である。たとえば、パスコンディションには変数x,yが規定されており、変数xのみ、求解部1103または他のパスからの流用によりx=−1が得られている場合、変数yが該当する。
また、「パスコンディションに含まれており、かつ、充足解が得られていない変数の個数が最小であるパス」とは、充足解が得られていない変数を含むパス群の中で、充足解となるテスト入力データが得られた変数が最大のパスである。たとえば、変数x,yのいずれも充足解が得られていないパスと、変数x,yのうちxのみ充足解が得られているパスがある場合、後者のパスが選択される。充足解が得られていない変数を含むパスが対象となるため、全変数の充足解が得られているパスは選択対象外である。このようなパスは、図1に示したように、解決済となるため、選択する必要がない。
判断部1802は、選択部1801によって選択されたパスのパスコンディションに含まれている変数について当該パスコンディションを満たす充足解が存在し、かつ、変数が共通の条件式に含まれているか否かを判断する。たとえば、図1の(A)に示したように、選択パスをパス2とすると、パス2には変数xの充足解x=−1が存在し、かつ、変数xが共通の条件式「x<0」がパス4,パス5,パス7との共通の条件式となる。
選択されたパスのパスコンディションに含まれている変数について当該パスコンディションを満たす充足解が存在し、かつ、変数が共通の条件式に含まれていると判断された場合、対応付け部1803による処理が実行される。
また、選択されたパスのパスコンディションに含まれている変数について当該パスコンディションを満たす充足解が存在しないと判断された場合、求解部1103から充足解を求めることになる。また、充足解が存在するが、変数が共通の条件式に含まれていないと判断された場合も、求解部1103から充足解を求めることになる。
対応付け部1803は、判断部1802によって充足解が存在し、かつ、変数が共通の条件式に含まれていると判断された場合、選択中の関連パスコンディション組に存在する複数のパスのうち、選択されたパス以外のパスのパスコンディションに、充足解を対応付ける。具体的には、たとえば、図1の(A)に示したように、対応付け部1803は、選択されたパス(たとえば、パス2)以外のパス(パス4,パス5,パス7)に充足解「x=−1」を流用する。これにより、流用先の他のパスでは、流用された充足解を求解部1103で求める必要がなくなり、求解部1103による演算量の低減化を図ることができる。
取得部1804は、求解部1103から充足解を取得する。具体的には、取得部1804は、選択されたパスのパスコンディションに含まれている変数について当該パスコンディションを満たす充足解が存在しないと判断された場合、求解部1103から充足解を取得する。この場合、取得部1804は、充足解が存在しないと判断されたパスコンディションを求解部1103に渡す。求解部1103は、渡されたパスコンディションから充足解を求め、取得部1804に返す。
たとえば、図1の(A)では、選択パス2の変数x,yについて充足解が存在していないため、選択パス2のパスコンディションを求解部1103に渡して、充足解{x=−1,y=−1}を取得する。この場合、対応付け部1803は、選択パス2のパスコンディションに、充足解{x=−1,y=−1}を対応付けて、テスト入力データテーブル100のパス2についての既存解制約項目に格納する。
また、取得部1804は、判断部1802によって充足解が存在するが、変数が共通の条件式に含まれていないと判断された場合、選択されたパスのパスコンディションおよび充足解を求解部1103に与える。これにより、取得部1804は、選択されたパスのパスコンディションに含まれている変数以外の他の変数についての他の充足解をソルバから取得する。
たとえば、図1の(B)では、選択パス6の変数yについては充足解「y=−1」が得られているが、変数xについては充足解はまだ得られていない。したがって、取得部1804は、選択パス6のパスコンディションと変数yの充足解「y=−1」を求解部1103に渡して、変数xの充足解「x=0」を取得する。この場合、対応付け部1803は、選択パス6のパスコンディションに対応付けられた充足解「y=−1」に、さらに充足解「x=0」を対応付けて、テスト入力データテーブル100のパス6についての既存解制約項目に格納する。
設定部1805は、パスコンディションに含まれているいずれの変数についても充足解がパスコンディションに対応付けられたパスを、解決済みパスに設定する。具体的には、たとえば、設定部1805は、図1に示したように、変数x,yのいずれについても充足解が得られたパスについて解決済フラグを設定する。解決済フラグが設定されたパスは、選択部1801の選択対象外となる。そして、全パスについて解決済フラグが設定されると、テスト入力データが網羅される。
これにより、テスト入力データを求めるための求解部1103の演算量の低減化を図ることができる。したがって、テスト入力データを効率的に生成することができ、生成時間の短縮化を図ることができる。
<生成部1107の動作例>
つぎに、生成部1107の動作例について図19〜図24を用いて説明する。ここでは、図17に示した並び替え後の関連パスコンディション組テーブル1500を用いて説明する。
図19は、生成部1107の動作例1を示す説明図である。図19は、初期状態からの動作例を示している。選択部1801は、関連パスコンディション組テーブル1500の未選択の関連パスコンディション組の中から最上位の関連パスコンディション組を選択する。図19では、選択部1801は、ID:3の関連パスコンディション組3={パス2,パス4,パス5,パス7}を選択する。そして、選択部1801は、関連パスコンディション組3の中からいずれかのパスを選択する。ここでは、選択部1801は、パス2を選択パスとして選択したものとする。
選択パス2は、最初に選択されたパスであるため、テスト入力データテーブル100の既存解制約項目は空である。すなわち、流用元となる既存解がないため、取得部1804は、選択パス2のパスコンディションである[x<0,y<0]を、求解部1103に与える。これにより、求解部1103は、充足解{x=−1,y=−1}を出力するため、取得部1804は、充足解{x=−1,y=−1}を取得して、テスト入力データテーブル100のパス2の既存解制約項目に登録する。
また、設定部1805は、選択パス2の既存解制約項目に、パスコンディションの変数x,yについて充足解{x=−1,y=−1}が既存解制約として登録されたため、解決済フラグを「解決済」に設定する。「●」は、便宜的に「未解決」から「解決済」に変更したことを示している。
また、選択中の関連パスコンディション組3における共通の条件式は「x<0」である。すなわち、選択パス2や選択パス2以外の未選択パス4,5,7の各パスコンディションにも要素条件式「x<0」が含まれている。したがって、対応付け部1803は、選択パス2の既存解制約項目に登録された充足解{x=−1,y=−1}のうち、共通の条件式「x<0」に規定されている変数xの充足解「x=−1」を、パス4,パス5,パス7の既存解制約項目に登録する。
このように、選択パス2の充足解「x=−1」が流用されたことになり、パス4,パス5,パス7の変数xの充足解については求解部1103で求める必要がなくなる。なお、図19では、パス4,パス5,パス7の充足解は変数xのみであるため、解決済項目は、「未解決」のままである。
図20は、生成部1107の動作例2を示す説明図である。図20は、図19の動作例1からの動作例を示している。選択部1801は、関連パスコンディション組テーブル1500の未選択の関連パスコンディション組の中から最上位の関連パスコンディション組を選択する。図20では、選択部1801は、選択済みの関連パスコンディション組3を除いて最上位となる、ID:4の関連パスコンディション組4={パス2,パス3,パス6}を選択する。{パス2,パス3,パス6}のうちパス2は解決済である。
また、選択中の関連パスコンディション組4の共通の条件式は、「y<0」である。すなわち、パス2,パス3,パス6の各パスコンディションには要素条件式「y<0」が含まれている。したがって、対応付け部1803は、解決済のパス2の既存解制約項目に登録された充足解{x=−1,y=−1}のうち、共通の条件式「y<0」に規定されている変数yの充足解「y=−1」を、パス3,パス6の既存解制約項目に登録する。
これにより、解決済のパス2の充足解「y=−1」が流用されたことになり、パス3,パス6の変数yの充足解については求解部1103で求める必要がなくなる。なお、図20では、パス3,パス6の充足解は変数yのみであるため、解決済項目は、「未解決」のままである。
図21は、生成部1107の動作例3を示す説明図である。図21は、図20の動作例2からの動作例を示している。選択部1801は、関連パスコンディション組テーブル1500の未選択の関連パスコンディション組の中から最上位の関連パスコンディション組を選択する。図21では、選択部1801は、選択済みの関連パスコンディション組3,4を除いて最上位となる、ID:1の関連パスコンディション組1={パス1,パス6}を選択する。
{パス1,パス6}のうち解決済のパスは存在しない。この場合、{パス1,パス6}からランダムにまたは番号順に選択するのではなく、非充足変数の個数が最小となるパスを優先して選択するのが好ましい。具体的には、パス1の既存解制約項目には何も登録されていないため、変数x,yはともに、充足解が得られていない非充足変数である。したがって、パス1の非充足変数の個数は「2」である。
これに対し、パス6の既存解制約項目には「y=−1」が登録されている(図20を参照)。このため、パス6については、変数x,yのうち変数xが、充足解が得られていない非充足変数である。したがって、パス6の非充足変数の個数は「1」である。選択部1801は、パス1の非充足変数の個数「2」とパス6の非充足変数の個数「1」とを比較し、個数が最小となるパスを優先選択する。この場合、選択部1801は、{パス1,パス6}のうちパス6を優先選択することになる。このように優先選択することで、充足解の流用性の向上を図ることができ、求解部1103による演算量の低減化を図ることができる。
また、選択パス6については、変数xの充足解が既存解制約項目に登録されていない。したがって、取得部1804は、選択パス6のパスコンディションである[x>=0,y<0,x+y<12]および既存解制約「y=−1」を、求解部1103に与える。これにより、求解部1103は、充足解{x=0}を出力するため、取得部1804は、充足解{x=0}を取得して、テスト入力データテーブル100のパス6の既存解制約項目に登録する。
また、設定部1805は、選択パス6の既存解制約項目に、パスコンディションの変数x,yについて充足解{x=0,y=−1}が既存解制約として登録されたため、解決済フラグを「解決済」に設定する。「●」は、便宜的に「未解決」から「解決済」に変更したことを示している。
また、選択中の関連パスコンディション組1における共通の条件式は「x>=0」である。すなわち、選択パス6や選択パス6以外の未選択パス1の各パスコンディションにも要素条件式「x>=0」が含まれている。したがって、対応付け部1803は、選択パス6の既存解制約項目に登録された充足解{x=0,y=−1}のうち、共通の条件式「x<0」に規定されている変数xの充足解「x=0」を、選択パス1の既存解制約項目に登録する。
このように、選択パス6の充足解「x=0」が流用されたことになり、パス1の変数xの充足解については求解部1103で求める必要がなくなる。なお、図21では、パス1の充足解は変数xのみであるため、解決済項目は、「未解決」のままである。
図22は、生成部1107の動作例4を示す説明図である。図22は、図21の動作例3からの動作例を示している。選択部1801は、関連パスコンディション組テーブル1500の未選択の関連パスコンディション組の中から最上位の関連パスコンディション組を選択する。図22では、選択部1801は、選択済みの関連パスコンディション組3,4,1を除いて最上位となる、ID:2の関連パスコンディション組2={パス1,パス7}を選択する。
{パス1,パス7}のうち解決済のパスは存在しない。また、{パス1,パス7}はいずれも変数yのみが非充足変数であるため、非充足変数の個数はともに「1」である。したがって、選択部1801は、{パス1,パス7}のいずれかを選択する。ここでは、選択部1801は、パス1を選択パスとして選択したものとする。
また、選択パス1については、変数yの充足解が既存解制約項目に登録されていない。したがって、取得部1804は、選択パス1のパスコンディションである[x>=0,y>=0]および既存解制約「x=0」を、求解部1103に与える。これにより、求解部1103は、充足解{y=0}を出力するため、取得部1804は、充足解{y=0}を取得して、テスト入力データテーブル100の選択パス1の既存解制約項目に登録する。
また、設定部1805は、選択パス1の既存解制約項目に、パスコンディションの変数x,yについて充足解{x=0,y=0}が既存解制約として登録されたため、解決済フラグを「解決済」に設定する。「●」は、便宜的に「未解決」から「解決済」に変更したことを示している。
また、選択中の関連パスコンディション組2における共通の条件式は「y>=0」である。すなわち、選択パス1や選択パス1以外の未選択パス7の各パスコンディションにも要素条件式「y>=0」が含まれている。したがって、対応付け部1803は、選択パス1の既存解制約項目に登録された充足解{x=0,y=0}のうち、共通の条件式「y>=0」に規定されている変数yの充足解「y=0」を、パス7の既存解制約項目に登録する。
このように、選択パス1の充足解「y=0」が流用されたことになり、パス7の変数yの充足解については求解部1103で求める必要がなくなる。
また、設定部1805は、未選択パス7の既存解制約項目に、パスコンディションの変数x,yについて充足解{x=−1,y=0}が既存解制約として登録されたため、解決済フラグを「解決済」に設定する。「●」は、便宜的に「未解決」から「解決済」に変更したことを示している。
図23は、生成部1107の動作例5を示す説明図である。図23は、図22の動作例4からの動作例を示している。選択部1801は、関連パスコンディション組テーブル1500の未選択の関連パスコンディション組の中から最上位の関連パスコンディション組を選択する。図23では、選択部1801は、選択済みの関連パスコンディション組3,4,1,2を除いて最上位となる、ID:6の関連パスコンディション組6={パス5,パス6,パス7}を選択する。{パス5,パス6,パス7}のうちパス6,パス7は解決済である。したがって、選択部1801は、残りのパスのうち、非充足変数が最小となるパスを選択パスとして選択する。図23の場合、パス5しか残されていないため、選択部1801は、パス5を選択パスとして選択することになる。
また、選択パス5については、変数yの充足解が既存解制約項目に登録されていない。したがって、取得部1804は、選択パス5のパスコンディションである[x<0,y>=10,x+y<12]および既存解制約「x=−1」を、求解部1103に与える。これにより、求解部1103は、充足解{y=10}を出力するため、取得部1804は、充足解{y=10}を取得して、テスト入力データテーブル100の選択パス5の既存解制約項目に登録する。
また、設定部1805は、選択パス5の既存解制約項目に、パスコンディションの変数x,yについて充足解{x=−1,y=10}が既存解制約として登録されたため、解決済フラグを「解決済」に設定する。「●」は、便宜的に「未解決」から「解決済」に変更したことを示している。
図24は、生成部1107の動作例6を示す説明図である。図24は、図23の動作例5からの動作例を示している。選択部1801は、関連パスコンディション組テーブル1500の未選択の関連パスコンディション組の中から最上位の関連パスコンディション組を選択する。図24では、選択部1801は、最後に残されたID:5の関連パスコンディション組5={パス3,パス4}を選択する。{パス3,パス4}はともに未解決である。したがって、選択部1801は、残りのパスのうち、非充足変数が最小となるパスを選択パスとして選択する。図24の場合、パス3の非充足変数は変数xであり、パス4の非充足変数は変数yであるが、ともに非充足変数の個数は1個であるため、選択部1801は、{パス3,パス4}のいずれかのパスを選択する。ここでは、パス3、を選択したものとする。
また、選択パス3については、変数xの充足解が既存解制約項目に登録されていない。したがって、取得部1804は、選択パス3のパスコンディションである[x>=2,y<0,x+y>=12]および既存解制約「y=−1」を、求解部1103に与える。これにより、求解部1103は、充足解{x=13}を出力するため、取得部1804は、充足解{x=13}を取得して、テスト入力データテーブル100の選択パス3の既存解制約項目に登録する。
また、設定部1805は、選択パス3の既存解制約項目に、パスコンディションの変数x,yについて充足解{x=13,y=−1}が既存解制約として登録されたため、解決済フラグを「解決済」に設定する。「●」は、便宜的に「未解決」から「解決済」に変更したことを示している。
また、選択部1801は、パス4の変数xについては充足解が得られているため、パス3の既存解制約「x=13」を流用できない。したがって、選択部1801は、パス4を選択する。パス4については、変数yの充足解が既存解制約項目に登録されていない。したがって、取得部1804は、選択パス4のパスコンディションである[x<0,y>=10,x+y>12]および既存解制約「x=−1」を、求解部1103に与える。これにより、求解部1103は、充足解{y=13}を出力するため、取得部1804は、充足解{y=13}を取得して、テスト入力データテーブル100の選択パス4の既存解制約項目に登録する。
また、設定部1805は、選択パス4の既存解制約項目に、パスコンディションの変数x,yについて充足解{x=−1,y=13}が既存解制約として登録されたため、解決済フラグを「解決済」に設定する。「●」は、便宜的に「未解決」から「解決済」に変更したことを示している。これにより、全パスについて解決済となったため、パス1〜パス7のテスト入力データが得られたことになる。
<テスト入力データ生成処理手順例>
図25は、テスト入力データ生成処理手順例を示すフローチャートである。図25において、生成装置1100は、分解部1104によるパスコンディション分解処理(ステップS2501)、関連付け部1105によるパスコンディション関連付け処理(ステップS2502)、並び替え部1106による並び替え処理(ステップS2503)、生成部1107による生成処理(ステップS2504)を実行する。これにより、生成装置1100は、図24に示したようなテスト入力データテーブル100を得ることができ、テスト入力データ生成処理を終了する。
なお、関連パスコンディション組テーブル1500が存在すれば、生成処理(ステップS2504)を実行するだけで、生成装置1100は、テスト入力データを生成することができる。したがって、関連パスコンディション組テーブル1500が生成装置1100に読み込まれている場合、パスコンディション分解処理(ステップS2501)〜並び替え処理(ステップS2503)は必ずしも実行する必要はない。
図26は、図25に示したパスコンディション分解処理(ステップS2501)の詳細な処理手順例を示すフローチャートである。図26において、生成装置1100は、まず、テスト対象プログラム200についてのパスコンディション群を受け取る(ステップS2601)。具体的には、たとえば、生成装置1100は、図12に示したようなパスコンディション群を取得する。
そして、生成装置1100は、受け取ったパスコンディション群の中から未選択のパスコンディションがあるか否かを判断する(ステップS2602)。未選択のパスコンディションがない場合(ステップS2602:No)、パスコンディション分解処理(ステップS2501)を終了する。一方、未選択のパスコンディションがある場合(ステップS2602:Yes)、生成装置1100は、未選択のパスコンディションを1つ選択する(ステップS2603)。たとえば、図13の(A)に示したように、生成装置1100は、パス3のパスコンディションを選択する。
つぎに、生成装置1100は、選択されたパスコンディションを論理演算子「&&」で分割して、複数の条件式を得る(ステップS2604)。たとえば、生成装置1100は、図13の(B)に示したような複数の条件式を得る。
そして、生成装置1100は、複数の条件式のうち論理否定演算子「!」を有する条件式について、論理否定演算子「!」を削除し、削除後の条件式の比較演算子を反対の意味を有する比較演算子に置換する(ステップS2605)。たとえば、生成装置1100は、図13の(C)に示したように、条件式「!(y>=0)」を条件式「y<0」に変換する。
つぎに、生成装置1100は、複数の条件式を整理する(ステップS2606)。たとえば、生成装置1100は、図13の(D)に示したように、条件式「(y+−10)<0」を「y<10」に変換する。
そして、生成装置1100は、複数の条件式の順番を並び替える(ステップS2607)。たとえば、生成装置1100は、図13の(E)に示したように、変数の個数やアルファベット順、比較演算子の大小関係により、条件式を並べ替える。
つぎに、生成装置1100は、包含関係のある条件式をまとめる(ステップS2608)。たとえば、生成装置1100は、図13の(F)に示したように、条件式「y<0」および「y<10」を、「y<0」にする。すなわち、生成装置1100は、条件式「y<10」を削除する。
最後に、生成装置1100は、複数の条件式をパスコンディションの要素条件式として記憶装置に格納し(ステップS2609)、ステップS2602に戻る。たとえば、図13の(F)に示した複数の条件式を、テスト入力データテーブル100のパスコンディション項目に格納する。これにより、図14に示したような分解結果が得られることになり、パスコンディション内の条件式が簡略化される。したがって、生成装置1100は、テスト入力データの生成を効率的におこなうことができる。
図27は、図26に示したパスコンディション関連付け処理(ステップS2502)の詳細な処理手順例を示すフローチャートである。図27において、生成装置1100は、まず、パス群の中に未選択パスがあるか否かを判断する(ステップS2701)。未選択パスがある場合(ステップS2701:Yes)、生成装置1100は、未選択パスを1つ選択して関連元パスとする(ステップS2702)。たとえば、パス1〜パス7の中からパス1が選択された場合、パス1が関連元パスとなる。
つぎに、生成装置1100は、関連元パス以外のパス群に未選択パスがあるか否かを判断する(ステップS2703)。未選択パスがない場合(ステップS2703:No)、ステップS2701に戻る。一方、未選択パスがある場合(ステップS2703:Yes)、生成装置1100は、未選択パスを1つ選択し、関連先候補とする(ステップS2704)。たとえば、関連元パスがパス1である場合、生成装置1100は、パス2〜パス7の中の未選択パスとして、たとえば、パス2を選択して、関連先候補とする。
そして、生成装置1100は、関連元パスの要素条件式と関連先候補の要素条件式との間に共通部分、すなわち、共通の条件式があるか否かを判断する(ステップS2705)。たとえば、関連元パスがパス1、関連先候補がパス2の場合、共通の条件式はない。一方、パス6が関連先候補になった場合、関連元パスであるパス1との共通の条件式は、「x>=0」である。生成装置1100は、共通部分がない場合(ステップS2705:No)、ステップS2703に戻る。一方、共通部分がある場合(ステップS2705:Yes)、生成装置1100は、両パスを関連パスコンディション組みに決定する(ステップS2706)。たとえば、パス1とパス6は、関連パスコンディション組となる。
つぎに、生成装置1100は、関連パスコンディション組と共通部分とを関連付けて記憶装置に格納し(ステップS2707)、ステップS2703に戻る。たとえば、生成装置1100は、関連パスコンディション組{パス1,パス6}を関連パスコンディション組テーブル1500に格納する。
また、ステップS2701において、未選択パスがない場合(ステップS2701:No)、生成装置1100は、関連パスコンディション組のまとめ処理を実行する(ステップS2708)。たとえば、関連パスコンディション組として、共通の条件式「x>=0」について、パス1が関連元パスの場合に得られた{パス1,パス6}とパス6が関連元パスの場合に得られた{パス6,パス1}は、同一内容である。したがって、生成装置1100は、いずれか一方を削除する。
また、共通の条件式「y<0」については、パス2が関連元パスの場合の{パス2,パス3},{パス2,パス6}と、パス3が関連元パスの場合の{パス3,パス2},{パス3,パス6}と、が得られる。また、パス6が関連元パスの場合の{パス6,パス2},{パス6,パス3}が得られる。この場合、生成装置1100は、重複する{パス3,パス2},{パス6,パス2},{パス6,パス3}を削除する。そして、生成装置1100は、残された{パス2,パス3},{パス2,パス6},{パス3,パス6}を統合して、{パス2,パス3,パス6}にする。
これにより、関連パスコンディション組の数が圧縮されるため、生成装置1100は、テスト入力データの生成の際に発生する重複処理を防止することができる。このようにして、関連パスコンディション組テーブル1500が生成されることになり、パスコンディション関連付け処理(ステップS2502)を終了する。
図28は、図25に示した並び替え処理(ステップS2503)の詳細な処理手順例を示すフローチャートである。図28において、生成装置1100は、まず、関連パスコンディション組テーブル1500を読み込み(ステップS2801)、ルールIDの変数rをr=1に設定する(ステップS2802)。そして、生成装置1100は、r>rmaxであるか否かを判断する(ステップS2803)。rmaxはrの最大値であり、最も優先順位が低いことを示す。
r>rmaxでない場合(ステップS2803:No)、生成装置1100は、図16の優先ルールテーブル1600を参照して、ルールID:rである優先ルールrによる並び替え処理を実行する(ステップS2804)。そして、生成装置1100は、rをインクリメントして(ステップS2805)、ステップS2803に戻る。ステップS2803において、r>maxになった場合(ステップS2803:Yes)、並び替え処理を終了する。これにより、たとえば、図15の関連パスコンディション組テーブル1500が図17の関連パスコンディション組テーブル1500となる。
図29は、図25に示した生成処理(ステップS2504)の詳細な処理手順例(その1)を示すフローチャートである。図29において、生成装置1100は、まず、関連パスコンディション組テーブル1500を読み込む(ステップS2901)。読み込み対象となる関連パスコンディション組テーブル1500は、並び替え処理(ステップS2503)をおこなっていないものでもよく、並び替え処理(ステップS2503)の処理後のものでもよい。
つぎに、生成装置1100は、未選択の関連パスコンディション組があるか否かを判断する(ステップS2902)。未選択の関連パスコンディション組がある場合(ステップS2902:Yes)、生成装置1100は、未選択の関連パスコンディション組を1つ選択する(ステップS2903)。たとえば、並び替え処理(ステップS2503)を行った場合、生成装置1100は、未選択であってかつ最上位の関連パスコンディション組を選択することになる。
そして、生成装置1100は、選択中の関連パスコンディション組の中に、未選択の解決済パスがあるか否かを判断する(ステップS2904)。解決済パスとは、テスト入力データテーブル100において解決済フラグが「解決済」に設定されたパスである。
選択中の関連パスコンディション組の中に、未選択の解決済パスがある場合(ステップS2904:Yes)、生成装置1100は、未選択の解決済パスを1つ選択する(ステップS2905)。そして、生成装置1100は、選択された解決済パスの既存解制約のうち、選択中の関連パスコンディション組に対応する共通の条件式に含まれる変数について既存解制約があるか否かを判断する(ステップS2906)。
たとえば、図20を例に挙げると、選択中の関連パスコンディション組4の中には、解決済パス2が含まれている。この場合、選択中の関連パスコンディション組4に対応する共通の条件式「y<0」に含まれる変数yについて、解決済パス2には、既存解制約「y=−1」が存在する。
そして、生成装置1100は、既存解制約がない場合(ステップS2906:No)、ステップS2902に戻る。一方、既存解制約がある場合(ステップS2906:Yes)、生成装置1100は、選択中の関連パスコンディション組のうち未選択パスに、存在すると判断された既存解制約を設定する(ステップS2907)。図20の例では、既存解制約「y=−1」が存在するため、生成装置1100は、テスト入力データテーブル100において、選択中の関連パスコンディション組4のうち未選択パス3,パス6に、既存解制約「y=−1」を格納する。これにより、生成装置1100は、既存解制約を流用することができる。
このあと、生成装置1100は、既存解制約の流用先のパスの中に、全変数の充足解(既存解制約)を持つパスがあるか否かを判断する(ステップS2908)。全変数の充足解(既存解制約)を持つパスがある場合(ステップS2908:Yes)、生成装置1100は、該当するパスの解決済フラグを「解決済」に設定して(ステップS2909)、ステップS2902に戻る。一方、全変数の充足解(既存解制約)を持つパスがない場合も(ステップS2908:No)、ステップS2902に戻る。
また、ステップS2904において、選択中の関連パスコンディション組の中に、未選択の解決済パスがないと判断された場合(ステップS2904:No)、生成装置1100は、選択中の関連パスコンディション組の中から、非充足変数が最小のパスを選択して(ステップS2910)、図30のステップS3001に移行する。非充足変数が最小のパスを選択することで、生成装置1100は、既存解制約が多いパスを選択することができる。したがって、制約ソルバを利用する場合であっても、生成装置1100は、既存解制約が少ないパスに比べて演算量に抑制することができる。
また、ステップS2902において、未選択の関連パスコンディション組がない場合(ステップS2902:No)、現在選択中の関連パスコンディション組が最後の組となる。したがって、生成装置1100は、未解決パスがあるか否かを判断する(ステップS2911)。未解決パスがある場合(ステップS2911:Yes)、生成装置1100は、未解決パスを選択し(ステップS2912)、図30のステップS3001に移行して、制約ソルバにより解くことになる。たとえば、図24に示したように、パス3の変数xとパス4の変数yについて、生成装置1100は、制約ソルバから充足解を得ることになる。一方、未解決パスがない場合(ステップS2911:No)、充足解がすべて得られたため、生成装置1100は、生成処理を終了する。これにより、各パスについてテスト入力データが生成されたことになる。
図30は、図25に示した生成処理(ステップS2504)の詳細な処理手順例(その2)を示すフローチャートである。図30において、生成装置1100は、ステップS2910またはステップS2912により選択されたパスにおいて、既存解制約があるか否かを判断する(ステップS3001)。既存解制約がない場合(ステップS3001:No)、生成装置1100は、選択パスのパスコンディションを制約ソルバに与え、制約ソルバで求められた充足解を取得して(ステップS3002)、ステップS3004に移行する。たとえば、図19に示したように、選択パス2には既存解制約がないため、選択パス2のパスコンディションを制約ソルバに与えることにより、生成装置1100は、充足解「x=−1」、「y=−1」を得る。
一方、既存解制約がある場合(ステップS3001:Yes)、生成装置1100は、選択パスのパスコンディションおよび既存解制約を制約ソルバに与え、制約ソルバで求められた充足解を取得して(ステップS3003)、ステップS3004に移行する。たとえば、図21に示したように、選択パス6には変数yについてのみ既存解制約「y=−1」があるため、選択パス6のパスコンディションおよび既存解制約「y=−1」を制約ソルバに与えることにより、生成装置1100は、充足解「x=0」を得る。
このあと、生成装置1100は、ステップS3002またはステップS3003により取得した充足解を既存解制約に設定する(ステップS3004)。そして、生成装置1100は、既存解制約が設定された選択パスにおいて、全変数の充足解(既存解制約)を持つか否かを判断する(ステップS3005)。全変数の充足解(既存解制約)を持つ場合(ステップS3005:Yes)、生成装置1100は、選択パスの解決済フラグを「解決済」に設定して(ステップS3006)、ステップS2904に戻る。一方、全変数の充足解(既存解制約)を持たない場合も(ステップS3005:No)、ステップS2904に戻る。
図30に示した処理手順によれば、生成装置1100は、未解決の選択パスに既存解制約がない場合は制約ソルバで全変数の充足解を得ることができる。また、既存解制約がある場合は、生成装置1100は、既存解制約を制約ソルバに与えて、未知の充足解を得ることができる。すなわち、非充足変数についてのみ充足解が求められるため、制約ソルバによる演算量の低減化を図ることができる。
このように、本実施の形態によれば、共通の条件式を満たす充足解を流用することができるため、テスト入力データを求める際の制約ソルバによる演算量の低減化を図ることができる。したがって、テスト入力データの生成効率の向上を図ることができる。また、これにともない、テスト入力データを使用する期待値算出の計算量の低減化も図ることができる。
また、一部の変数についてのみ充足解が得られていない場合には、そのパスのパスコンディションだけでなく、既存解制約も制約ソルバに与えることにより、充足解が得られていない変数についてのみ充足解を得ることができる。このように、パスコンディションだけでなく既存解制約も制約ソルバに与えることにより、制約ソルバでの演算量の低減化を図ることができる。したがって、テスト入力データの生成効率の向上を図ることができる。
また、解決済パスのパスコンディションについては非充足変数が存在しないため、選択対象外とすることにより、テスト入力データの重複生成を回避することができ、生成効率の向上を図ることができる。
また、関連パスコンディション組の中からパスを選択する場合、非充足変数の個数が最小のパスを選択することにより、充足解をより多く持つパスを優先的に選択することができる。したがって、選択パスに存在する既存解制約を流用できる可能性が上がり、テスト入力データの生成効率の向上を図ることができる。
また、関連パスコンディション組について、条件式の個数により優先順位を設定することにより、流用先が多くなるように優先的に関連パスコンディション組を選択することができる。したがって、テスト入力データの生成効率の向上を図ることができる。
また、条件式内の変数の個数により優先順位を設定することにより、制約ソルバを用いる場合でもできる限り変数の個数が少ないものから制約ソルバに与えることができ、制約ソルバの演算量の低減化を図るとができる。
また、パスコンディションを分解することにより、要素条件式に圧縮することができる。したがって、パス間で共通の条件式を探索しやすくなり、関連パスコンディション組テーブル1500の生成効率の向上を図ることができる。
上述した実施の形態に関し、さらに以下の付記を開示する。
(付記1)プログラムがシンボリック実行された場合の実行可能な経路であるパス群の各パスでの条件式の系列を示すパスコンディション間に共通の条件式がある複数のパスと前記共通の条件式とを関連付けた、前記共通の条件式と前記複数のパスとの組み合わせ群を記憶する記憶装置を参照して、前記組み合わせ群のいずれかの組み合わせに存在する複数のパスの中から、いずれかのパスを選択する選択部と、
前記選択部によって選択されたパスのパスコンディションに含まれている変数について当該パスコンディションを満たす充足解が存在し、かつ、前記変数が前記共通の条件式に含まれているか否かを判断する判断部と、
前記判断部によって前記充足解が存在し、かつ、前記変数が前記共通の条件式に含まれていると判断された場合、前記いずれかの組み合わせに存在する複数のパスのうち前記選択されたパス以外のパスのパスコンディションに、前記充足解を対応付けて、前記記憶装置に格納する対応付け部と、
を有することを特徴とする生成装置。
(付記2)前記判断部によって前記充足解が存在しないと判断された場合、前記選択されたパスのパスコンディションをソルバに与えることにより、前記充足解を前記ソルバから取得する取得部を備え、
前記対応付け部は、
前記選択されたパスのパスコンディションに、前記取得部によって取得された前記充足解を対応付けることを特徴とする付記1に記載の生成装置。
(付記3)前記判断部によって前記充足解が存在するが、前記変数が前記共通の条件式に含まれていないと判断された場合、前記選択されたパスのパスコンディションおよび前記充足解をソルバに与えることにより、前記選択されたパスのパスコンディションに含まれている前記変数以外の他の変数についての他の充足解を前記ソルバから取得する取得部を備え、
前記対応付け部は、
前記選択されたパスのパスコンディションに、前記充足解および前記取得部によって取得された他の充足解を対応付けることを特徴とする付記1に記載の生成装置。
(付記4)パスコンディションに含まれているいずれの変数についても充足解がパスコンディションに対応付けられたパスを解決済みパスに設定する設定部を備え、
前記選択部は、
前記いずれかの組み合わせに存在する複数のパスのうち、前記設定部によって設定された解決済みパス以外の残余のパスの中から、いずれかのパスを選択することを特徴とする付記1〜3のいずれか一つに記載の生成装置。
(付記5)前記選択部は、
前記いずれかの組み合わせに存在する複数のパスの中から、パスコンディションに含まれており、かつ、充足解が得られていない変数の個数が最小であるパスを選択することを特徴とする付記1〜3のいずれか一つに記載の生成装置。
(付記6)前記パスコンディション群のうち、パスコンディション間に共通の条件式がある複数のパスと前記共通の条件式とを関連付けることにより、前記共通の条件式と前記複数のパスとの組み合わせ群を生成する関連付け部を備え、
前記選択部は、
前記関連付け部によって関連付けられた前記共通の条件式と前記複数のパスとの組み合わせ群のうち、いずれかの組み合わせに存在する複数のパスの中から、いずれかのパスを選択することを特徴とする付記1〜5のいずれか一つに記載の生成装置。
(付記7)パス個数の多い順に並び替える第1優先規則に従って、前記共通の条件式と前記複数のパスとの組み合わせ群を、当該組み合わせ群の各組み合わせに存在する前記複数のパスの個数が多い順に並び替える並び替え部を備え、
前記選択部は、
前記並び替え部による並び替え後の組み合わせ群のいずれかの組み合わせに存在する複数のパスの中から、いずれかのパスを選択することを特徴とする付記1〜6のいずれか一つに記載の生成装置。
(付記8)前記並び替え部は、
さらに、前記共通の条件式に含まれている変数の個数の少ない順に並び替える第2優先規則に従って、前記共通の条件式と前記複数のパスとの組み合わせ群を、当該組み合わせ群の各組み合わせに存在する前記複数のパスの個数が多い順に並び替えることを特徴とする付記7に記載の生成装置。
(付記9)前記パスコンディション群の少なくとも1のパスコンディションを論理積演算子を境界にして複数の条件式に分解する分解部を備え、
前記選択部は、
前記分解部による分解後のパスコンディション群のうち、パスコンディション間に共通の条件式がある複数のパスと前記共通の条件式とを関連付けた、前記共通の条件式と前記複数のパスとの組み合わせ群のいずれかの組み合わせに存在する複数のパスの中から、いずれかのパスを選択することを特徴とする付記1〜8のいずれか一つに記載の生成装置。
(付記10)前記分解部は、
前記複数の条件式を包含関係のある条件式どうしでまとめることを特徴とする付記9に記載の生成装置。
(付記11)前記分解部は、
前記複数の条件式のうち論理否定演算子を有する条件式から前記論理否定演算子を削除し、削除後の条件式に存在する比較演算子を反対の意味の比較演算子に変換することを特徴とする付記9または10に記載の生成装置。
(付記12)コンピュータが、
プログラムがシンボリック実行された場合の実行可能な経路であるパス群の各パスでの条件式の系列を示すパスコンディション間に共通の条件式がある複数のパスと前記共通の条件式とを関連付けた、前記共通の条件式と前記複数のパスとの組み合わせ群を記憶する記憶装置を参照して、前記組み合わせ群のいずれかの組み合わせに存在する複数のパスの中から、いずれかのパスを選択し、
選択されたパスのパスコンディションに含まれている変数について当該パスコンディションを満たす充足解が存在し、かつ、前記変数が前記共通の条件式に含まれているか否かを判断し、
前記充足解が存在し、かつ、前記変数が前記共通の条件式に含まれていると判断された場合、前記いずれかの組み合わせに存在する複数のパスのうち前記選択されたパス以外のパスのパスコンディションに、前記充足解を対応付けて、前記記憶装置に格納する、
処理を実行することを特徴とする生成方法。
(付記13)プログラムがシンボリック実行された場合の実行可能な経路であるパス群の各パスでの条件式の系列を示すパスコンディション間に共通の条件式がある複数のパスと前記共通の条件式とを関連付けた、前記共通の条件式と前記複数のパスとの組み合わせ群を記憶する記憶装置を参照して、前記組み合わせ群のいずれかの組み合わせに存在する複数のパスの中から、いずれかのパスを選択し、
前記選択部によって選択されたパスのパスコンディションに含まれている変数について当該パスコンディションを満たす充足解が存在し、かつ、前記変数が前記共通の条件式に含まれているか否かを判断し、
前記充足解が存在し、かつ、前記変数が前記共通の条件式に含まれていると判断された場合、前記いずれかの組み合わせに存在する複数のパスのうち前記選択されたパス以外のパスのパスコンディションに、前記充足解を対応付けて、前記記憶装置に格納する、
処理をコンピュータに実行させることを特徴とする生成プログラム。