(57)【特許請求の範囲】
【請求項１】
プログラムがシンボリック実行された場合の実行可能な経路であるパス群の各パスでの条件式の系列を示すパスコンディション間に共通の条件式がある複数のパスと前記共通の条件式とを関連付けた、前記共通の条件式と前記複数のパスとの組み合わせ群を記憶する記憶装置を参照して、前記組み合わせ群のいずれかの組み合わせに存在する複数のパスの中から、いずれかのパスを選択する選択部と、
前記選択部によって選択されたパスのパスコンディションに含まれている変数について当該パスコンディションを満たす充足解が存在し、かつ、前記変数が前記共通の条件式に含まれているか否かを判断する判断部と、
前記判断部によって前記充足解が存在し、かつ、前記変数が前記共通の条件式に含まれていると判断された場合、前記いずれかの組み合わせに存在する複数のパスのうち前記選択されたパス以外のパスのパスコンディションに、前記充足解を対応付けて、前記記憶装置に格納する対応付け部と、
を有することを特徴とする生成装置。
【請求項２】
前記判断部によって前記充足解が存在しないと判断された場合、前記選択されたパスのパスコンディションをソルバに与えることにより、前記充足解を前記ソルバから取得する取得部を備え、
前記対応付け部は、
前記選択されたパスのパスコンディションに、前記取得部によって取得された前記充足解を対応付けることを特徴とする請求項１に記載の生成装置。
【請求項３】
前記判断部によって前記充足解が存在するが、前記変数が前記共通の条件式に含まれていないと判断された場合、前記選択されたパスのパスコンディションおよび前記充足解をソルバに与えることにより、前記選択されたパスのパスコンディションに含まれている前記変数以外の他の変数についての他の充足解を前記ソルバから取得する取得部を備え、
前記対応付け部は、
前記選択されたパスのパスコンディションに、前記充足解および前記取得部によって取得された他の充足解を対応付けることを特徴とする請求項１に記載の生成装置。
【請求項４】
前記選択部は、
前記いずれかの組み合わせに存在する複数のパスの中から、パスコンディションに含まれており、かつ、充足解が得られていない変数の個数が最小であるパスを選択することを特徴とする請求項１〜３のいずれか一つに記載の生成装置。
【請求項５】
前記パスコンディション群のうち、パスコンディション間に共通の条件式がある複数のパスと前記共通の条件式とを関連付けることにより、前記共通の条件式と前記複数のパスとの組み合わせ群を生成する関連付け部を備え、
前記選択部は、
前記関連付け部によって関連付けられた前記共通の条件式と前記複数のパスとの組み合わせ群のうち、いずれかの組み合わせに存在する複数のパスの中から、いずれかのパスを選択することを特徴とする請求項１〜４のいずれか一つに記載の生成装置。
【請求項６】
パス個数の多い順に並び替える第１優先規則に従って、前記共通の条件式と前記複数のパスとの組み合わせ群を、当該組み合わせ群の各組み合わせに存在する前記複数のパスの個数が多い順に並び替える並び替え部を備え、
前記選択部は、
前記並び替え部による並び替え後の組み合わせ群のいずれかの組み合わせに存在する複数のパスの中から、いずれかのパスを選択することを特徴とする請求項１〜５のいずれか一つに記載の生成装置。
【請求項７】
前記パスコンディション群の少なくとも１のパスコンディションを論理積演算子を境界にして複数の条件式に分解する分解部を備え、
前記選択部は、
前記分解部による分解後のパスコンディション群のうち、パスコンディション間に共通の条件式がある複数のパスと前記共通の条件式とを関連付けた、前記共通の条件式と前記複数のパスとの組み合わせ群のいずれかの組み合わせに存在する複数のパスの中から、いずれかのパスを選択することを特徴とする請求項１〜６のいずれか一つに記載の生成装置。
【請求項８】
コンピュータが、
プログラムがシンボリック実行された場合の実行可能な経路であるパス群の各パスでの条件式の系列を示すパスコンディション間に共通の条件式がある複数のパスと前記共通の条件式とを関連付けた、前記共通の条件式と前記複数のパスとの組み合わせ群を記憶する記憶装置を参照して、前記組み合わせ群のいずれかの組み合わせに存在する複数のパスの中から、いずれかのパスを選択し、
前記選択されたパスのパスコンディションに含まれている変数について当該パスコンディションを満たす充足解が存在し、かつ、前記変数が前記共通の条件式に含まれているか否かを判断し、
前記充足解が存在し、かつ、前記変数が前記共通の条件式に含まれていると判断された場合、前記いずれかの組み合わせに存在する複数のパスのうち前記選択されたパス以外のパスのパスコンディションに、前記充足解を対応付けて、前記記憶装置に格納する、
処理を実行することを特徴とする生成方法。
【請求項９】
プログラムがシンボリック実行された場合の実行可能な経路であるパス群の各パスでの条件式の系列を示すパスコンディション間に共通の条件式がある複数のパスと前記共通の条件式とを関連付けた、前記共通の条件式と前記複数のパスとの組み合わせ群を記憶する記憶装置を参照して、前記組み合わせ群のいずれかの組み合わせに存在する複数のパスの中から、いずれかのパスを選択し、
前記選択されたパスのパスコンディションに含まれている変数について当該パスコンディションを満たす充足解が存在し、かつ、前記変数が前記共通の条件式に含まれているか否かを判断し、
前記充足解が存在し、かつ、前記変数が前記共通の条件式に含まれていると判断された場合、前記いずれかの組み合わせに存在する複数のパスのうち前記選択されたパス以外のパスのパスコンディションに、前記充足解を対応付けて、前記記憶装置に格納する、
処理をコンピュータに実行させることを特徴とする生成プログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、生成装置、生成方法、および生成プログラムに関する。
【背景技術】
【０００２】
従来、プログラムをシンボリック実行することによってパスコンディションを抽出し、パスコンディションを満たす値を制約ソルバを利用して求め、求められた値をテスト入力データとする方法がある（たとえば、下記特許文献１，２を参照。）。
【０００３】
シンボリック実行（Ｓｙｍｂｏｌｉｃ  Ｅｘｅｃｕｔｉｏｎ）は、「記号実行」とも呼ばれる。シンボリック実行とは、プログラムの変数に具体的な確定値を入力する代わりにシンボル値と呼ばれる記号値を入力して、シンボル値のままプログラムを模擬的に実行し、プログラムの実行結果を評価する技術である。
【０００４】
プログラムをシンボリック実行した場合に得られる命令文の系列を、「パス」と呼ぶ。パスのうち、実行可能な命令系列を実行可能パスと呼び、実行不可能な命令系列を実行不能パスと呼ぶ。たとえば、あるパスのシンボリック実行の実行結果において、あるｉｆ文の「ｙ＞０」でｙｅｓに遷移し、そのあとに出現する他のｉｆ文の「ｙ＞０」でｎｏに遷移した場合、そのパスは実行不能パスとなる。
【０００５】
パスコンディションとは、プログラムに記述されたｉｆ文等の条件式から単純に算出されるものではなく、実行可能パスについて、条件式の間に実行された変数の更新結果も取り込んだ条件式の系列である。換言すれば、パスコンディションとは、実行可能パスが終了するまでに経由する条件である。したがって、単なる命令文の系列とは異なる。
【０００６】
上記のように、シンボリック実行中のパスが実現可否性を判定するため、たとえば、ＳＭＴ（Ｓａｔｉｓｆｉａｂｉｌｉｔｙ  Ｍｏｄｕｌｏ  Ｔｈｅｏｒｙ）ソルバやＳＡＴ（Ｓａｔｉｓｆｉａｂｉｌｉｔｙ）ソルバなどの制約ソルバが利用される（たとえば、下記非特許文献１を参照。）。
【０００７】
ＳＭＴソルバ等の制約ソルバは、上記の利用の他、シンボリック実行によりパスとパスコンディションを抽出した後、テストにおいて前記のパスを実際に通過させる具体的なテスト入力データを算出するためにも利用される。シンボリック実行中の制約ソルバの利用と、テスト入力データ生成のための制約ソルバの利用には、以下のような違いがある。
【０００８】
シンボリック実行中では、パスで新たに条件に到達したとき、新規の条件を追加したパスコンディションが充足可能か判定するために利用される。パスの終点ではないので、充足値は利用されない。また、テスト入力データは、実現可能なパスのパスコンディションの充足値を求めることにより生成される。
【先行技術文献】
【特許文献】
【０００９】
【特許文献１】特開２０１１−８５９６７号公報
【特許文献２】特表２０１１−５０３７２１号公報
【非特許文献】
【００１０】
【非特許文献１】梅村  晃広著  「ＳＡＴソルバ・ＳＭＴソルバの技術と応用」  コンピュータソフトウェアＶｏｌ．２７（２０１０），Ｎｏ．３  日本ソフトウェア科学会出版  ２０１０年
【発明の概要】
【発明が解決しようとする課題】
【００１１】
しかしながら、上述した従来技術では、シンボリック実行により抽出されたパスコンディションが複数ある場合、複数のパスコンディション間の関連性は利用せず、個々のパスコンディションを別々に制約ソルバに与えて充足値が算出される。そして、算出された充足値がテスト入力データとして利用されている。特に、パスコンディションが不等号を用いた条件式を含む場合、パスコンディションを満たす充足値は一意ではないが、この非一意性が解決されず、制約ソルバがたまたま解いた充足値がテスト入力データに採用される。
【００１２】
また、期待値はテスト入力データに基づいて作成される。テスト入力データは個別であり共通部分がないため、期待値は、テスト対象のプログラムの仕様書等で規定された所望の出力に基づいて、個別に算出される。この場合、テスト入力データ毎に期待値を作成しなくてならず、期待値の部分流用ができないという問題がある。また、期待値の部分流用ができないため、期待値の作成が長期化するという問題がある。
【００１３】
本発明は、テスト入力データの生成の効率化を図ることを目的とする。
【課題を解決するための手段】
【００１４】
本発明の一側面によれば、記憶装置に記憶されている、プログラムがシンボリック実行された場合の命令文の系列となる実行可能パス群の各パスが満たす条件を示すパスコンディション群のうち、パスコンディション間に共通の条件式がある複数のパスと前記共通の条件式とを関連付けた、前記共通の条件式と前記複数のパスとの組み合わせ群のいずれかの組み合わせに存在する複数のパスの中から、いずれかのパスを選択し、前記選択されたパスのパスコンディションに含まれている変数について当該パスコンディションを満たす充足解が存在し、かつ、前記変数が前記共通の条件式に含まれているか否かを判断し、前記充足解が存在し、かつ、前記変数が前記共通の条件式に含まれていると判断された場合、前記いずれかの組み合わせに存在する複数のパスのうち前記選択されたパス以外のパスのパスコンディションに、前記充足解を対応付けて、前記記憶装置に格納する、生成装置、生成方法、および生成プログラムが提案される。
【発明の効果】
【００１５】
本発明の一側面によれば、テスト入力データの生成の効率化を図ることができるという効果を奏する。
【図面の簡単な説明】
【００１６】
【図１】図１は、生成装置によるテスト入力データの生成例を示す説明図である。
【図２】図２は、テスト対象プログラムの一例を示す説明図である。
【図３】図３は、戻り値クラスのプログラムの一例を示す説明図である。
【図４】図４は、図２に示したテスト対象プログラムのフロー図である。
【図５】図５は、図２に示したテスト対象プログラムのシンボリック実行結果の例を示すフロー図である。
【図６】図６は、パスコンディションの例を示す説明図である。
【図７】図７は、実行不能パスの例を示すフロー図である。
【図８】図８は、所望の出力例を示す説明図である。
【図９】図９は、テスト入力データおよび期待値の例を示す説明図である。
【図１０】図１０は、実施の形態にかかる生成装置のハードウェア構成例を示すブロック図である。
【図１１】図１１は、生成装置の機能的構成例を示すブロック図である。
【図１２】図１２は、分解部が取得したパスコンディション群を示す説明図である。
【図１３】図１３は、分解部によるパスコンディションの分解例を示す説明図である。
【図１４】図１４は、分解部による分解結果例を示す説明図である。
【図１５】図１５は、関連パスコンディション組テーブルの一例を示す説明図である。
【図１６】図１６は、優先ルールテーブルの一例を示す説明図である。
【図１７】図１７は、優先ルールテーブルに従って並び替えたあとの関連パスコンディション組テーブルを示す説明図である。
【図１８】図１８は、生成部の詳細な機能的構成例を示すブロック図である。
【図１９】図１９は、生成部の動作例１を示す説明図である。
【図２０】図２０は、生成部の動作例２を示す説明図である。
【図２１】図２１は、生成部の動作例３を示す説明図である。
【図２２】図２２は、生成部の動作例４を示す説明図である。
【図２３】図２３は、生成部の動作例５を示す説明図である。
【図２４】図２４は、生成部の動作例６を示す説明図である。
【図２５】図２５は、テスト入力データ生成処理手順例を示すフローチャートである。
【図２６】図２６は、図２５に示したパスコンディション分解処理（ステップＳ２５０１）の詳細な処理手順例を示すフローチャートである。
【図２７】図２７は、図２５に示したパスコンディション関連付け処理（ステップＳ２５０２）の詳細な処理手順例を示すフローチャートである。
【図２８】図２８は、図２５に示した並び替え処理（ステップＳ２５０３）の詳細な処理手順例を示すフローチャートである。
【図２９】図２９は、図２５に示した生成処理（ステップＳ２５０４）の詳細な処理手順例（その１）を示すフローチャートである。
【図３０】図３０は、図２５に示した生成処理（ステップＳ２５０４）の詳細な処理手順例（その２）を示すフローチャートである。
【発明を実施するための形態】
【００１７】
以下に添付図面を参照して、この発明にかかる生成装置、生成方法、および生成プログラムの実施の形態を詳細に説明する。本実施の形態は、上述したコンディションを用い、パスコンディション間に共通の条件式がある場合は、テスト入力データを流用し、流用できない場合に限り、制約ソルバによりテスト入力データを求める。これにより、パスごとに独立してテスト入力データを求めるよりも演算量が低減される。これにともない、テスト入力データを使用する期待値算出の計算量も低減される。
【００１８】
＜テスト入力データの生成例＞
図１は、生成装置によるテスト入力データの生成例を示す説明図である。図１のテスト入力データの生成例は、あるテスト対象プログラムをシンボリック実行した場合に得られた実行可能パス群とそれらのパスコンディション群を用いた例である。そして、図１のテスト入力データの生成例は、既存のテスト入力データを流用しながら、パスごとのテスト入力データを求める例である。
【００１９】
図１のテストデータ生成例では、パスごとのテスト入力データを求めるためにテスト入力データテーブル１００が用いられる。図１において、テスト入力データテーブル１００は、パスごとに、パスＮｏ．項目とパスコンディション項目と既存解制約項目と解決済項目とを有する。パスＮｏ．項目には、パスを特定する番号が格納される。パスコンディション項目には、パスコンディションが格納される。パスコンディションとは、上述したように、テスト対象プログラムがシンボリック実行された場合の実行可能な経路であるパス群の各パスでの条件式の系列（たとえば、ｘ＞＝０，ｙ>＝０）である。図１の例では、パスコンディションを編集した要素条件式がパスコンディションとして格納される。要素条件式とは、パスコンディションに存在する編集後の条件式である。パスコンディションの編集については後述する。
【００２０】
既存解制約項目には、既存解制約が格納される。既存解とは、制約ソルバで求められたり、他の既存解から流用されたテスト入力データである。既存解制約とは、各パスのテスト入力データを求めるための条件である。すなわち、既存解となったテスト入力データそのものが、他のパスの充足解に流用される可能性があるため、既存解制約となる。テスト入力データとは、パスコンディションに含まれている変数が充足する値である。図１のパス２を例に挙げると、パス２のパスコンディションは［ｘ＜０，ｙ＜０］であるため、ｘ、ｙが変数であり、パスコンディション内の条件式「ｘ＜０」を満たすｘ＝−１、パスコンディション内の条件式「ｙ＜０」を満たすｙ＝−１がテスト入力データである。
【００２１】
解決済項目には、解決済か未解決かを示すフラグが格納される。パスコンディションに含まれているすべての変数についてテスト入力データが得られたパスについては、解決済を示すフラグが格納される。テスト入力データが１つでも得られていない変数があるパスについては、未解決を示すフラグが格納される。図１では便宜上、解決済については「○」で表記し、未解決の場合は空欄とする。
【００２２】
つぎに、テスト入力データの生成例を時系列（Ａ）〜（Ｃ）に沿って説明する。なお、初期状態では、パス１〜７のパスコンディションは得られており、既存解制約項目は空、解決済項目は「未解決」に設定されているものとする。
【００２３】
（Ａ）まず、生成装置は、パス１〜パス７の中からいずれかのパス、ここでは、パス２を選択する。パスの選択の仕方によってはテスト入力データの生成効率は上がるが、ここでは、生成装置は、ランダムにパス２を選択したこととする。初期状態では、既存解制約項目が空であり、他の既存解を流用できないため、生成装置は、パス２のパスコンディションを制約ソルバに与える。
【００２４】
制約ソルバは、パスコンディションの生成元となるテスト対象プログラムのシンボリック実行により、パス２のパスコンディションを充足する変数ｘ，ｙの値を充足解として返す。この場合、｛ｘ＝−１，ｙ＝−１｝が充足解である。生成装置は、充足解｛ｘ＝−１，ｙ＝−１｝をパス２の既存解制約項目に格納する。これにより、充足解｛ｘ＝−１，ｙ＝−１｝は、既存解制約となり、流用元として利用される。
【００２５】
また、パス２のパスコンディションは［ｘ＜０，ｙ＜０］であるが、このうち要素条件式「ｘ＜０」は、パス４，パス５，パス７にも存在する。すなわち、パス２，パス４，パス５，パス７のパス群は、変数ｘについて共通の要素条件式を充足しなければならない。したがって、生成装置は、要素条件式「ｘ＜０」を充足するパス２の既存解制約｛ｘ＝−１｝をパス４，パス５，パス７に流用する。すなわち、生成装置は、パス２の既存解制約｛ｘ＝−１｝をパス４，パス５，パス７の既存解制約項目に格納する。これにより、パス４，パス５，パス７の変数ｘについては、制約ソルバで解く必要がなくなり、テスト入力データの演算量の低減化を図ることができる。
【００２６】
変数ｙについても同様に、要素条件式「ｙ＜０」は、パス３，パス６にも存在する。すなわち、パス３，パス６のパス群は、変数ｙについて共通の要素条件式を充足しなければならない。したがって、生成装置は、要素条件式「ｙ＜０」を充足するパス２の既存解制約｛ｙ＝−１｝をパス３，パス６に流用する。これにより、生成装置は、パス２の既存解制約｛ｙ＝−１｝をパス３，パス６の既存解制約項目に格納する。これにより、パス３，パス６の変数ｙについては、制約ソルバで解く必要がなくなり、テスト入力データの演算量の低減化を図ることができる。
【００２７】
（Ｂ）つぎに、生成装置がパス６を選択したこととする。（Ａ）ではパス６について変数ｘの値が得られていないが、パス６の変数ｘについての要素条件式「ｘ＞＝０」と共通の要素条件式を有するパス１には既存解制約がなく、変数ｘの値が流用できない。この場合は、生成装置は、選択したパス６のパスコンディションとパス６の既存解制約｛ｙ＝−１｝とを制約ソルバに与える。
【００２８】
制約ソルバは、パスコンディションの生成元となるテスト対象プログラムのシンボリック実行により、パス６のパスコンディションおよび変数ｙの既存解制約｛ｙ＝−１｝とを充足する変数ｘの値を充足解として返す。この場合、｛ｘ＝０｝が充足解である。生成装置は、充足解｛ｘ＝０｝をパス６の既存解制約項目に格納する。これにより、充足解｛ｘ＝０｝は既存解制約となり、流用元として利用される。このように、制約ソルバでの求解を必要最小限にすることにより、テスト入力データの演算量の低減化を図ることができる。
【００２９】
また、これにより、パス６では、｛ｘ＝０｝が既存解制約となったため、｛ｘ＝０｝は、パス６と共通の要素条件式「ｘ＞＝０」を有するパス１に流用される。生成装置は、（Ａ），（Ｂ）に示したような流用や制約ソルバでの求解を、全パスの解決済項目がすべて「○」になるまで実行する。
【００３０】
（Ｃ）では、最終的に全パスの解決済項目がすべて「○」になった状態を示している。解決済項目がすべて「○」になったということは、全パスについてテスト入力データが得られたことを意味する。図１では、既存解制約項目において、塗りつぶした箇所が制約ソルバで求解したテスト入力データであり、それ以外の箇所は他のパスの既存解制約からの流用により設定されたテスト入力データである。
【００３１】
このように、従来では、パス１〜パス７において変数ｘ，ｙのテスト入力データを制約ソルバにより１４個求めなければならなかったのを、本実施の形態では、（Ｃ）において塗りつぶしていない７個で済むため、テスト入力データを求めるための演算量の低減化を図ることができる。また、期待値についても、テスト入力データを用いて求められるため、テスト入力データの種類数が少ないほど、期待値の演算量の低減化を図ることができる。
【００３２】
＜テスト対象プログラム例＞
図２は、テスト対象プログラムの一例を示す説明図である。また、図３は、戻り値クラスのプログラムの一例を示す説明図である。
【００３３】
図２に示すように、テスト対象プログラム２００には、６個のＩＦ文１〜６と１つの更新文１が記述されている。図２および図３のプログラムをシンボリック実行する場合、テスト対象関数ｔａｒｇｅｔＦｕｎｃの引数であるｘとｙに対してシンボル値を指定して、シンボリック実行が行われる。戻り値クラスのプログラム３００は、期待値ａ，ｂ，ｃを戻り値として出力するプログラムである。
【００３４】
図４は、図２に示したテスト対象プログラム２００のフロー図である。図４では、条件による分岐構造が示されている。
【００３５】
＜シンボリック実行結果の例＞
図５は、図２に示したテスト対象プログラム２００のシンボリック実行結果の例を示すフロー図である。図５に示した実行結果は、図２および図３のプログラムのシンボリック実行結果である。なお、図５に示したパス１〜パス７は、図１で説明したパス１〜パス７である。
【００３６】
＜パスコンディションの例＞
図６は、パスコンディションの例を示す説明図である。図６のパスコンディションテーブル６００において、パスコンディションは、図５に示した実行可能パス１〜パス７のパスコンディションであり、図１のパスコンディションの編集前のパスコンディションである。また、図６において、ケース項目には、ケース名が格納される。ケース名とは、実行可能パスの終点を示す識別子である。たとえば、図５を参照すると、パス７の終点は、「Ｃａｓｅ５」であるため、パス７のケース項目には、「Ｃａｓｅ５」が格納される。
【００３７】
図６において、たとえば、パス３のパスコンディションは、［（（ｙ＋−１０）＜０）＆＆（（（ｙ＋−１０)＋ｘ）＞＝２）＆＆！（ｙ＞＝０）＆＆（ｘ＞＝０）］である。このパスコンディションは、４つの条件式をＡＮＤで結合したものである。先頭の条件式は「（（ｙ＋−１０）＜０）」となっている。その理由は、図２のテスト対象プログラム２００のＩＦ文５の条件「ｙ＜０」が評価されるとき、変数ｙの値は、更新文１により「ｙ−１０」に更新されており、更新値に基づいてＩＦ文５を評価したためである。
【００３８】
図７は、実行不能パスの例を示すフロー図である。図７において、パス８〜パス１１は、パスコンディションが充足不可能なため、実行が不可能であったパスである。たとえば、パス８のパスコンディションは、［（ｙ−１０＞＝０）＆＆！（ｙ−１０＜０）＆＆（ｘ＋（ｙ−１０）＞＝２）＆＆！（ｙ＞＝０）＆＆（ｘ＞＝０）］である。このパスコンディションの変数ｙに対する条件式を満たすｙはあり得ない。したがって、パス８は、制約ソルバにより実行不能パスと判定される。
【００３９】
＜所望の出力例＞
図８は、所望の出力例を示す説明図である。図８では、所望の出力がテーブル化されている。所望の出力項目には、ケースごとに所望の出力が格納されている。所望の出力とは、たとえば、テスト対象プログラム２００の仕様書等に記述された出力内容である。所望の出力の変数ｘ，ｙにテスト入力データを与えると、戻り値クラスのプログラム３００が実行されることにより期待値ａ，ｂ，ｃが算出される。
【００４０】
＜テスト入力データおよび期待値の例＞
図９は、テスト入力データおよび期待値の例を示す説明図である。図９のテーブルは、図６のパスコンディションのテーブルに、入力項目と期待値項目とを追加したテーブルである。入力項目には、テスト入力データが格納されている。すなわち、図１に示した解決済の既存解制約が格納されている。期待値項目には、パスごとに期待値が格納されている。期待値は、パスごとに、テスト入力データを所望の出力に与えた場合の計算結果となる。
【００４１】
＜生成装置のハードウェア構成例＞
生成装置は、たとえば、ＣＰＵ（Ｃｅｎｔｒａｌ  Ｐｒｏｃｅｓｓｉｎｇ  Ｕｎｉｔ）やプログラマブルなデバイス（ＦＰＧＡ（Ｆｉｅｌｄ  Ｐｒｏｇｒａｍｍａｂｌｅ  Ｇａｔｅ  Ａｒｒａｙ）、ＰＬＤ（Ｐｒｏｇｒａｍｍａｂｌｅ  Ｌｏｇｉｃ  Ｄｅｖｉｃｅ））などの機器に、ソフトウェアとして実装される。また、たとえば、ＲＯＭ（Ｒｅａｄ  Ｏｎｌｙ  Ｍｅｍｏｒｙ）、ＲＡＭ（Ｒａｎｄｏｍ  Ａｃｃｅｓｓ  Ｍｅｍｏｒｙ）、ハードディスクなどのメモリが記憶装置として利用される。以下、ハードウェア構成例を図示する。
【００４２】
図１０は、実施の形態にかかる生成装置のハードウェア構成例を示すブロック図である。図１０において、生成装置は、ＣＰＵ１００１と、ＲＯＭ１００２と、ＲＡＭ１００３と、磁気ディスクドライブ１００４と、磁気ディスク１００５と、光ディスクドライブ１００６と、光ディスク１００７と、ディスプレイ１００８と、Ｉ／Ｆ（Ｉｎｔｅｒｆａｃｅ）１００９と、キーボード１０１０と、マウス１０１１と、スキャナ１０１２と、プリンタ１０１３と、を備えている。また、各構成部はバス１０００によってそれぞれ接続されている。
【００４３】
ここで、ＣＰＵ１００１は、生成装置の全体の制御を司る。ＲＯＭ１００２は、ブートプログラムなどのプログラムを記憶している。ＲＡＭ１００３は、ＣＰＵ１００１のワークエリアとして使用される。磁気ディスクドライブ１００４は、ＣＰＵ１００１の制御にしたがって磁気ディスク１００５に対するデータのリード／ライトを制御する。磁気ディスク１００５は、磁気ディスクドライブ１００４の制御で書き込まれたデータを記憶する。
【００４４】
光ディスクドライブ１００６は、ＣＰＵ１００１の制御にしたがって光ディスク１００７に対するデータのリード／ライトを制御する。光ディスク１００７は、光ディスクドライブ１００６の制御で書き込まれたデータを記憶したり、光ディスク１００７に記憶されたデータをコンピュータに読み取らせたりする。
【００４５】
ディスプレイ１００８は、カーソル、アイコンあるいはツールボックスをはじめ、文書、画像、機能情報などのデータを表示する。このディスプレイ１００８は、たとえば、液晶ディスプレイ、プラズマディスプレイなどを採用することができる。
【００４６】
インターフェース（以下、「Ｉ／Ｆ」と略する。）１００９は、通信回線を通じてＬＡＮ（Ｌｏｃａｌ  Ａｒｅａ  Ｎｅｔｗｏｒｋ）、ＷＡＮ（Ｗｉｄｅ  Ａｒｅａ  Ｎｅｔｗｏｒｋ）、インターネットなどのネットワーク１０１４に接続され、このネットワーク１０１４を介して他の装置に接続される。そして、Ｉ／Ｆ１００９は、ネットワーク１０１４と内部のインターフェースを司り、外部装置からのデータの入出力を制御する。Ｉ／Ｆ１００９には、たとえばモデムやＬＡＮアダプタなどを採用することができる。
【００４７】
キーボード１０１０は、文字、数字、各種指示などの入力のためのキーを備え、データの入力をおこなう。また、タッチパネル式の入力パッドやテンキーなどであってもよい。マウス１０１１は、カーソルの移動や範囲選択、あるいはウィンドウの移動やサイズの変更などをおこなう。ポインティングデバイスとして同様に機能を備えるものであれば、トラックボールやジョイスティックなどであってもよい。
【００４８】
スキャナ１０１２は、画像を光学的に読み取り、生成装置内に画像データを取り込む。なお、スキャナ１０１２は、ＯＣＲ（Ｏｐｔｉｃａｌ  Ｃｈａｒａｃｔｅｒ  Ｒｅａｄｅｒ）機能を持たせてもよい。また、プリンタ１０１３は、画像データや文書データを印刷する。プリンタ１０１３には、たとえば、レーザプリンタやインクジェットプリンタを採用することができる。なお、光ディスクドライブ１００６、光ディスク１００７、ディスプレイ１００８、キーボード１０１０、マウス１０１１、スキャナ１０１２、およびプリンタ１０１３の少なくともいずれか１つは、なくてもよい。
【００４９】
＜生成装置の機能的構成例＞
図１１は、生成装置の機能的構成例を示すブロック図である。生成装置１１００は、実行部１１０１と、記録部１１０２と、求解部１１０３と、分解部１１０４と、並び替え部１１０６と、関連付け部１１０５と、生成部１１０７と、を有する。実行部１１０１、記録部１１０２、および求解部１１０３は、生成装置１１００の外部機能であってもよい。実行部１１０１、記録部１１０２、求解部１１０３、分解部１１０４、並び替え部１１０６、関連付け部１１０５、および生成部１１０７は、具体的には、たとえば、図１０に示したＲＯＭ１００２、ＲＡＭ１００３、磁気ディスク１００５、光ディスク１００７などの記憶装置に記憶されたプログラムをＣＰＵ１００１に実行させることにより、または、Ｉ／Ｆ１００９により、その機能を実現する。
【００５０】
実行部１１０１は、テスト対象プログラム２００のシンボリック実行をおこなう。具体的には、たとえば、図２および図３のプログラムが入力されると、実行部１１０１は、シンボリック実行をおこなって、図５に示したような実行可能パスとしてパス１〜パス７や図７に示したパス８〜パス１１を得る。そして、実行部１１０１は、得られたパス群のうち実行可能パスであるパス１〜パス７についてパスコンディションを生成する。
【００５１】
記録部１１０２は、実行部１１０１によって生成されたパスコンディションを記憶装置に格納する。具体的には、たとえば、記録部１１０２は、図６に示したように、パスコンディションテーブル６００にパスコンディション群を記録する。
【００５２】
求解部１１０３は、テスト対象プログラム２００についてのパスコンディションを充足するテスト入力データを充足解として求める。具体的には、たとえば、求解部１１０３は、非特許文献１で示したような制約ソルバが採用される。求解部１１０３は、パスコンディションおよび一部の変数のテスト入力データが与えられると、他の変数のテスト入力データを求めることもできる。
【００５３】
分解部１１０４は、パスコンディション群の少なくとも１のパスコンディションを、論理積演算子を境界にして複数の条件式に分解する。具体的には、たとえば、分解部１１０４は、パスコンディションテーブル６００からパスごとのパスコンディションを取得する。
【００５４】
図１２は、分解部１１０４が取得したパスコンディション群を示す説明図である。パスコンディションは、論理積演算子「＆＆」により条件式が連結されている。分解部１１０４は、論理積演算子「＆＆」を削除して、パスコンディションを複数の条件式に分解する。このように、パスコンディションを分解することにより、生成装置１１００は、パスコンディション間で条件式どうしを比較しやすくなり、共通の条件式の探索を効率よく実行することができる。
【００５５】
また、分解部１１０４は、複数の条件式を包含関係のある条件式どうしでまとめる。たとえば、条件式「ｙ＜０」と「ｙ＜１０」の場合、「ｙ＜０」の部分に包含関係があるため、０≦ｙ＜１０の部分が削除されることになる。すなわち、条件式「ｙ＜１０」が削除される。このように、複数の条件式をまとめることにより、条件式の個数が少なくなり、生成装置１１００は、共通の条件式の探索を効率よく実行することができる。
【００５６】
また、分解部１１０４は、複数の条件式のうち論理否定演算子を有する条件式から論理否定演算子を削除し、削除後の条件式に存在する比較演算子を反対の意味の比較演算子に変換する。具体的には、分解部１１０４は、論理否定演算子を有する条件式を肯定表現の条件式に変換する。たとえば、分解部１１０４は、論理否定演算子を有する条件式から論理否定演算子を削除し、削除後の条件式に含まれている不等号の比較演算子を、反対の意味の比較演算子に置換する。
【００５７】
たとえば、分解部１１０４は、「＝＜」を「＞」に、「＞＝」を「＜」に、「＞」を「＝＜」に、「＜」を「＞＝」に、置換する。このように、条件式を単純な表現に編集することにより、生成装置１１００は、パスコンディション間で共通の条件式の探索を効率よく実行することができる。
【００５８】
図１３は、分解部１１０４によるパスコンディションの分解例を示す説明図である。図１３では、パス３のパスコンディションを例に挙げて説明する。まず、（Ａ）は、編集前のパス３のパスコンディションを示している。
【００５９】
（Ｂ）は、（Ａ）の状態から、論理積演算子「＆＆」を削除して、複数の条件式に分解した状態を示している。
【００６０】
（Ｃ）は、（Ｂ）の状態から、論理否定演算子「！」を有する条件式を編集した状態を示している。たとえば、論理否定演算子「！」を有する条件式「！（ｙ＞＝０）」から論理否定演算子「！」が削除され、削除後の条件式「ｙ＞＝０」の比較演算子「＞＝」が反対の意味を持つ比較演算子「＜」に置換される。これにより、条件式「！（ｙ＞＝０）」が条件式「ｙ＜０」になる。
【００６１】
（Ｄ）は、（Ｃ）の状態から条件式を整理した状態を示している。たとえば、（Ｃ）の条件式「（ｙ＋−１０）＜０」は、「ｙ＜１０」に変換される。また、（Ｃ）の条件式「（（ｙ＋  −１０)＋ｘ）＞＝２」は、「ｘ＋ｙ＞＝１２」に変換される。
【００６２】
（Ｅ）は、（Ｄ）の状態から条件式を並べ替えた状態を示している。たとえば、変数の個数やアルファベット順、比較演算子の大小関係により、条件式が並べ替えられている。
【００６３】
（Ｆ）は、（Ｅ）の状態から包含関係のある条件式どうしをまとめた状態を示している。たとえば、条件式「ｙ＜０」と「ｙ＜１０」の場合、「ｙ＜０」の部分に包含関係があるため、条件式「ｙ＜１０」が削除される。（Ｆ）に示したパスコンディションが要素条件式となる。
【００６４】
図１４は、分解部１１０４による分解結果例を示す説明図である。分解部１１０４は、図１２のパスコンディション群を、図１３に示した分解処理により、図１４に示した分解結果を出力する。
【００６５】
また、図１１に戻り、関連付け部１１０５は、パスコンディション群のうち、パスコンディション間に共通の条件式がある複数のパスと共通の条件式とを関連付けることにより、共通の条件式と複数のパスとの組み合わせ群を生成する。具体的には、たとえば、関連付け部１１０５は、まず、図１４に示した分解部１１０４による分解結果を取得する。そして、関連付け部１１０５は、パスごとに、共通の条件式をパスコンディションに持つ他のパスを探索する。たとえば、パス１が選択された場合、関連付け部１１０５は、図１４の分解結果におけるパス１のパスコンディション内の要素条件式「ｘ＞＝０」を他のパス２〜パス７から探索する。
【００６６】
この場合、パス６のパスコンディションの中に要素条件式「ｘ＞＝０」が存在する。したがって、要素条件式「ｘ＞＝０」が、パス１とパス６の共通の条件式となる。このように、共通の条件式をもつパス群を、「関連パスコンディション組」と称す。関連付け部１１０５は、共通の条件式「ｘ＞＝０」と、関連パスコンディション組｛パス１，パス６｝と、を関連付けて、関連パスコンディション組テーブルに格納する。
【００６７】
図１５は、関連パスコンディション組テーブルの一例を示す説明図である。上述したパス１〜パス７の例で関連付けをおこなうと、図１５のようになる。関連パスコンディション組テーブル１５００は、ＩＤ項目と、関連パスコンディション組項目と、共通の条件式項目と、を有する。ＩＤ項目には、関連パスコンディション組と共通の条件式との組み合わせを一意に特定する識別番号が格納される。関連パスコンディション組項目には、関連パスコンディション組が格納される。共通の条件式項目には、関連パスコンディション組の各パスのパスコンディションに存在する共通の条件式が格納される。
【００６８】
また、図１１に戻り、並び替え部１１０６は、関連パスコンディション組テーブル１５００のレコードを並び替える。具体的には、たとえば、並び替え部１１０６は、優先ルールテーブルを参照することにより、関連パスコンディション組テーブル１５００のレコードを並び替える。
【００６９】
図１６は、優先ルールテーブルの一例を示す説明図である。優先ルールテーブル１６００は、ルールＩＤ項目と、優先ルール項目と、を有する。ルールＩＤ項目には、優先ルールを一意に特定する識別番号が格納される。本例では、ルールＩＤが小さい優先ルールほど優先される。すなわち、ルールＩＤ：１の優先ルール（優先ルール１）が最優先される規則である。
【００７０】
優先ルール項目には、優先ルールが格納される。優先ルールとは、関連パスコンディション組のいずれを優先的に扱うかを決める規則である。テスト入力データを生成する際、関連パスコンディション組テーブル１５００の最上位レコードの関連パスコンディション組から選択される。したがって、優先ルールは、テスト入力データの生成効率が上がるような規則となる。以下、優先ルール１，２について具体的に説明する。
【００７１】
優先ルール１は、「関連パスコンディション組に含まれるパスコンディションの個数が多い順」に関連パスコンディション組テーブル１５００のレコードを並び替える規則である。関連パスコンディション組に含まれるパスコンディションの個数が多いほど、既存解の流用先が多くなり、効率的だからである。たとえば、関連パスコンディション組３は｛パス２，パス４，パス５，パス７｝であるが、パス２に既存解があると、パス４，パス５，パス７の３本のパスに流用されることになる。
【００７２】
優先ルール２は、「共通の条件式が、単一の変数である」関連パスコンディション組を上位となるように並べ替える規則である。共通の条件式の変数の個数が多い関連パスコンディション組が優先されると、求解部１１０３に与えられた場合に演算負荷がかかるが、できる限り流用したあとでは、変数が複数個あっても既存解が流用される変数も出現し、解が得られていない変数の個数が減少する。したがって、優先ルール２を適用して変数の個数が多いほど優先順位を下げることにより、テスト入力データの演算量の低減化を図ることができる。
【００７３】
図１７は、優先ルールテーブル１６００に従って並び替えたあとの関連パスコンディション組テーブル１５００を示す説明図である。図１５と比較すると、優先ルール１にしたがって、関連パスコンディション組内のパス本数が多いレコードほど、上位に格納されている。図１７では、関連パスコンディション組３のパス本数が４本なので、最上位の関連パスコンディション組となる。また、関連パスコンディション組６は、パス本数は３本であるが、共通の条件式の変数の個数が２個であるため、６番目に位置している。ただし、関連パスコンディション組５とは変数の個数が同一であるが、パス本数が多いため、関連パスコンディション組５よりも上位となる。
【００７４】
生成部１１０７は、関連パスコンディション組テーブル１５００を参照して、パスごとのテスト入力データを生成する。具体的には、たとえば、生成部１１０７は、図１に示したように、可能な限り、既存解を流用し、流用できない場合に限り求解部１１０３で充足解を求める。
【００７５】
図１８は、生成部１１０７の詳細な機能的構成例を示すブロック図である。生成部１１０７は、選択部１８０１と、判断部１８０２と、対応付け部１８０３と、取得部１８０４と、設定部１８０５と、を有する。
【００７６】
選択部１８０１は、関連パスコンディション組テーブル１５００の中からいずれかの関連パスコンディション組を選択する。関連パスコンディション組の選択はランダムでもよい。また、並び替え部１１０６により並び替えられた場合は、選択部１８０１は、関連パスコンディション組テーブル１５００の最上位のレコードの関連パスコンディション組を選択する。これにより、選択部１８０１は、優先ルール１により、パス本数が多い関連パスコンディション組から優先選択することができるため、既存解の流用先が多くなる。したがって、求解部１１０３によるテスト入力データの演算量の低減化を図ることができる。
【００７７】
また、優先ルール２も適用されている場合、変数が複数個あっても既存解が流用される変数も出現し、解が得られていない変数の個数が減少する。したがって、上位の関連パスコンディション組から優先選択することにより、変数の個数が多い関連パスコンディション組の選択を抑制し、テスト入力データの演算量の低減化を図ることができる。
【００７８】
また、選択部１８０１は、選択された関連パスコンディション組に存在する複数のパスの中から、いずれかのパスを選択する。たとえば、図１７の関連パスコンディション組３に存在する｛パス２，パス４，パス５，パス７｝の中からランダムにパスを１つ選択する。
【００７９】
また、選択部１８０１は、選択された関連パスコンディション組に存在する複数のパスの中から、パスコンディションに含まれており、かつ、充足解が得られていない変数の個数が最小であるパスを選択する。ここで、「パスコンディションに含まれており、かつ、充足解が得られていない変数」とは、パスコンディションには規定されているが求解部１１０３や流用により値が得られていない変数である。たとえば、パスコンディションには変数ｘ，ｙが規定されており、変数ｘのみ、求解部１１０３または他のパスからの流用によりｘ＝−１が得られている場合、変数ｙが該当する。
【００８０】
また、「パスコンディションに含まれており、かつ、充足解が得られていない変数の個数が最小であるパス」とは、充足解が得られていない変数を含むパス群の中で、充足解となるテスト入力データが得られた変数が最大のパスである。たとえば、変数ｘ，ｙのいずれも充足解が得られていないパスと、変数ｘ，ｙのうちｘのみ充足解が得られているパスがある場合、後者のパスが選択される。充足解が得られていない変数を含むパスが対象となるため、全変数の充足解が得られているパスは選択対象外である。このようなパスは、図１に示したように、解決済となるため、選択する必要がない。
【００８１】
判断部１８０２は、選択部１８０１によって選択されたパスのパスコンディションに含まれている変数について当該パスコンディションを満たす充足解が存在し、かつ、変数が共通の条件式に含まれているか否かを判断する。たとえば、図１の（Ａ）に示したように、選択パスをパス２とすると、パス２には変数ｘの充足解ｘ＝−１が存在し、かつ、変数ｘが共通の条件式「ｘ＜０」がパス４，パス５，パス７との共通の条件式となる。
【００８２】
選択されたパスのパスコンディションに含まれている変数について当該パスコンディションを満たす充足解が存在し、かつ、変数が共通の条件式に含まれていると判断された場合、対応付け部１８０３による処理が実行される。
【００８３】
また、選択されたパスのパスコンディションに含まれている変数について当該パスコンディションを満たす充足解が存在しないと判断された場合、求解部１１０３から充足解を求めることになる。また、充足解が存在するが、変数が共通の条件式に含まれていないと判断された場合も、求解部１１０３から充足解を求めることになる。
【００８４】
対応付け部１８０３は、判断部１８０２によって充足解が存在し、かつ、変数が共通の条件式に含まれていると判断された場合、選択中の関連パスコンディション組に存在する複数のパスのうち、選択されたパス以外のパスのパスコンディションに、充足解を対応付ける。具体的には、たとえば、図１の（Ａ）に示したように、対応付け部１８０３は、選択されたパス（たとえば、パス２）以外のパス（パス４，パス５，パス７）に充足解「ｘ＝−１」を流用する。これにより、流用先の他のパスでは、流用された充足解を求解部１１０３で求める必要がなくなり、求解部１１０３による演算量の低減化を図ることができる。
【００８５】
取得部１８０４は、求解部１１０３から充足解を取得する。具体的には、取得部１８０４は、選択されたパスのパスコンディションに含まれている変数について当該パスコンディションを満たす充足解が存在しないと判断された場合、求解部１１０３から充足解を取得する。この場合、取得部１８０４は、充足解が存在しないと判断されたパスコンディションを求解部１１０３に渡す。求解部１１０３は、渡されたパスコンディションから充足解を求め、取得部１８０４に返す。
【００８６】
たとえば、図１の（Ａ）では、選択パス２の変数ｘ，ｙについて充足解が存在していないため、選択パス２のパスコンディションを求解部１１０３に渡して、充足解｛ｘ＝−１，ｙ＝−１｝を取得する。この場合、対応付け部１８０３は、選択パス２のパスコンディションに、充足解｛ｘ＝−１，ｙ＝−１｝を対応付けて、テスト入力データテーブル１００のパス２についての既存解制約項目に格納する。
【００８７】
また、取得部１８０４は、判断部１８０２によって充足解が存在するが、変数が共通の条件式に含まれていないと判断された場合、選択されたパスのパスコンディションおよび充足解を求解部１１０３に与える。これにより、取得部１８０４は、選択されたパスのパスコンディションに含まれている変数以外の他の変数についての他の充足解をソルバから取得する。
【００８８】
たとえば、図１の（Ｂ）では、選択パス６の変数ｙについては充足解「ｙ＝−１」が得られているが、変数ｘについては充足解はまだ得られていない。したがって、取得部１８０４は、選択パス６のパスコンディションと変数ｙの充足解「ｙ＝−１」を求解部１１０３に渡して、変数ｘの充足解「ｘ＝０」を取得する。この場合、対応付け部１８０３は、選択パス６のパスコンディションに対応付けられた充足解「ｙ＝−１」に、さらに充足解「ｘ＝０」を対応付けて、テスト入力データテーブル１００のパス６についての既存解制約項目に格納する。
【００８９】
設定部１８０５は、パスコンディションに含まれているいずれの変数についても充足解がパスコンディションに対応付けられたパスを、解決済みパスに設定する。具体的には、たとえば、設定部１８０５は、図１に示したように、変数ｘ，ｙのいずれについても充足解が得られたパスについて解決済フラグを設定する。解決済フラグが設定されたパスは、選択部１８０１の選択対象外となる。そして、全パスについて解決済フラグが設定されると、テスト入力データが網羅される。
【００９０】
これにより、テスト入力データを求めるための求解部１１０３の演算量の低減化を図ることができる。したがって、テスト入力データを効率的に生成することができ、生成時間の短縮化を図ることができる。
【００９１】
＜生成部１１０７の動作例＞
つぎに、生成部１１０７の動作例について図１９〜図２４を用いて説明する。ここでは、図１７に示した並び替え後の関連パスコンディション組テーブル１５００を用いて説明する。
【００９２】
図１９は、生成部１１０７の動作例１を示す説明図である。図１９は、初期状態からの動作例を示している。選択部１８０１は、関連パスコンディション組テーブル１５００の未選択の関連パスコンディション組の中から最上位の関連パスコンディション組を選択する。図１９では、選択部１８０１は、ＩＤ：３の関連パスコンディション組３＝｛パス２，パス４，パス５，パス７｝を選択する。そして、選択部１８０１は、関連パスコンディション組３の中からいずれかのパスを選択する。ここでは、選択部１８０１は、パス２を選択パスとして選択したものとする。
【００９３】
選択パス２は、最初に選択されたパスであるため、テスト入力データテーブル１００の既存解制約項目は空である。すなわち、流用元となる既存解がないため、取得部１８０４は、選択パス２のパスコンディションである［ｘ＜０，ｙ＜０］を、求解部１１０３に与える。これにより、求解部１１０３は、充足解｛ｘ＝−１，ｙ＝−１｝を出力するため、取得部１８０４は、充足解｛ｘ＝−１，ｙ＝−１｝を取得して、テスト入力データテーブル１００のパス２の既存解制約項目に登録する。
【００９４】
また、設定部１８０５は、選択パス２の既存解制約項目に、パスコンディションの変数ｘ，ｙについて充足解｛ｘ＝−１，ｙ＝−１｝が既存解制約として登録されたため、解決済フラグを「解決済」に設定する。「●」は、便宜的に「未解決」から「解決済」に変更したことを示している。
【００９５】
また、選択中の関連パスコンディション組３における共通の条件式は「ｘ＜０」である。すなわち、選択パス２や選択パス２以外の未選択パス４，５，７の各パスコンディションにも要素条件式「ｘ＜０」が含まれている。したがって、対応付け部１８０３は、選択パス２の既存解制約項目に登録された充足解｛ｘ＝−１，ｙ＝−１｝のうち、共通の条件式「ｘ＜０」に規定されている変数ｘの充足解「ｘ＝−１」を、パス４，パス５，パス７の既存解制約項目に登録する。
【００９６】
このように、選択パス２の充足解「ｘ＝−１」が流用されたことになり、パス４，パス５，パス７の変数ｘの充足解については求解部１１０３で求める必要がなくなる。なお、図１９では、パス４，パス５，パス７の充足解は変数ｘのみであるため、解決済項目は、「未解決」のままである。
【００９７】
図２０は、生成部１１０７の動作例２を示す説明図である。図２０は、図１９の動作例１からの動作例を示している。選択部１８０１は、関連パスコンディション組テーブル１５００の未選択の関連パスコンディション組の中から最上位の関連パスコンディション組を選択する。図２０では、選択部１８０１は、選択済みの関連パスコンディション組３を除いて最上位となる、ＩＤ：４の関連パスコンディション組４＝｛パス２，パス３，パス６｝を選択する。｛パス２，パス３，パス６｝のうちパス２は解決済である。
【００９８】
また、選択中の関連パスコンディション組４の共通の条件式は、「ｙ＜０」である。すなわち、パス２，パス３，パス６の各パスコンディションには要素条件式「ｙ＜０」が含まれている。したがって、対応付け部１８０３は、解決済のパス２の既存解制約項目に登録された充足解｛ｘ＝−１，ｙ＝−１｝のうち、共通の条件式「ｙ＜０」に規定されている変数ｙの充足解「ｙ＝−１」を、パス３，パス６の既存解制約項目に登録する。
【００９９】
これにより、解決済のパス２の充足解「ｙ＝−１」が流用されたことになり、パス３，パス６の変数ｙの充足解については求解部１１０３で求める必要がなくなる。なお、図２０では、パス３，パス６の充足解は変数ｙのみであるため、解決済項目は、「未解決」のままである。
【０１００】
図２１は、生成部１１０７の動作例３を示す説明図である。図２１は、図２０の動作例２からの動作例を示している。選択部１８０１は、関連パスコンディション組テーブル１５００の未選択の関連パスコンディション組の中から最上位の関連パスコンディション組を選択する。図２１では、選択部１８０１は、選択済みの関連パスコンディション組３，４を除いて最上位となる、ＩＤ：１の関連パスコンディション組１＝｛パス１，パス６｝を選択する。
【０１０１】
｛パス１，パス６｝のうち解決済のパスは存在しない。この場合、｛パス１，パス６｝からランダムにまたは番号順に選択するのではなく、非充足変数の個数が最小となるパスを優先して選択するのが好ましい。具体的には、パス１の既存解制約項目には何も登録されていないため、変数ｘ，ｙはともに、充足解が得られていない非充足変数である。したがって、パス１の非充足変数の個数は「２」である。
【０１０２】
これに対し、パス６の既存解制約項目には「ｙ＝−１」が登録されている（図２０を参照）。このため、パス６については、変数ｘ，ｙのうち変数ｘが、充足解が得られていない非充足変数である。したがって、パス６の非充足変数の個数は「１」である。選択部１８０１は、パス１の非充足変数の個数「２」とパス６の非充足変数の個数「１」とを比較し、個数が最小となるパスを優先選択する。この場合、選択部１８０１は、｛パス１，パス６｝のうちパス６を優先選択することになる。このように優先選択することで、充足解の流用性の向上を図ることができ、求解部１１０３による演算量の低減化を図ることができる。
【０１０３】
また、選択パス６については、変数ｘの充足解が既存解制約項目に登録されていない。したがって、取得部１８０４は、選択パス６のパスコンディションである［ｘ＞＝０，ｙ＜０，ｘ＋ｙ＜１２］および既存解制約「ｙ＝−１」を、求解部１１０３に与える。これにより、求解部１１０３は、充足解｛ｘ＝０｝を出力するため、取得部１８０４は、充足解｛ｘ＝０｝を取得して、テスト入力データテーブル１００のパス６の既存解制約項目に登録する。
【０１０４】
また、設定部１８０５は、選択パス６の既存解制約項目に、パスコンディションの変数ｘ，ｙについて充足解｛ｘ＝０，ｙ＝−１｝が既存解制約として登録されたため、解決済フラグを「解決済」に設定する。「●」は、便宜的に「未解決」から「解決済」に変更したことを示している。
【０１０５】
また、選択中の関連パスコンディション組１における共通の条件式は「ｘ＞＝０」である。すなわち、選択パス６や選択パス６以外の未選択パス１の各パスコンディションにも要素条件式「ｘ＞＝０」が含まれている。したがって、対応付け部１８０３は、選択パス６の既存解制約項目に登録された充足解｛ｘ＝０，ｙ＝−１｝のうち、共通の条件式「ｘ＜０」に規定されている変数ｘの充足解「ｘ＝０」を、選択パス１の既存解制約項目に登録する。
【０１０６】
このように、選択パス６の充足解「ｘ＝０」が流用されたことになり、パス１の変数ｘの充足解については求解部１１０３で求める必要がなくなる。なお、図２１では、パス１の充足解は変数ｘのみであるため、解決済項目は、「未解決」のままである。
【０１０７】
図２２は、生成部１１０７の動作例４を示す説明図である。図２２は、図２１の動作例３からの動作例を示している。選択部１８０１は、関連パスコンディション組テーブル１５００の未選択の関連パスコンディション組の中から最上位の関連パスコンディション組を選択する。図２２では、選択部１８０１は、選択済みの関連パスコンディション組３，４，１を除いて最上位となる、ＩＤ：２の関連パスコンディション組２＝｛パス１，パス７｝を選択する。
【０１０８】
｛パス１，パス７｝のうち解決済のパスは存在しない。また、｛パス１，パス７｝はいずれも変数ｙのみが非充足変数であるため、非充足変数の個数はともに「１」である。したがって、選択部１８０１は、｛パス１，パス７｝のいずれかを選択する。ここでは、選択部１８０１は、パス１を選択パスとして選択したものとする。
【０１０９】
また、選択パス１については、変数ｙの充足解が既存解制約項目に登録されていない。したがって、取得部１８０４は、選択パス１のパスコンディションである［ｘ＞＝０，ｙ＞＝０］および既存解制約「ｘ＝０」を、求解部１１０３に与える。これにより、求解部１１０３は、充足解｛ｙ＝０｝を出力するため、取得部１８０４は、充足解｛ｙ＝０｝を取得して、テスト入力データテーブル１００の選択パス１の既存解制約項目に登録する。
【０１１０】
また、設定部１８０５は、選択パス１の既存解制約項目に、パスコンディションの変数ｘ，ｙについて充足解｛ｘ＝０，ｙ＝０｝が既存解制約として登録されたため、解決済フラグを「解決済」に設定する。「●」は、便宜的に「未解決」から「解決済」に変更したことを示している。
【０１１１】
また、選択中の関連パスコンディション組２における共通の条件式は「ｙ＞＝０」である。すなわち、選択パス１や選択パス１以外の未選択パス７の各パスコンディションにも要素条件式「ｙ＞＝０」が含まれている。したがって、対応付け部１８０３は、選択パス１の既存解制約項目に登録された充足解｛ｘ＝０，ｙ＝０｝のうち、共通の条件式「ｙ＞＝０」に規定されている変数ｙの充足解「ｙ＝０」を、パス７の既存解制約項目に登録する。
【０１１２】
このように、選択パス１の充足解「ｙ＝０」が流用されたことになり、パス７の変数ｙの充足解については求解部１１０３で求める必要がなくなる。
【０１１３】
また、設定部１８０５は、未選択パス７の既存解制約項目に、パスコンディションの変数ｘ，ｙについて充足解｛ｘ＝−１，ｙ＝０｝が既存解制約として登録されたため、解決済フラグを「解決済」に設定する。「●」は、便宜的に「未解決」から「解決済」に変更したことを示している。
【０１１４】
図２３は、生成部１１０７の動作例５を示す説明図である。図２３は、図２２の動作例４からの動作例を示している。選択部１８０１は、関連パスコンディション組テーブル１５００の未選択の関連パスコンディション組の中から最上位の関連パスコンディション組を選択する。図２３では、選択部１８０１は、選択済みの関連パスコンディション組３，４，１，２を除いて最上位となる、ＩＤ：６の関連パスコンディション組６＝｛パス５，パス６，パス７｝を選択する。｛パス５，パス６，パス７｝のうちパス６，パス７は解決済である。したがって、選択部１８０１は、残りのパスのうち、非充足変数が最小となるパスを選択パスとして選択する。図２３の場合、パス５しか残されていないため、選択部１８０１は、パス５を選択パスとして選択することになる。
【０１１５】
また、選択パス５については、変数ｙの充足解が既存解制約項目に登録されていない。したがって、取得部１８０４は、選択パス５のパスコンディションである［ｘ＜０，ｙ＞＝１０，ｘ＋ｙ＜１２］および既存解制約「ｘ＝−１」を、求解部１１０３に与える。これにより、求解部１１０３は、充足解｛ｙ＝１０｝を出力するため、取得部１８０４は、充足解｛ｙ＝１０｝を取得して、テスト入力データテーブル１００の選択パス５の既存解制約項目に登録する。
【０１１６】
また、設定部１８０５は、選択パス５の既存解制約項目に、パスコンディションの変数ｘ，ｙについて充足解｛ｘ＝−１，ｙ＝１０｝が既存解制約として登録されたため、解決済フラグを「解決済」に設定する。「●」は、便宜的に「未解決」から「解決済」に変更したことを示している。
【０１１７】
図２４は、生成部１１０７の動作例６を示す説明図である。図２４は、図２３の動作例５からの動作例を示している。選択部１８０１は、関連パスコンディション組テーブル１５００の未選択の関連パスコンディション組の中から最上位の関連パスコンディション組を選択する。図２４では、選択部１８０１は、最後に残されたＩＤ：５の関連パスコンディション組５＝｛パス３，パス４｝を選択する。｛パス３，パス４｝はともに未解決である。したがって、選択部１８０１は、残りのパスのうち、非充足変数が最小となるパスを選択パスとして選択する。図２４の場合、パス３の非充足変数は変数ｘであり、パス４の非充足変数は変数ｙであるが、ともに非充足変数の個数は１個であるため、選択部１８０１は、｛パス３，パス４｝のいずれかのパスを選択する。ここでは、パス３、を選択したものとする。
【０１１８】
また、選択パス３については、変数ｘの充足解が既存解制約項目に登録されていない。したがって、取得部１８０４は、選択パス３のパスコンディションである［ｘ＞＝２，ｙ＜０，ｘ＋ｙ＞＝１２］および既存解制約「ｙ＝−１」を、求解部１１０３に与える。これにより、求解部１１０３は、充足解｛ｘ＝１３｝を出力するため、取得部１８０４は、充足解｛ｘ＝１３｝を取得して、テスト入力データテーブル１００の選択パス３の既存解制約項目に登録する。
【０１１９】
また、設定部１８０５は、選択パス３の既存解制約項目に、パスコンディションの変数ｘ，ｙについて充足解｛ｘ＝１３，ｙ＝−１｝が既存解制約として登録されたため、解決済フラグを「解決済」に設定する。「●」は、便宜的に「未解決」から「解決済」に変更したことを示している。
【０１２０】
また、選択部１８０１は、パス４の変数ｘについては充足解が得られているため、パス３の既存解制約「ｘ＝１３」を流用できない。したがって、選択部１８０１は、パス４を選択する。パス４については、変数ｙの充足解が既存解制約項目に登録されていない。したがって、取得部１８０４は、選択パス４のパスコンディションである［ｘ＜０，ｙ＞＝１０，ｘ＋ｙ＞１２］および既存解制約「ｘ＝−１」を、求解部１１０３に与える。これにより、求解部１１０３は、充足解｛ｙ＝１３｝を出力するため、取得部１８０４は、充足解｛ｙ＝１３｝を取得して、テスト入力データテーブル１００の選択パス４の既存解制約項目に登録する。
【０１２１】
また、設定部１８０５は、選択パス４の既存解制約項目に、パスコンディションの変数ｘ，ｙについて充足解｛ｘ＝−１，ｙ＝１３｝が既存解制約として登録されたため、解決済フラグを「解決済」に設定する。「●」は、便宜的に「未解決」から「解決済」に変更したことを示している。これにより、全パスについて解決済となったため、パス１〜パス７のテスト入力データが得られたことになる。
【０１２２】
＜テスト入力データ生成処理手順例＞
図２５は、テスト入力データ生成処理手順例を示すフローチャートである。図２５において、生成装置１１００は、分解部１１０４によるパスコンディション分解処理（ステップＳ２５０１）、関連付け部１１０５によるパスコンディション関連付け処理（ステップＳ２５０２）、並び替え部１１０６による並び替え処理（ステップＳ２５０３）、生成部１１０７による生成処理（ステップＳ２５０４）を実行する。これにより、生成装置１１００は、図２４に示したようなテスト入力データテーブル１００を得ることができ、テスト入力データ生成処理を終了する。
【０１２３】
なお、関連パスコンディション組テーブル１５００が存在すれば、生成処理（ステップＳ２５０４）を実行するだけで、生成装置１１００は、テスト入力データを生成することができる。したがって、関連パスコンディション組テーブル１５００が生成装置１１００に読み込まれている場合、パスコンディション分解処理（ステップＳ２５０１）〜並び替え処理（ステップＳ２５０３）は必ずしも実行する必要はない。
【０１２４】
図２６は、図２５に示したパスコンディション分解処理（ステップＳ２５０１）の詳細な処理手順例を示すフローチャートである。図２６において、生成装置１１００は、まず、テスト対象プログラム２００についてのパスコンディション群を受け取る（ステップＳ２６０１）。具体的には、たとえば、生成装置１１００は、図１２に示したようなパスコンディション群を取得する。
【０１２５】
そして、生成装置１１００は、受け取ったパスコンディション群の中から未選択のパスコンディションがあるか否かを判断する（ステップＳ２６０２）。未選択のパスコンディションがない場合（ステップＳ２６０２：Ｎｏ）、パスコンディション分解処理（ステップＳ２５０１）を終了する。一方、未選択のパスコンディションがある場合（ステップＳ２６０２：Ｙｅｓ）、生成装置１１００は、未選択のパスコンディションを１つ選択する（ステップＳ２６０３）。たとえば、図１３の（Ａ）に示したように、生成装置１１００は、パス３のパスコンディションを選択する。
【０１２６】
つぎに、生成装置１１００は、選択されたパスコンディションを論理演算子「＆＆」で分割して、複数の条件式を得る（ステップＳ２６０４）。たとえば、生成装置１１００は、図１３の（Ｂ）に示したような複数の条件式を得る。
【０１２７】
そして、生成装置１１００は、複数の条件式のうち論理否定演算子「！」を有する条件式について、論理否定演算子「！」を削除し、削除後の条件式の比較演算子を反対の意味を有する比較演算子に置換する（ステップＳ２６０５）。たとえば、生成装置１１００は、図１３の（Ｃ）に示したように、条件式「！（ｙ＞＝０）」を条件式「ｙ＜０」に変換する。
【０１２８】
つぎに、生成装置１１００は、複数の条件式を整理する（ステップＳ２６０６）。たとえば、生成装置１１００は、図１３の（Ｄ）に示したように、条件式「（ｙ＋−１０）＜０」を「ｙ＜１０」に変換する。
【０１２９】
そして、生成装置１１００は、複数の条件式の順番を並び替える（ステップＳ２６０７）。たとえば、生成装置１１００は、図１３の（Ｅ）に示したように、変数の個数やアルファベット順、比較演算子の大小関係により、条件式を並べ替える。
【０１３０】
つぎに、生成装置１１００は、包含関係のある条件式をまとめる（ステップＳ２６０８）。たとえば、生成装置１１００は、図１３の（Ｆ）に示したように、条件式「ｙ＜０」および「ｙ＜１０」を、「ｙ＜０」にする。すなわち、生成装置１１００は、条件式「ｙ＜１０」を削除する。
【０１３１】
最後に、生成装置１１００は、複数の条件式をパスコンディションの要素条件式として記憶装置に格納し（ステップＳ２６０９）、ステップＳ２６０２に戻る。たとえば、図１３の（Ｆ）に示した複数の条件式を、テスト入力データテーブル１００のパスコンディション項目に格納する。これにより、図１４に示したような分解結果が得られることになり、パスコンディション内の条件式が簡略化される。したがって、生成装置１１００は、テスト入力データの生成を効率的におこなうことができる。
【０１３２】
図２７は、図２６に示したパスコンディション関連付け処理（ステップＳ２５０２）の詳細な処理手順例を示すフローチャートである。図２７において、生成装置１１００は、まず、パス群の中に未選択パスがあるか否かを判断する（ステップＳ２７０１）。未選択パスがある場合（ステップＳ２７０１：Ｙｅｓ）、生成装置１１００は、未選択パスを１つ選択して関連元パスとする（ステップＳ２７０２）。たとえば、パス１〜パス７の中からパス１が選択された場合、パス１が関連元パスとなる。
【０１３３】
つぎに、生成装置１１００は、関連元パス以外のパス群に未選択パスがあるか否かを判断する（ステップＳ２７０３）。未選択パスがない場合（ステップＳ２７０３：Ｎｏ）、ステップＳ２７０１に戻る。一方、未選択パスがある場合（ステップＳ２７０３：Ｙｅｓ）、生成装置１１００は、未選択パスを１つ選択し、関連先候補とする（ステップＳ２７０４）。たとえば、関連元パスがパス１である場合、生成装置１１００は、パス２〜パス７の中の未選択パスとして、たとえば、パス２を選択して、関連先候補とする。
【０１３４】
そして、生成装置１１００は、関連元パスの要素条件式と関連先候補の要素条件式との間に共通部分、すなわち、共通の条件式があるか否かを判断する（ステップＳ２７０５）。たとえば、関連元パスがパス１、関連先候補がパス２の場合、共通の条件式はない。一方、パス６が関連先候補になった場合、関連元パスであるパス１との共通の条件式は、「ｘ＞＝０」である。生成装置１１００は、共通部分がない場合（ステップＳ２７０５：Ｎｏ）、ステップＳ２７０３に戻る。一方、共通部分がある場合（ステップＳ２７０５：Ｙｅｓ）、生成装置１１００は、両パスを関連パスコンディション組みに決定する（ステップＳ２７０６）。たとえば、パス１とパス６は、関連パスコンディション組となる。
【０１３５】
つぎに、生成装置１１００は、関連パスコンディション組と共通部分とを関連付けて記憶装置に格納し（ステップＳ２７０７）、ステップＳ２７０３に戻る。たとえば、生成装置１１００は、関連パスコンディション組｛パス１，パス６｝を関連パスコンディション組テーブル１５００に格納する。
【０１３６】
また、ステップＳ２７０１において、未選択パスがない場合（ステップＳ２７０１：Ｎｏ）、生成装置１１００は、関連パスコンディション組のまとめ処理を実行する（ステップＳ２７０８）。たとえば、関連パスコンディション組として、共通の条件式「ｘ＞＝０」について、パス１が関連元パスの場合に得られた｛パス１，パス６｝とパス６が関連元パスの場合に得られた｛パス６，パス１｝は、同一内容である。したがって、生成装置１１００は、いずれか一方を削除する。
【０１３７】
また、共通の条件式「ｙ＜０」については、パス２が関連元パスの場合の｛パス２，パス３｝，｛パス２，パス６｝と、パス３が関連元パスの場合の｛パス３，パス２｝，｛パス３，パス６｝と、が得られる。また、パス６が関連元パスの場合の｛パス６，パス２｝，｛パス６，パス３｝が得られる。この場合、生成装置１１００は、重複する｛パス３，パス２｝，｛パス６，パス２｝，｛パス６，パス３｝を削除する。そして、生成装置１１００は、残された｛パス２，パス３｝，｛パス２，パス６｝，｛パス３，パス６｝を統合して、｛パス２，パス３，パス６｝にする。
【０１３８】
これにより、関連パスコンディション組の数が圧縮されるため、生成装置１１００は、テスト入力データの生成の際に発生する重複処理を防止することができる。このようにして、関連パスコンディション組テーブル１５００が生成されることになり、パスコンディション関連付け処理（ステップＳ２５０２）を終了する。
【０１３９】
図２８は、図２５に示した並び替え処理（ステップＳ２５０３）の詳細な処理手順例を示すフローチャートである。図２８において、生成装置１１００は、まず、関連パスコンディション組テーブル１５００を読み込み（ステップＳ２８０１）、ルールＩＤの変数ｒをｒ＝１に設定する（ステップＳ２８０２）。そして、生成装置１１００は、ｒ＞ｒｍａｘであるか否かを判断する（ステップＳ２８０３）。ｒｍａｘはｒの最大値であり、最も優先順位が低いことを示す。
【０１４０】
ｒ＞ｒｍａｘでない場合（ステップＳ２８０３：Ｎｏ）、生成装置１１００は、図１６の優先ルールテーブル１６００を参照して、ルールＩＤ：ｒである優先ルールｒによる並び替え処理を実行する（ステップＳ２８０４）。そして、生成装置１１００は、ｒをインクリメントして（ステップＳ２８０５）、ステップＳ２８０３に戻る。ステップＳ２８０３において、ｒ＞ｍａｘになった場合（ステップＳ２８０３：Ｙｅｓ）、並び替え処理を終了する。これにより、たとえば、図１５の関連パスコンディション組テーブル１５００が図１７の関連パスコンディション組テーブル１５００となる。
【０１４１】
図２９は、図２５に示した生成処理（ステップＳ２５０４）の詳細な処理手順例（その１）を示すフローチャートである。図２９において、生成装置１１００は、まず、関連パスコンディション組テーブル１５００を読み込む（ステップＳ２９０１）。読み込み対象となる関連パスコンディション組テーブル１５００は、並び替え処理（ステップＳ２５０３）をおこなっていないものでもよく、並び替え処理（ステップＳ２５０３）の処理後のものでもよい。
【０１４２】
つぎに、生成装置１１００は、未選択の関連パスコンディション組があるか否かを判断する（ステップＳ２９０２）。未選択の関連パスコンディション組がある場合（ステップＳ２９０２：Ｙｅｓ）、生成装置１１００は、未選択の関連パスコンディション組を１つ選択する（ステップＳ２９０３）。たとえば、並び替え処理（ステップＳ２５０３）を行った場合、生成装置１１００は、未選択であってかつ最上位の関連パスコンディション組を選択することになる。
【０１４３】
そして、生成装置１１００は、選択中の関連パスコンディション組の中に、未選択の解決済パスがあるか否かを判断する（ステップＳ２９０４）。解決済パスとは、テスト入力データテーブル１００において解決済フラグが「解決済」に設定されたパスである。
【０１４４】
選択中の関連パスコンディション組の中に、未選択の解決済パスがある場合（ステップＳ２９０４：Ｙｅｓ）、生成装置１１００は、未選択の解決済パスを１つ選択する（ステップＳ２９０５）。そして、生成装置１１００は、選択された解決済パスの既存解制約のうち、選択中の関連パスコンディション組に対応する共通の条件式に含まれる変数について既存解制約があるか否かを判断する（ステップＳ２９０６）。
【０１４５】
たとえば、図２０を例に挙げると、選択中の関連パスコンディション組４の中には、解決済パス２が含まれている。この場合、選択中の関連パスコンディション組４に対応する共通の条件式「ｙ＜０」に含まれる変数ｙについて、解決済パス２には、既存解制約「ｙ＝−１」が存在する。
【０１４６】
そして、生成装置１１００は、既存解制約がない場合（ステップＳ２９０６：Ｎｏ）、ステップＳ２９０２に戻る。一方、既存解制約がある場合（ステップＳ２９０６：Ｙｅｓ）、生成装置１１００は、選択中の関連パスコンディション組のうち未選択パスに、存在すると判断された既存解制約を設定する（ステップＳ２９０７）。図２０の例では、既存解制約「ｙ＝−１」が存在するため、生成装置１１００は、テスト入力データテーブル１００において、選択中の関連パスコンディション組４のうち未選択パス３，パス６に、既存解制約「ｙ＝−１」を格納する。これにより、生成装置１１００は、既存解制約を流用することができる。
【０１４７】
このあと、生成装置１１００は、既存解制約の流用先のパスの中に、全変数の充足解（既存解制約）を持つパスがあるか否かを判断する（ステップＳ２９０８）。全変数の充足解（既存解制約）を持つパスがある場合（ステップＳ２９０８：Ｙｅｓ）、生成装置１１００は、該当するパスの解決済フラグを「解決済」に設定して（ステップＳ２９０９）、ステップＳ２９０２に戻る。一方、全変数の充足解（既存解制約）を持つパスがない場合も（ステップＳ２９０８：Ｎｏ）、ステップＳ２９０２に戻る。
【０１４８】
また、ステップＳ２９０４において、選択中の関連パスコンディション組の中に、未選択の解決済パスがないと判断された場合（ステップＳ２９０４：Ｎｏ）、生成装置１１００は、選択中の関連パスコンディション組の中から、非充足変数が最小のパスを選択して（ステップＳ２９１０）、図３０のステップＳ３００１に移行する。非充足変数が最小のパスを選択することで、生成装置１１００は、既存解制約が多いパスを選択することができる。したがって、制約ソルバを利用する場合であっても、生成装置１１００は、既存解制約が少ないパスに比べて演算量に抑制することができる。
【０１４９】
また、ステップＳ２９０２において、未選択の関連パスコンディション組がない場合（ステップＳ２９０２：Ｎｏ）、現在選択中の関連パスコンディション組が最後の組となる。したがって、生成装置１１００は、未解決パスがあるか否かを判断する（ステップＳ２９１１）。未解決パスがある場合（ステップＳ２９１１：Ｙｅｓ）、生成装置１１００は、未解決パスを選択し（ステップＳ２９１２）、図３０のステップＳ３００１に移行して、制約ソルバにより解くことになる。たとえば、図２４に示したように、パス３の変数ｘとパス４の変数ｙについて、生成装置１１００は、制約ソルバから充足解を得ることになる。一方、未解決パスがない場合（ステップＳ２９１１：Ｎｏ）、充足解がすべて得られたため、生成装置１１００は、生成処理を終了する。これにより、各パスについてテスト入力データが生成されたことになる。
【０１５０】
図３０は、図２５に示した生成処理（ステップＳ２５０４）の詳細な処理手順例（その２）を示すフローチャートである。図３０において、生成装置１１００は、ステップＳ２９１０またはステップＳ２９１２により選択されたパスにおいて、既存解制約があるか否かを判断する（ステップＳ３００１）。既存解制約がない場合（ステップＳ３００１：Ｎｏ）、生成装置１１００は、選択パスのパスコンディションを制約ソルバに与え、制約ソルバで求められた充足解を取得して（ステップＳ３００２）、ステップＳ３００４に移行する。たとえば、図１９に示したように、選択パス２には既存解制約がないため、選択パス２のパスコンディションを制約ソルバに与えることにより、生成装置１１００は、充足解「ｘ＝−１」、「ｙ＝−１」を得る。
【０１５１】
一方、既存解制約がある場合（ステップＳ３００１：Ｙｅｓ）、生成装置１１００は、選択パスのパスコンディションおよび既存解制約を制約ソルバに与え、制約ソルバで求められた充足解を取得して（ステップＳ３００３）、ステップＳ３００４に移行する。たとえば、図２１に示したように、選択パス６には変数ｙについてのみ既存解制約「ｙ＝−１」があるため、選択パス６のパスコンディションおよび既存解制約「ｙ＝−１」を制約ソルバに与えることにより、生成装置１１００は、充足解「ｘ＝０」を得る。
【０１５２】
このあと、生成装置１１００は、ステップＳ３００２またはステップＳ３００３により取得した充足解を既存解制約に設定する（ステップＳ３００４）。そして、生成装置１１００は、既存解制約が設定された選択パスにおいて、全変数の充足解（既存解制約）を持つか否かを判断する（ステップＳ３００５）。全変数の充足解（既存解制約）を持つ場合（ステップＳ３００５：Ｙｅｓ）、生成装置１１００は、選択パスの解決済フラグを「解決済」に設定して（ステップＳ３００６）、ステップＳ２９０４に戻る。一方、全変数の充足解（既存解制約）を持たない場合も（ステップＳ３００５：Ｎｏ）、ステップＳ２９０４に戻る。
【０１５３】
図３０に示した処理手順によれば、生成装置１１００は、未解決の選択パスに既存解制約がない場合は制約ソルバで全変数の充足解を得ることができる。また、既存解制約がある場合は、生成装置１１００は、既存解制約を制約ソルバに与えて、未知の充足解を得ることができる。すなわち、非充足変数についてのみ充足解が求められるため、制約ソルバによる演算量の低減化を図ることができる。
【０１５４】
このように、本実施の形態によれば、共通の条件式を満たす充足解を流用することができるため、テスト入力データを求める際の制約ソルバによる演算量の低減化を図ることができる。したがって、テスト入力データの生成効率の向上を図ることができる。また、これにともない、テスト入力データを使用する期待値算出の計算量の低減化も図ることができる。
【０１５５】
また、一部の変数についてのみ充足解が得られていない場合には、そのパスのパスコンディションだけでなく、既存解制約も制約ソルバに与えることにより、充足解が得られていない変数についてのみ充足解を得ることができる。このように、パスコンディションだけでなく既存解制約も制約ソルバに与えることにより、制約ソルバでの演算量の低減化を図ることができる。したがって、テスト入力データの生成効率の向上を図ることができる。
【０１５６】
また、解決済パスのパスコンディションについては非充足変数が存在しないため、選択対象外とすることにより、テスト入力データの重複生成を回避することができ、生成効率の向上を図ることができる。
【０１５７】
また、関連パスコンディション組の中からパスを選択する場合、非充足変数の個数が最小のパスを選択することにより、充足解をより多く持つパスを優先的に選択することができる。したがって、選択パスに存在する既存解制約を流用できる可能性が上がり、テスト入力データの生成効率の向上を図ることができる。
【０１５８】
また、関連パスコンディション組について、条件式の個数により優先順位を設定することにより、流用先が多くなるように優先的に関連パスコンディション組を選択することができる。したがって、テスト入力データの生成効率の向上を図ることができる。
【０１５９】
また、条件式内の変数の個数により優先順位を設定することにより、制約ソルバを用いる場合でもできる限り変数の個数が少ないものから制約ソルバに与えることができ、制約ソルバの演算量の低減化を図るとができる。
【０１６０】
また、パスコンディションを分解することにより、要素条件式に圧縮することができる。したがって、パス間で共通の条件式を探索しやすくなり、関連パスコンディション組テーブル１５００の生成効率の向上を図ることができる。
【０１６１】
上述した実施の形態に関し、さらに以下の付記を開示する。
【０１６２】
（付記１）プログラムがシンボリック実行された場合の実行可能な経路であるパス群の各パスでの条件式の系列を示すパスコンディション間に共通の条件式がある複数のパスと前記共通の条件式とを関連付けた、前記共通の条件式と前記複数のパスとの組み合わせ群を記憶する記憶装置を参照して、前記組み合わせ群のいずれかの組み合わせに存在する複数のパスの中から、いずれかのパスを選択する選択部と、
前記選択部によって選択されたパスのパスコンディションに含まれている変数について当該パスコンディションを満たす充足解が存在し、かつ、前記変数が前記共通の条件式に含まれているか否かを判断する判断部と、
前記判断部によって前記充足解が存在し、かつ、前記変数が前記共通の条件式に含まれていると判断された場合、前記いずれかの組み合わせに存在する複数のパスのうち前記選択されたパス以外のパスのパスコンディションに、前記充足解を対応付けて、前記記憶装置に格納する対応付け部と、
を有することを特徴とする生成装置。
【０１６３】
（付記２）前記判断部によって前記充足解が存在しないと判断された場合、前記選択されたパスのパスコンディションをソルバに与えることにより、前記充足解を前記ソルバから取得する取得部を備え、
前記対応付け部は、
前記選択されたパスのパスコンディションに、前記取得部によって取得された前記充足解を対応付けることを特徴とする付記１に記載の生成装置。
【０１６４】
（付記３）前記判断部によって前記充足解が存在するが、前記変数が前記共通の条件式に含まれていないと判断された場合、前記選択されたパスのパスコンディションおよび前記充足解をソルバに与えることにより、前記選択されたパスのパスコンディションに含まれている前記変数以外の他の変数についての他の充足解を前記ソルバから取得する取得部を備え、
前記対応付け部は、
前記選択されたパスのパスコンディションに、前記充足解および前記取得部によって取得された他の充足解を対応付けることを特徴とする付記１に記載の生成装置。
【０１６５】
（付記４）パスコンディションに含まれているいずれの変数についても充足解がパスコンディションに対応付けられたパスを解決済みパスに設定する設定部を備え、
前記選択部は、
前記いずれかの組み合わせに存在する複数のパスのうち、前記設定部によって設定された解決済みパス以外の残余のパスの中から、いずれかのパスを選択することを特徴とする付記１〜３のいずれか一つに記載の生成装置。
【０１６６】
（付記５）前記選択部は、
前記いずれかの組み合わせに存在する複数のパスの中から、パスコンディションに含まれており、かつ、充足解が得られていない変数の個数が最小であるパスを選択することを特徴とする付記１〜３のいずれか一つに記載の生成装置。
【０１６７】
（付記６）前記パスコンディション群のうち、パスコンディション間に共通の条件式がある複数のパスと前記共通の条件式とを関連付けることにより、前記共通の条件式と前記複数のパスとの組み合わせ群を生成する関連付け部を備え、
前記選択部は、
前記関連付け部によって関連付けられた前記共通の条件式と前記複数のパスとの組み合わせ群のうち、いずれかの組み合わせに存在する複数のパスの中から、いずれかのパスを選択することを特徴とする付記１〜５のいずれか一つに記載の生成装置。
【０１６８】
（付記７）パス個数の多い順に並び替える第１優先規則に従って、前記共通の条件式と前記複数のパスとの組み合わせ群を、当該組み合わせ群の各組み合わせに存在する前記複数のパスの個数が多い順に並び替える並び替え部を備え、
前記選択部は、
前記並び替え部による並び替え後の組み合わせ群のいずれかの組み合わせに存在する複数のパスの中から、いずれかのパスを選択することを特徴とする付記１〜６のいずれか一つに記載の生成装置。
【０１６９】
（付記８）前記並び替え部は、
さらに、前記共通の条件式に含まれている変数の個数の少ない順に並び替える第２優先規則に従って、前記共通の条件式と前記複数のパスとの組み合わせ群を、当該組み合わせ群の各組み合わせに存在する前記複数のパスの個数が多い順に並び替えることを特徴とする付記７に記載の生成装置。
【０１７０】
（付記９）前記パスコンディション群の少なくとも１のパスコンディションを論理積演算子を境界にして複数の条件式に分解する分解部を備え、
前記選択部は、
前記分解部による分解後のパスコンディション群のうち、パスコンディション間に共通の条件式がある複数のパスと前記共通の条件式とを関連付けた、前記共通の条件式と前記複数のパスとの組み合わせ群のいずれかの組み合わせに存在する複数のパスの中から、いずれかのパスを選択することを特徴とする付記１〜８のいずれか一つに記載の生成装置。
【０１７１】
（付記１０）前記分解部は、
前記複数の条件式を包含関係のある条件式どうしでまとめることを特徴とする付記９に記載の生成装置。
【０１７２】
（付記１１）前記分解部は、
前記複数の条件式のうち論理否定演算子を有する条件式から前記論理否定演算子を削除し、削除後の条件式に存在する比較演算子を反対の意味の比較演算子に変換することを特徴とする付記９または１０に記載の生成装置。
【０１７３】
（付記１２）コンピュータが、
プログラムがシンボリック実行された場合の実行可能な経路であるパス群の各パスでの条件式の系列を示すパスコンディション間に共通の条件式がある複数のパスと前記共通の条件式とを関連付けた、前記共通の条件式と前記複数のパスとの組み合わせ群を記憶する記憶装置を参照して、前記組み合わせ群のいずれかの組み合わせに存在する複数のパスの中から、いずれかのパスを選択し、
選択されたパスのパスコンディションに含まれている変数について当該パスコンディションを満たす充足解が存在し、かつ、前記変数が前記共通の条件式に含まれているか否かを判断し、
前記充足解が存在し、かつ、前記変数が前記共通の条件式に含まれていると判断された場合、前記いずれかの組み合わせに存在する複数のパスのうち前記選択されたパス以外のパスのパスコンディションに、前記充足解を対応付けて、前記記憶装置に格納する、
処理を実行することを特徴とする生成方法。
【０１７４】
（付記１３）プログラムがシンボリック実行された場合の実行可能な経路であるパス群の各パスでの条件式の系列を示すパスコンディション間に共通の条件式がある複数のパスと前記共通の条件式とを関連付けた、前記共通の条件式と前記複数のパスとの組み合わせ群を記憶する記憶装置を参照して、前記組み合わせ群のいずれかの組み合わせに存在する複数のパスの中から、いずれかのパスを選択し、
前記選択部によって選択されたパスのパスコンディションに含まれている変数について当該パスコンディションを満たす充足解が存在し、かつ、前記変数が前記共通の条件式に含まれているか否かを判断し、
前記充足解が存在し、かつ、前記変数が前記共通の条件式に含まれていると判断された場合、前記いずれかの組み合わせに存在する複数のパスのうち前記選択されたパス以外のパスのパスコンディションに、前記充足解を対応付けて、前記記憶装置に格納する、
処理をコンピュータに実行させることを特徴とする生成プログラム。
【符号の説明】
【０１７５】
１００  テスト入力データテーブル
２００  テスト対象プログラム
３００  戻り値クラスのプログラム
６００  パスコンディションテーブル
１１００  生成装置
１１０１  実行部
１１０２  記録部
１１０３  求解部
１１０４  分解部
１１０５  関連付け部
１１０６  並び替え部
１１０７  生成部
１５００  関連パスコンディション組テーブル
１６００  優先ルールテーブル
１８０１  選択部
１８０２  判断部
１８０３  対応付け部
１８０４  取得部
１８０５  設定部
【図１】
0005772607.tif 000002
【図２】
0005772607.tif 000003
【図３】
0005772607.tif 000004
【図４】
0005772607.tif 000005
【図５】
0005772607.tif 000006
【図６】
0005772607.tif 000007
【図７】
0005772607.tif 000008
【図８】
0005772607.tif 000009
【図９】
0005772607.tif 000010
【図１０】
0005772607.tif 000011
【図１１】
0005772607.tif 000012
【図１２】
0005772607.tif 000013
【図１３】
0005772607.tif 000014
【図１４】
0005772607.tif 000015
【図１５】
0005772607.tif 000016
【図１６】
0005772607.tif 000017
【図１７】
0005772607.tif 000018
【図１８】
0005772607.tif 000019
【図１９】
0005772607.tif 000020
【図２０】
0005772607.tif 000021
【図２１】
0005772607.tif 000022
【図２２】
0005772607.tif 000023
【図２３】
0005772607.tif 000024
【図２４】
0005772607.tif 000025
【図２５】
0005772607.tif 000026
【図２６】
0005772607.tif 000027
【図２７】
0005772607.tif 000028
【図２８】
0005772607.tif 000029
【図２９】
0005772607.tif 000030
【図３０】
0005772607.tif 000031