(57)【特許請求の範囲】
【請求項１】
対象プログラムにおいて実行される複数の関数の呼び出し関係を表すコールツリーを生成し、
前記複数の関数の各々についてシンボリック実行により、シンボル変数に関わる分岐を辿った履歴を表す第１の条件と、当該関数の引数及び返却値についての第２の条件の少なくともいずれかを含むパス条件表を前記複数の関数の各々について生成し、
前記コールツリーに基づいて、前記複数の関数に含まれるいずれかの関数を呼び出す第１の関数と前記第１の関数に呼び出される第２の関数との関連数を求め、
前記関連数の大きさに基づいた前記第１の関数と前記第２の関数のペア毎に、前記パス条件表を並列に統合し、
統合後のパス条件表を満たすシンボル変数の値を算出し、
当該値をテストケースとして生成する、
処理をコンピュータに実行させるテストケース生成プログラム。
【請求項２】
前記第２の関数が複数の前記第１の関数から呼び出される場合に、前記第２の関数を呼出元毎に複製する処理をさらに含むことを特徴とする請求項１に記載のテストケース生成プログラム。
【請求項３】
前記パス条件表を生成する処理を、前記複数の関数の各々について並列に実行させることを特徴とする請求項１又は２に記載のテストケース生成プログラム。
【請求項４】
前記シンボル変数を設定するためのドライバと当該ドライバにおいて呼び出されるスタブを生成する処理をさらに含み、
前記ドライバと前記スタブを生成する処理を、前記複数の関数の各々について並列に実行させることを特徴とする請求項１から３のいずれか１項に記載のテストケース生成プログラム。
【請求項５】
対象プログラムにおいて実行される複数の関数の呼び出し関係を表すコールツリーを生成し、
前記複数の関数の各々についてシンボリック実行により、シンボル変数に関わる分岐を辿った履歴を表す第１の条件と、当該関数の引数及び返却値についての第２の条件の少なくともいずれかを含むパス条件表を前記複数の関数の各々について生成し、
前記コールツリーに基づいて、前記複数の関数に含まれるいずれかの関数を呼び出す第１の関数と前記第１の関数に呼び出される第２の関数との関連数を求め、
前記関連数の大きさに基づいた前記第１の関数と前記第２の関数のペア毎に、前記パス条件表を並列に統合し、
統合後のパス条件表を満たすシンボル変数の値を算出し、
当該値をテストケースとして生成する、
処理をコンピュータが実行するテストケース生成方法。
【請求項６】
対象プログラムにおいて実行される複数の関数の呼び出し関係を表すコールツリーを生成し、前記複数の関数の各々についてシンボリック実行により、シンボル変数に関わる分岐を辿った履歴を表す第１の条件と、当該関数の引数及び返却値についての第２の条件の少なくともいずれかを含むパス条件表を前記複数の関数の各々について生成する第１の生成手段と、
前記コールツリーに基づいて、前記複数の関数に含まれるいずれかの関数を呼び出す第１の関数と前記第１の関数に呼び出される第２の関数との関連数を求め、前記関連数の大きさに基づいた前記第１の関数と前記第２の関数のペア毎に、前記パス条件表を並列に統合する統合手段と、
統合後のパス条件表を満たすシンボル変数の値を算出し、当該値をテストケースとして生成する第２の生成手段と、
を有するテストケース生成装置。
【請求項７】
前記処理は、前記関連数が最大の前記第１の関数と前記第２の関数のペア毎に、前記パス条件表を論理積によって並列に統合する、
ことを特徴とする請求項１に記載のテストケース生成プログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本件は、テストケース生成プログラム、テストケース生成方法、及びテストケース生成装置に関する。
【背景技術】
【０００２】
シンボリック実行とは、プログラム内の変数を具体化せず、変数をシンボル化して（すなわち、記号のまま）プログラムを実行する技術である（例えば特許文献１参照）。シンボリック実行中においては、具体値ではなくシンボル変数が満たすべき条件（以下、パス条件と呼ぶ）がシンボル変数の値としてメモリ等に保持される。そして、シンボリック実行が完了すると、プログラムにおける各パスについてパス条件が得られるため、パス条件を満たすシンボル変数の具体値を求めることで、プログラムをテストするためのテストケースを得ることができる。
【０００３】
例えば、図２６に示した、絶対値取得関数ｂａｄ＿ａｂｓとして問題があるプログラムについてシンボリック実行を行うことを考える。図２６には、シンボリック実行の対象になるプログラムＰと、そのプログラムＰの制御構造ＣＳとが示されている。このプログラムＰには変数ｘが含まれている。このプログラムＰを対象としてシンボリック実行を行うと、ｘ＝−２というテストケース（パス条件はｘ＜０）と、ｘ＝１２３４というテストケース（パス条件はｘ≧０かつｘ＝１２３４）と、ｘ＝３というテストケース（パス条件はｘ≧０かつｘ≠１２３４）とを得ることができる。
【先行技術文献】
【特許文献】
【０００４】
【特許文献１】特開２０１３−１５６９６１号公報
【発明の概要】
【発明が解決しようとする課題】
【０００５】
上述したように、通常のシンボリック実行は、プログラム内の全パスを対象範囲とする。例えば図２６に示したような単純なプログラムＰであれば、たとえ全パスについてシンボリック実行を行ったとしても、最終的なテストケースを得るまでの時間はさほどかからない。しかしながら、複数のプログラムが連携して実行されるなどの場合についてシンボリック実行を行うと、パスの数が非常に多いことに起因して、最終的なテストケースを得るまでに非常に時間がかかるという問題がある。
【０００６】
そこで、１つの側面では、本件は、シンボリック実行を利用したテストケースを短時間で生成するテストケース生成プログラム、テストケース生成方法、及びテストケース生成装置を提供することを目的とする。
【課題を解決するための手段】
【０００７】
本明細書に開示のテストケース生成プログラムは、対象プログラムにおいて実行される複数の関数の呼び出し関係を表すコールツリーを生成し、前記複数の関数の各々についてシンボリック実行により、シンボル変数に関わる分岐を辿った履歴を表す第１の条件と、当該関数の引数及び返却値についての第２の条件の少なくともいずれかを含むパス条件表を前記複数の関数の各々について生成し、前記コールツリーに基づいて、前記複数の関数に含まれるいずれかの関数を呼び出す第１の関数と前記第１の関数に呼び出される第２の関数との関連数を求め、前記関連数の大きさに基づいた前記第１の関数と前記第２の関数のペア毎に、前記パス条件表を並列に統合し、統合後のパス条件表を満たすシンボル変数の値を算出し、当該値をテストケースとして生成する、処理をコンピュータに実行させるテストケース生成プログラムである。
【０００８】
本明細書に開示のテストケース生成方法は、対象プログラムにおいて実行される複数の関数の呼び出し関係を表すコールツリーを生成し、前記複数の関数の各々についてシンボリック実行により、シンボル変数に関わる分岐を辿った履歴を表す第１の条件と、当該関数の引数及び返却値についての第２の条件の少なくともいずれかを含むパス条件表を前記複数の関数の各々について生成し、前記コールツリーに基づいて、前記複数の関数に含まれるいずれかの関数を呼び出す第１の関数と前記第１の関数に呼び出される第２の関数との関連数を求め、前記関連数の大きさに基づいた前記第１の関数と前記第２の関数のペア毎に、前記パス条件表を並列に統合し、統合後のパス条件表を満たすシンボル変数の値を算出し、当該値をテストケースとして生成する、処理をコンピュータが実行するテストケース生成方法である。
【０００９】
本明細書に開示のテストケース生成装置は、対象プログラムにおいて実行される複数の関数の呼び出し関係を表すコールツリーを生成し、前記複数の関数の各々についてシンボリック実行により、シンボル変数に関わる分岐を辿った履歴を表す第１の条件と、当該関数の引数及び返却値についての第２の条件の少なくともいずれかを含むパス条件表を前記複数の関数の各々について生成する第１の生成手段と、前記コールツリーに基づいて、前記複数の関数に含まれるいずれかの関数を呼び出す第１の関数と前記第１の関数に呼び出される第２の関数との関連数を求め、前記関連数の大きさに基づいた前記第１の関数と前記第２の関数のペア毎に、前記パス条件表を並列に統合する統合手段と、統合後のパス条件表を満たすシンボル変数の値を算出し、当該値をテストケースとして生成する第２の生成手段と、を有するテストケース生成装置である。
【発明の効果】
【００１０】
本明細書に開示のテストケース生成プログラム、テストケース生成方法、及びテストケース生成装置によれば、シンボリック実行を利用したテストケースを短時間で生成することができる。
【図面の簡単な説明】
【００１１】
【図１】図１は、テストケース生成装置のブロック図の一例である。
【図２】図２は、対象プログラム格納部に格納される対象プログラムの一例である。
【図３】図３は、対象プログラムについて生成されたコールツリーである。
【図４】図４は、関数の複製と最大マッチングの一例を説明するための図である。
【図５】図５は、パス条件表の統合処理の一例を説明するための図である。
【図６】図６は、パス条件表の統合処理の一例を説明するための図である。
【図７】図７は、パス条件表の統合処理の一例を説明するための図である。
【図８】図８は、関数の統合及び最大マッチングの一例を説明するための図である。
【図９】図９は、パス条件表の統合処理の一例を説明するための図である。
【図１０】図１０は、パス条件表の統合処理の一例を説明するための図である。
【図１１】図１１は、関数の統合及び最大マッチングの一例を説明するための図である。
【図１２】図１２は、パス条件表の統合処理の一例を説明するための図である。
【図１３】図１３は、関数の統合及びテストケース生成の一例を説明するための図である。
【図１４】図１４は、計算時間の短縮を説明するためのグラフである。
【図１５】図１５は、コールスタックについて説明するための図である。
【図１６】図１６は、プログラムの実行木を示す図である。
【図１７】図１７は、テストケース生成装置の動作の一例を示すフローチャートである。
【図１８】図１８は、ドライバ・スタブ生成処理の動作の一例を示すフローチャートである。
【図１９】図１９は、対象関数、ドライバ及びスタブの一例を説明するための図である。
【図２０】図２０は、シンボリック実行の動作の一例を示すフローチャートである。
【図２１】図２１は、シンボリック実行の動作の一例を示すフローチャートである。
【図２２】図２２は、シンボリック実行の動作の一例を示すフローチャートである。
【図２３】図２３は、追加処理の動作の一例を示すフローチャートである。
【図２４】図２４は、パス条件表の統合処理の動作の一例を示すフローチャートである。
【図２５】図２５は、テストケース生成装置のハードウェア構成の一例である。
【図２６】図２６は、シンボリック実行の対象になるプログラムと、そのプログラムの制御構造の一例である。
【発明を実施するための形態】
【００１２】
以下、本件を実施するための形態について図面を参照して説明する。
【００１３】
図１は、テストケース生成装置１００のブロック図の一例である。図１に示すように、テストケース生成装置１００は、入力部１０１と、対象プログラム格納部１０２と、ドライバ・スタブ生成部１０３と、ドライバ・スタブ格納部１０４とを含んでいる。テストケース生成装置１００は、第１の生成手段としてのシンボリック実行部１０５と、実行状態格納部１０６と、パス条件表格納部１０７と、コールツリー格納部１０８とを含んでいる。テストケース生成装置１００は、統合手段としてのパス条件統合部１０９と、第２の生成手段としてのテストケース生成部１１０と、テストケース格納部１１１とを含んでいる。
【００１４】
入力部１０１は、テストケースが生成されるべきプログラムの入力を受け付ける。入力部１０１は受け付けたプログラムを対象プログラムとして対象プログラム格納部１０２に格納する。
ドライバ・スタブ生成部１０３は、対象プログラム格納部１０２に格納されている対象プログラムに基づき、シンボリック実行で利用されるドライバ及びスタブを関数（ノードとも呼ばれる）毎に並列に生成し、ドライバ・スタブ格納部１０４に格納する。
【００１５】
シンボリック実行部１０５は、対象プログラム格納部１０２に格納されている対象プログラムと、ドライバ・スタブ格納部１０４に格納されているドライバ及びスタブとを利用して、シンボリック実行を関数毎に並列に行い、シンボリック実行中における後述の実行状態を実行状態格納部１０６に格納する。シンボリック実行では、数値だけでなく文字又は文字列も扱われる。また、シンボリック実行部１０５は、シンボリック実行により生成したパス条件及び返却値（返り値とも呼ばれる）等を含むパス条件表をパス条件表格納部１０７に格納する。さらに、シンボリック実行部１０５は、関数の呼び出し関係を表すコールツリーを生成し、生成したコールツリーをコールツリー格納部１０８に格納する。
【００１６】
パス条件統合部１０９は、パス条件表格納部１０７に格納されているパス条件表及びコールツリー格納部１０８に格納されているコールツリーを用いて、パス条件表を統合し、処理結果をパス条件表格納部１０７に格納する。尚、パス条件統合部１０９の詳細な説明は後述する。
テストケース生成部１１０は、パス条件表格納部１０７に最終的に格納されたパス条件表におけるパス条件を満たすテストケースを生成し、テストケース格納部１１１に格納する。
【００１７】
図２は、対象プログラム格納部１０２に格納される対象プログラム１０の一例である。
図２の例では、関数ｆｕｎｃＡを表すプログラムと、関数ｆｕｎｃＢを表すプログラムと、関数ｆｕｎｃＣを表すプログラムと、関数ｆｕｎｃＤを表すプログラムと、関数ｆｕｎｃＥを表すプログラムと、関数ｆｕｎｃＦを表すプログラムとが格納される。関数ｆｕｎｃＡは４行目において関数ｆｕｎｃＢを、７行目において関数ｆｕｎｃＤを呼び出す。関数ｆｕｎｃＢは５行目において関数ｆｕｎｃＣを呼び出す。関数ｆｕｎｃＤは２行目において関数ｆｕｎｃＥを、４行目において関数ｆｕｎｃＦを呼び出す。関数ｆｕｎｃＦは３行目において関数ｆｕｎｃＥを呼び出す。したがって、本実施形態においては、図２に示すように、複数の関数が実行されるプログラムが処理対象の対象プログラム１０になる。
【００１８】
図３は、図２に示した対象プログラム１０について生成されたコールツリー２０である。各矩形領域は関数を表しており、矩形領域内に示された文字が関数名と対応している。例えば、文字「Ａ」が示された矩形領域は関数ｆｕｎｃＡを表している。図３において、矢印に指されている関数は呼び出される側の関数である。以下の説明では、適宜、呼び出される側の関数を被呼出関数と呼び、呼び出す側の関数を呼出関数と呼ぶ。例えば、関数ｆｕｎｃＡから矢印で指されている関数ｆｕｎｃＢは、関数ｆｕｎｃＡに対する被呼出関数に該当し、関数ｆｕｎｃＡは呼出関数に該当する。このコールツリー２０においては、最も上位の関数は関数ｆｕｎｃＡであり、最も下位の関数は関数ｆｕｎｃＣ及び関数ｆｕｎｃＥである。コールツリー格納部１０８には、このような関数の呼び出し関係を表すコールツリー２０が格納される。
【００１９】
次に、図４乃至図１３を参照して、パス条件統合部１０９の詳細について説明する。
【００２０】
パス条件統合部１０９は、コールツリー格納部１０８に格納されたコールツリーに基づいて、複数の呼出関数から呼び出されている被呼出関数が存在すると判断した場合、被呼出関数を呼び出し元ごとに複製する。したがって、図４（ａ）に示すように、関数ｆｕｎｃＤと関数ｆｕｎｃＦから呼び出されている被呼出関数ｆｕｎｃＥは複製されて、被呼出関数ｆｕｎｃＥとは別の被呼出関数ｆｕｎｃＥ´が生成される。被呼出関数ｆｕｎｃＥ´は関数ｆｕｎｃＦから呼び出される。尚、複数の呼出関数から呼び出されている被呼出関数が存在しない場合、当該複製処理は行われない。
【００２１】
パス条件統合部１０９は、関数の複製を終えると、コールツリーの最大マッチングを求める。グラフ理論においてマッチングとはグラフ（ここではコールツリー）内の任意の１つのノードが他の高々１つのノードからの関連（ここでは関数の呼出または被呼出）を持つような関連の集合のことである。最大マッチングとはマッチングで関連の数が最大となるものである。最大マッチングのアルゴリズムは、Hopcroft-Karpのアルゴリズムが有名であるが、近年並列計算による近似アルゴリズムによって線形時間で結果を出力できる。ここでは正確に最大であるマッチングとならなくても結果には影響しないため、近似アルゴリズムを採用する。ここでは、一例として図４（ｂ）に示すように、関数ｆｕｎｃＡと関数ｆｕｎｃＢ、関数ｆｕｎｃＤと関数ｆｕｎｃＥ、関数ｆｕｎｃＦと関数ｆｕｎｃＥ´をそれぞれペアとするマッチングで関連の数が最大であるとして最大マッチングが求められている。
【００２２】
パス条件統合部１０９は、最大マッチングを求めた後、最大マッチングとなった呼出関数と被呼出関数のそれぞれのパス条件表を論理積によって並列に統合する。パス条件表は、上述したように、パス条件表格納部１０７に格納されている。具体的には、図５から図７までに示すように、パス条件表Ｔ１，・・・，Ｔ６は、それぞれＩＤ、パス条件及び返却値を含んでいる。ＩＤは、パス条件のＩＤである。パス条件には、シンボル変数に関わる分岐を辿った履歴を表すパス条件そのもの（第１の条件）と、呼出関数の引数についての条件（第２の条件）とが含まれる。例えば、図５に示すパス条件表Ｔ１では、「ｘ＞０」及び「ｆｕｎｃＢ＿ｒｅｔ＞０」がパス条件そのものに該当する。一方、「ｆｕｎｃＢ＿ｘ＝＝ｘ」及び「ｆｕｎｃＤ＿ｘ＝＝ｆｕｎｃＢ＿ｒｅｔ」は呼出関数の引数についての条件に該当する。尚、ｆｕｎｃＢ＿ｒｅｔはｆｕｎｃＢの返却値を表し、ｆｕｎｃＢ＿ｘはｆｕｎｃＢの引数ｘを表している。他の返却値や引数についても基本的に同様である。図５から図７におけるパス条件表Ｔ１，・・・，Ｔ６の返却値は、それぞれｆｕｎｃＡ，・・・，ｆｕｎｃＥ´の返却値である。
【００２３】
パス条件表の統合処理は、最大マッチングとなった呼出関数と被呼出関数との間で行われ、図５から図７に示すように、呼出関数ｆｕｎｃＡのパス条件表Ｔ１と被呼出関数ｆｕｎｃＢのパス条件表Ｔ２、呼出関数ｆｕｎｃＤのパス条件表Ｔ３と被呼出関数ｆｕｎｃＥのパス条件表Ｔ４、及び呼出関数ｆｕｎｃＦのパス条件表Ｔ５と被呼出関数ｆｕｎｃＥ´のパス条件表Ｔ６をそれぞれ論理積によって並列に統合することで行われる。この結果、呼出関数ｆｕｎｃＡのパス条件表Ｔ１と被呼出関数ｆｕｎｃＢのパス条件表Ｔ２の統合であれば、図５に示すように、統合したパス条件表Ｔ７が生成される。
【００２４】
図５において、パス条件表Ｔ７のパス条件によっては２つの括弧が含まれている。左側の括弧にはｆｕｎｃＡのパス条件が含まれている。右側の括弧には、ｆｕｎｃＢのパス条件とｆｕｎｃＢの返却値を変換したパス条件が含まれている。例えば、ｆｕｎｃＢの返却値「０」は、「ｆｕｎｃＢ＿ｒｅｔ＝＝０」に変換されて、右側の括弧に追加される。２つの括弧内のパス条件は論理積によって結合されている。パス条件の欄の右に設けられているＳＡＴの欄には、パス条件を満たす解が存在するか否かについての判定結果が示されている。ＳＡＴ（Satisfied）である場合には、パス条件を満たす解が存在する。ＵＮＳＡＴ（Unsatisfied）である場合には、パス条件を満たす解が存在しない。例えば、統合したパス条件表において、「ｆｕｎｃＢ＿ｒｅｔ＞０」と「ｆｕｎｃＢ＿ｒｅｔ＝＝０」を同時に満たす解は存在しないため、ＳＡＴの欄にはＵＮＳＡＴが記録される。
【００２５】
以上説明したパス条件の統合処理と同様に、呼出関数ｆｕｎｃＤのパス条件表Ｔ３と被呼出関数ｆｕｎｃＥのパス条件表Ｔ４の統合であれば、図６に示すように、統合したパス条件表Ｔ８が生成される。呼出関数ｆｕｎｃＦのパス条件表Ｔ５と被呼出関数ｆｕｎｃＥ´のパス条件表Ｔ６の統合であれば、図７に示すように、統合したパス条件表Ｔ９が生成される。パス条件統合部１０９は、生成したパス条件表Ｔ７，Ｔ８，Ｔ９のうちＳＡＴのものをパス条件表格納部１０７に格納する。
【００２６】
パス条件統合部１０９は、パス条件表の統合処理を終えると、最大マッチングとなった呼出関数と被呼出関数を統合し、統合した１つの関数を利用して、再度、最大マッチングを求め、パス条件表を統合する。具体的には、パス条件統合部１０９は、図８（ａ）において、最大マッチングに基づいて、関数ｆｕｎｃＡと関数ｆｕｎｃＢとの統合、関数ｆｕｎｃＤと関数ｆｕｎｃＥとの統合、及び関数ｆｕｎｃＦと関数ｆｕｎｃＥ´との統合を実行する。以下、関数ｆｕｎｃＡと関数ｆｕｎｃＢとを統合した後の関数を関数ｆｕｎｃＡＢと呼ぶ。関数ｆｕｎｃＤと関数ｆｕｎｃＥとを統合した後の関数を関数ｆｕｎｃＤＥと呼ぶ。関数ｆｕｎｃＦと関数ｆｕｎｃＥ´とを統合した後の関数を関数ｆｕｎｃＥ´Ｆと呼ぶ。パス条件統合部１０９は、呼出関数と被呼出関数との統合を終えると、再度、最大マッチングを求める。ここでは、一例として図８（ｂ）に示すように、関数ｆｕｎｃＡＢと関数ｆｕｎｃＣ、関数ｆｕｎｃＤＥと関数ｆｕｎｃＥ´Ｆをそれぞれペアとするマッチングで関連の数が最大であるとして最大マッチングが求められている。
【００２７】
パス条件統合部１０９は、最大マッチングを求めた後、最大マッチングとなった呼出関数のパス条件表と被呼出関数のパス条件表を論理積によって並列に統合する。パス条件表の統合処理は、図９及び図１０に示すように、呼出関数である関数ｆｕｎｃＡＢのパス条件表Ｔ７のうちＳＡＴとなったものと被呼出関数である関数ｆｕｎｃＣのパス条件表Ｔ１０、及び呼出関数である関数ｆｕｎｃＤＥのパス条件表Ｔ８のうちＳＡＴとなったものと被呼出関数である関数ｆｕｎｃＥ´Ｆのパス条件表Ｔ９のうちＳＡＴとなったものをそれぞれ論理積によって並列に統合することで行われる。この結果、関数ｆｕｎｃＡＢのパス条件表Ｔ７と関数ｆｕｎｃＣのパス条件表Ｔ１０の統合であれば、図９に示すように、統合したパス条件表Ｔ１１が生成される。同様に、関数ｆｕｎｃＤＥのパス条件表Ｔ８と関数ｆｕｎｃＥ´Ｆのパス条件表Ｔ９の統合であれば、図１０に示すように、統合したパス条件表Ｔ１２が生成される。パス条件統合部１０９は、生成したパス条件表Ｔ１１，Ｔ１２のうちＳＡＴのものをパス条件表格納部１０７に格納する。
【００２８】
パス条件統合部１０９は、パス条件表の統合処理を終えると、最大マッチングとなった呼出関数と被呼出関数を統合し、統合した１つの関数を利用して、再度、最大マッチングを求め、パス条件表を統合する。具体的には、図１１（ａ）において、パス条件統合部１０９は、最大マッチングに基づいて、関数ｆｕｎｃＡＢと関数ｆｕｎｃＣとの統合、及び関数ｆｕｎｃＤＥと関数ｆｕｎｃＥ´Ｆとの統合を実行する。以下、関数ｆｕｎｃＡＢと関数ｆｕｎｃＣとを統合した後の関数を関数ｆｕｎｃＡＢＣと呼ぶ。関数ｆｕｎｃＤＥと関数ｆｕｎｃＥ´Ｆとを統合した後の関数を関数ｆｕｎｃＤＥＥ´Ｆと呼ぶ。パス条件統合部１０９は、呼出関数と被呼出関数との統合を終えると、再度、最大マッチングを求める。ここでは、一例として図１１（ｂ）に示すように、関数ｆｕｎｃＡＢＣと関数ｆｕｎｃＣ、関数ｆｕｎｃＤＥＥ´Ｆをペアとするマッチングで関連の数が最大であるとして最大マッチングが求められている。
【００２９】
パス条件統合部１０９は、最大マッチングを求めた後、最大マッチングとなった呼出関数と被呼出関数のそれぞれのパス条件表を論理積によって並列に統合する。パス条件表の統合処理は、図１２に示すように、呼出関数である関数ｆｕｎｃＡＢＣのパス条件表Ｔ１１のうちＳＡＴとなったものと被呼出関数である関数ｆｕｎｃＤＥＥ´Ｆのパス条件表Ｔ１２のうちＳＡＴとなったものを論理積によって並列に統合することで行われる。この結果、関数ｆｕｎｃＡＢＣのパス条件表Ｔ１１と関数ｆｕｎｃＤＥＥ´Ｆのパス条件表Ｔ１２の統合から、図１２に示すように、統合したパス条件表Ｔ１３が生成される。パス条件統合部１０９は、生成したパス条件表Ｔ１３のうちＳＡＴのものをパス条件表格納部１０７に格納する。
【００３０】
パス条件統合部１０９は、パス条件表の統合処理を終えると、最大マッチングとなった呼出関数と被呼出関数を統合し、統合した１つの関数を利用して、再度、最大マッチングを求め、パス条件表を統合する。具体的には、図１３（ａ）に示すように、パス条件統合部１０９は、最大マッチングに基づいて、関数ｆｕｎｃＡＢＣと関数ｆｕｎｃＤＥＥ´Ｆとの統合を実行する。これにより、関数ｆｕｎｃＡＢＣと関数ｆｕｎｃＤＥＥ´Ｆとを統合した１つの関数ｆｕｎｃＡＢＣＤＥＥ´Ｆが生成される。パス条件統合部１０９は、関数が１つになると最大マッチングを求めるマッチング処理及びパス条件表を統合する統合処理を終了する。
【００３１】
統合処理が終了すると、テストケース生成部１１０は、パス条件表格納部１０７に格納されたパス条件表Ｔ１３のうちＳＡＴになったもの（図１３（ｂ））からソルバ（solver）を用いてテストケースを生成する。ソルバとは、複数の変数の値を変化させながら変数の相互関係を判断し、最適な値を算出する算出手法である。この結果、図１３（ｂ）に示すように、ＳＡＴのパス条件表Ｔ１３に示されるパス条件を満たすシンボル変数の値を含むテストケースが生成される。テストケース生成部１１０は、生成したテストケースをテストケース格納部１１１に格納する。尚、このようなテストケースを用いて図２に示した対象プログラム１０のテストを実行すると、関数ｆｕｎｃＡ，・・・，ｆｕｎｃＦを組み合わせたときに通りえない行を除いた行を網羅することができる。
【００３２】
また、本実施形態ではパス条件表の統合処理を含む一部の処理が並列化されている。仮に、統合処理の全てが並列（パラレル）に行えるとした場合、並列の最大マッチングの計算量はＯ（ｌｏｇ ｎ）で表すことができる。ここで、ｎは関数の数、Ｏはオーダーである。また、反復回数はＯ（ｌｏｇ ｎ）で表すことができるため、統合処理にかかるコスト（計算量）をｓとした場合、本実施形態の計算量はＯ（（ｌｏｇ ｎ）２＋ｓ ｌｏｇ ｎ）で表すことができる。一方、統合処理の全てが直列（シリアル）に行えるとした場合、計算量はｓｎで表すことができる。
【００３３】
ここで、ｓｎ＞ｓ ｌｏｇ ｎは自明であるため、ｓｎ＞（ｌｏｇ ｎ）２であれば計算時間を短縮することができる。ここで、図１４に示すように、ｙ＝（ｌｏｇ ｎ）２／ｎは、ｎ≧１においてｎ＝ｅ２のとき最大値ｙ＝４／ｅ２となる。したがって、コストｓが最大値４／ｅ２よりも大きい場合には、ｎ≧１であればｎに関わらず計算時間を短縮することができる。すなわち、ｓ＞（ｌｏｇ ｎ）２／ｎの条件を満たせば、計算時間を短縮することができる。
【００３４】
次に、図１５及び図１６を用いて、上述した実行状態について説明する。
【００３５】
図１５は、コールスタックについて説明するための図である。図１６は、プログラムの実行木を示す図である。
まず、図１５を用いて、コールスタックについて説明する。図１５に示したプログラムＱは、メインの処理を表すコードＱ１において関数ｆｕｎｃＡを呼び出し、関数ｆｕｎｃＡにおいて関数ａｂｓを呼び出すプログラムである。命令１乃至７におけるいずれかの命令を実行中におけるコールスタックは識別情報「ｓｔａｃｋ３」のようになっている。命令８乃至１５におけるいずれかの命令を実行中におけるコールスタックは識別情報「ｓｔａｃｋ２」のようになっている。命令１６乃至１９におけるいずれかの命令を実行中におけるコールスタックは識別情報「ｓｔａｃｋ１」のようになっている。
【００３６】
図１６に、図１５に示したプログラムＱの実行木を示す。図１６の実行木においては、各実行状態について、プログラムカウンタの値、コールスタックの識別情報（図１５における識別情報に対応している）、メモリの内容、及びパス条件（本実施の形態においては、シンボル変数に関わる分岐を辿った履歴を表す条件）が示されている。例えば、プログラムカウンタの値が１２である場合には、実行状態はｓｔａｔｅ２又はｓｔａｔｅ５である。「＊」は、変数がシンボル変数であることを表す。実行状態格納部１０６には、シンボリック実行中におけるプログラムの実行状態が、図１６における符号６０のような形式で格納される。
【００３７】
次に、図１７を参照して、テストケース生成装置１００の動作について説明する。
【００３８】
図１７は、テストケース生成装置１００の動作の一例を示すフローチャートである。
まず、テストケース生成装置１００における入力部１０１は、ユーザから対象プログラム１０の入力を受け付け、対象プログラム格納部１０２に格納する。対象プログラム１０が格納されると、シンボリック実行部１０５は、対象プログラム１０からコールツリー２０を生成する（ステップＳ１０１）。コールツリー２０は、コールツリー格納部１０８に格納される。コールツリー２０が生成されると、次いで、ドライバ・スタブ生成部１０３は、後述するドライバ・スタブ生成処理を実行する（ステップＳ１０２）。ドライバ・スタブ生成処理は、各関数に対して並列に実行される。これにより、関数毎のドライバ及びスタブが生成される。
【００３９】
ドライバ・スタブ生成処理が完了すると、次いで、シンボリック実行部１０５は、後述するシンボリック実行を行う（ステップＳ１０３）。シンボリック実行は、各関数に対して並列に行われる。シンボリック実行が行われることで、シンボリック実行中における実行状態が実行状態格納部１０６に格納される。また、シンボリック実行が行われることで、シンボリック実行時に得られたパス条件及び返却値（返り値とも呼ばれる）等を含むパス条件表がパス条件表格納部１０７に格納される。
【００４０】
シンボリック実行が完了すると、次いで、パス条件統合部１０９は、複数の関数から呼び出される関数を複製し（ステップＳ１０４）、コールツリーの最大マッチングを求める（ステップＳ１０５）。最大マッチングが求められると、さらに、パス条件統合部１０９は、パス条件表の統合処理を実行する（ステップＳ１０６）パス条件表の統合処理は、最大マッチングとなった２つの関数のそれぞれのパス条件表に対して並列に実行される。パス条件統合部１０９は、パス条件表の統合処理が完了すると、最大マッチングとなった２つの関数を１つに統合し（ステップＳ１０７）、統合した１つの関数が全ての関数を含むか否かを判断する（ステップＳ１０８）。
【００４１】
パス条件統合部１０９は、統合した１つの関数が全ての関数を含まないと判断した場合（ステップＳ１０８：ＮＯ）、ステップＳ１０５〜Ｓ１０７の処理を繰り返す。そして、パス条件統合部１０９は、統合した１つの関数が全ての関数を含むと判断した場合（ステップＳ１０８：ＹＥＳ）、テストケース生成部１１０は、ソルバを利用してテストケースを生成する（ステップＳ１０９）。テストケース生成部１１０は、生成したテストケースをテストケース格納部１１１に格納する。
【００４２】
次に、図１８及び図１９を参照して、上述したドライバ・スタブ生成処理の詳細について説明する。
【００４３】
図１８は、ドライバ・スタブ生成処理の動作の一例を示すフローチャートである。
ドライバ・スタブ生成部１０３は、まず、処理対象となる対象関数を解析し、対象関数から、パラメータ及び対象関数から呼び出される被呼出関数を抽出する（ステップＳ２０１）。例えば、図２に示した関数ｆｕｎｃＡの場合、被呼出関数として関数ｆｕｎｃＢが呼び出される。ドライバ・スタブ生成部１０３は、次いで、ステップＳ２０１において抽出された被呼出関数それぞれについて対応するスタブを生咸し（ステップＳ２０２）、ドライバ・スタブ格納部１０４に格納する。スタブはドライバから呼び出され、呼び出しに応じてシンボルを返すプログラムである。次いで、ドライバ・スタブ生成部１０３は、対象関数のパラメータ及び被呼出関数に対応するシンボル変数を設定するためのプログラムであるドライバを生成し（ステップＳ２０３）、ドライバ・スタブ格納部１０４に格納する。そして処理を終了する。
【００４４】
図１９は、対象関数から生成されるスタブとドライバの一例である。
図１９に示したスタブの６行目において、ドライバに対してシンボルを返すようになっている。また、図１９に示したドライバにおいては、３行目及び４行目においてシンボル変数を設定し、５行目においてスタブを呼び出し、６行目においてｆｕｎｃＡを呼び出している。以上のようなドライバ・スタブ生成処理を実行すれば、関数単体でシンボリック実行を行えるようになる。
【００４５】
次に、図２０乃至図２２を参照して、上述したシンボリック実行の詳細について説明する。
【００４６】
図２０乃至図２２は、シンボリック実行の動作の一例を示すフローチャートである。尚、図２０における「シンボリック実行（ｐ）」とは、実行状態ｐについてシンボリック実行を行うことを表している。
まず、シンボリック実行部１０５は、実行状態格納部１０６に格納されている、実行状態ｐのプログラムカウンタの値に基づき、命令を１つ読み出す（ステップＳ３０１）。例えばプログラムカウンタの値が「２」である場合、対象関数の２行目の命令を読み出す。以下では、ステップＳ３０１において読み出された命令を「処理対象の命令」と呼ぶ。
【００４７】
シンボリック実行部１０５は、処理対象の命令が、関数を呼び出す命令であるか判断する（ステップＳ３０２）。関数を呼び出す命令ではない場合（ステップＳ３０２：ＮＯ）、図２１のステップＳ４０１の処理に移行する。一方、関数を呼び出す命令である場合（ステップＳ３０２：ＹＥＳ）、シンボリック実行部１０５は、被呼出関数の引数に関数ポインタが含まれるか判断する（ステップＳ３０３）。被呼出関数の引数に関数ポインタが含まれていない場合（ステップＳ３０３：ＮＯ）、ステップＳ３０５の処理に移行する。被呼出関数の引数に関数ポインタが含まれている場合（ステップＳ３０３：ＹＥＳ）、シンボリック実行部１０５は、関数ポインタについての条件を、実行中のパスについての条件に追加する（ステップＳ３０４）。
【００４８】
次いで、シンボリック実行部１０５は、被呼出関数の実引数と仮引数との関係を表す条件を、実行中のパスについての条件に追加する（ステップＳ３０５）。尚、被呼出関数が複数回呼び出される場合、ステップＳ３０５においては、引数についての条件が呼び出し毎に追加される。次いで、シンボリック実行部１０５は、被呼出関数をコールツリーに追加するための追加処理を実行する（ステップＳ３０６）。追加処理の詳細については、後述する。
【００４９】
ここで、ステップＳ３０２の処理において、関数を呼び出す命令ではない場合、又は、ステップＳ３０６の処理が完了した場合、図２１に移り、シンボリック実行部１０５は、処理対象の命令がグローバル変数を読み込む命令又は書き込む命令であるか判断する（ステップＳ４０１）。グローバル変数を読み込む命令又は書き込む命令のいずれでもない場合（ステップＳ４０１；ＮＯ）、処理はステップＳ４０４に移行する。一方、グローバル変数を読み込む命令又は書き込む命令である場合（ステップＳ４０１；ＹＥＳ）、ステップＳ４０２の処理に移行する。そして、グローバル変数を読み込む命令である場合、シンボリック実行部１０５は、読み込みに対応する書き込みの命令を、コールツリー格納部１０８に格納されているコールツリー２０によって特定する（ステップＳ４０２）。尚、グローバル変数を書き込む命令である場合には、ステップＳ４０２の処理は行われない。
【００５０】
シンボリック実行部１０５は、ステップＳ４０１においてグローバル変数の読み込みであると判定された場合にはグローバル変数の読み込みについての条件を、ステップＳ４０１においてグローバル変数の書き込みであると判定された場合にはグローバル変数の書き込みについての条件を、実行中のパスについての条件に追加する（ステップＳ４０３）。
【００５１】
ここで、ステップＳ４０１の処理において、グローバル変数を読み込む命令又は書き込む命令のいずれでもない場合、又は、ステップＳ４０３の処理が完了した場合、シンボリック実行部１０５は、処理対象の命令がシンボルに関わる分岐の命令であるか判断する（ステップＳ４０４）。シンボルに関わる分岐の命令とは、例えば、ｉｆ文にシンボル変数が含まれている命令である。
【００５２】
シンボルに関わる分岐の命令である場合（ステップＳ４０４：ＹＥＳ）、シンボリック実行部１０５は、新たにシンボリック実行が行われる実行状態Ｐに実行状態ｐ（すなわち、実行状態格紬部１０６に格納されている現在の実行状態）をコピー（複製）する（ステップＳ４０５）。シンボリック実行部１０５は、処理対象の命令において未処理の分岐先を１つ特定する（ステップＳ４０６）。そして、シンボリック実行部１０５は、分岐の条件（すなわち、パス条件）を、実行中のパスについての条件に追加する（ステップＳ４０７）。シンボリック実行部１０５は、実行状態Ｐについてのシンボリック実行を再帰的に行う（ステップＳ４０８）。
【００５３】
ステップＳ４０８におけるシンボリック実行が完了すると、シンボリック実行部１０５は、処理対象の命令において未処理の分岐先があるか判断する（ステップＳ４０９）。未処理の分岐先が有る場合（ステップＳ４０９：ＹＥＳ）、次の分岐先について処理するため、ステップＳ４０６の処理に戻る。一方、未処理の分岐先が無い場合（ステップＳ４０９：ＮＯ）、呼び出し元の処理に戻る。
【００５４】
ステップＳ４０４の処理において、処理対象の命令がシンボルに関わる分岐ではない場合（ステップＳ４０４：ＮＯ）、新たにシンボリック実行を行わなくてもよい。従って、図２２に示すように、シンボリック実行部１０５は、処理対象の命令を実行し、実行状態格納部１０６に格納されているプログラムカウンタの値を１進める（ステップＳ５０１）。シンボリック実行部１０５は、実行状態ｐが終了の状態であるか判断する（ステップＳ５０２）。終了の状態とは、例えば、プログラムカウンタの値がプログラムにおける最後の行の番号に達している状態である。終了の状態ではない場合（ステップＳ５０２：ＮＯ）、シンボリック実行部１０５は、次の命令について処理するため、図２０に示すステップＳ３０１の処理に戻る。一方、実行状態ｐが終了の状態である場合（ステップＳ５０２：ＹＥＳ）、シンボリック実行部１０５は、シンボリック実行によって得られた、各パスについてのパス条件及び返却値を含むパス条件表をパス条件表格納部１０７に格納する（ステップＳ５０３）。そして呼び出し元の処理に戻る。
【００５５】
以上の処理により、各関数についてシンボリック実行が行われ、満たすべき条件及び関数の返却値がパス条件表格納部１０７に保存されるようになる。尚、各関数についてのシンボリック実行の結果（すなわち、パス条件表）ほ、パス条件表格納部１０７に保存される。
【００５６】
次に、図２３を参照して、上述した追加処理の詳細について説明する。
【００５７】
図２３は、追加処理の動作の一例を示すフローチャートである。
まず、シンボリック実行部１０５は、コールツリー格納部１０８に格納されているコールツリー２０に最も後に追加された関数の位置を現在位置に設定する（Ｓ６０１）。シンボリック実行部１０５は、被呼出関数がコールツリーにおける現在位置より上位の位置に存在するか判断する（ステップＳ６０２）。現在位置より上位の位に存在しない場合（ステップＳ６０２：ＮＯ）、再帰呼び出しには該当しないので、シンボリック実行部１０５は、コールツリーにおける現在位置の下に関数を追加する（ステップＳ６０３）。一方、現在位置より上位の位置に存在する場合（ステップＳ６０２：ＹＥＳ）、再帰呼び出しに該当する。そこで、シンボリック実行部１０５は、被呼出関数についての条件を、実行中のパスについての条件から削除する（ステップＳ６０４）。そして呼び出し元の処理に戻る。尚、コールツリーへの関数追加時に、現在位置の右下に追加するようにすることで、追加順が新しい関数ほど右に出現するようにし、検索しやすいようにすることが望ましい。
【００５８】
次に、図２４を参照して、上述したパス条件表の統合処理の詳細について説明する。
【００５９】
図２４は、パス条件表の統合処理の動作の一例を示すフローチャートである。
まず、パス条件統合部１０９は、パス条件表格納部１０７に、統合すべき２つのパス条件表（ここでは、パス条件表Ａ及びパス条件表Ｂと表記する）が存在するか判断する（ステップＳ７０１）。パス条件表Ａやパス条件表Ｂは、例えば上述したパス条件表Ｔ１やパス条件表Ｔ２に対応する。統合すべき２つのパス条件表Ａ及びＢが存在しない場合（ステップＳ７０１：ＮＯ）、呼び出し元の処理に戻る。
【００６０】
一方、統合すべき２つのパス条件表Ａ及びＢが存在する場合（ステップＳ７０１：ＹＥＳ）、パス条件統合部１０９は、パス条件表Ａから未処理の条件（ここでは、パス条件ａとする）を１つ特定する（ステップＳ７０２）。また、パス条件統合部１０９は、パス条件表Ｂから未処理の条件（ここでは、パス条件ｂとする）を１つ特定する（ステップＳ７０３）。ステップＳ７０２及びＳ７０３において、パス条件統合部１０９は、パス単位で条件を特定する。
【００６１】
パス条件統合部１０９は、パス条件ａとパス条件ｂとの論理積を求めることにより、パス条件ｃを生成し（ステップＳ７０４）、メインメモリ等の記憶装置に格納する。パス条件統合部１０９は、パス条件ｃを満たす解が存在するか、例えばソルバによって判断する（ステップＳ７０５）。パス条件ｃを満たす解が存在しない場合（ステップＳ７０５：ＮＯ）、ステップＳ７０７の処理に移行する。一方、パス条件ｃを満たす解が存在する場合（ステップＳ７０５：ＹＥＳ）、パス条件統合部１０９は、パス条件ｃをパス条件表Ｃに追加する（ステップＳ７０６）。尚、パス条件表Ｃが存在しない場合には、ステップＳ７０６において新たに条件表Ｃが生成される。
【００６２】
パス条件統合部１０９は、パス条件表Ｂに未処理の条件があるか判断する（ステップＳ７０７）。未処理の条件がある場合（ステップＳ７０７：ＹＥＳ）、次の条件について処理するため、ステップＳ７０３の処理に戻る。一方、パス条件表Ｂに未処理の条件がない場合（ステップＳ７０７：ＮＯ）、パス条件統合部１０９は、パス条件表Ｂにおけるパス条件を全て未処理に設定する（ステップＳ７０８）。
【００６３】
次いで、パス条件統合部１０９は、パス条件表Ａに未処理の条件があるか判断する（ステップＳ７０９）。未処理の条件がある場合（ステップＳ７０９：ＹＥＳ）、次の条件について処理するため、ステップＳ７０２の処理に戻る。一方、パス条件表Ａに未処理の条件がない場合（ステップＳ７０９：ＮＯ）、パス条件統合部１０９は、パス条件表Ｃをパス条件表格納部１０７に格納し（ステップＳ７１０）、呼び出し元の処理に戻る。以上のような処理を実行すれば、各関数について生成されたパス条件をまとめることができるようになる。
【００６４】
次に、図２５を参照して、テストケース生成装置１００のハードウェア構成について説明する。
【００６５】
図２５は、テストケース生成装置１００のハードウェア構成の一例である。
図２５に示すように、テストケース生成装置１００は、少なくともCentral Processing Unit（ＣＰＵ）１００Ａ、Random Access Memory（ＲＡＭ）１００Ｂ、Read Only Memory（ＲＯＭ）１００Ｃ及びネットワークＩ／Ｆ（インタフェース）１００Ｄを含んでいる。テストケース生成装置１００は、必要に応じて、Hard Disk Drive（ＨＤＤ）１００Ｅ、入力Ｉ／Ｆ１００Ｆ、出力Ｉ／Ｆ１００Ｇ、入出力Ｉ／Ｆ１００Ｈ、ドライブ装置１００Ｉの少なくとも１つを含んでいてもよい。ＣＰＵ１００Ａ，・・・，ドライブ装置１００Ｉは、内部バス１００Ｊによって互いに接続されている。少なくともＣＰＵ１００ＡとＲＡＭ１００Ｂとが協働することによってコンピュータが実現される。
【００６６】
入力Ｉ／Ｆ１００Ｆには、入力装置２１０が接続される。入力装置２１０としては、例えばキーボードやマウスなどがある。
出力Ｉ／Ｆ１００Ｇには、表示装置２２０が接続される。表示装置２２０としては、例えば液晶ディスプレイがある。
入出力Ｉ／Ｆ１００Ｈには、半導体メモリ２３０が接続される。半導体メモリ２３０としては、例えばUniversal Serial Bus（ＵＳＢ）メモリやフラッシュメモリなどがある。入出力Ｉ／Ｆ１００Ｈは、半導体メモリ２３０に記憶されたプログラムやデータを読み取る。
入力Ｉ／Ｆ１００Ｆ及び入出力Ｉ／Ｆ１００Ｈは、例えばＵＳＢポートを備えている。出力Ｉ／Ｆ１００Ｇは、例えばディスプレイポートを備えている。
【００６７】
ドライブ装置１００Ｉには、可搬型記録媒体２４０が挿入される。可搬型記録媒体２４０としては、例えばCompact Disc（ＣＤ）−ＲＯＭ、Digital Versatile Disc（ＤＶＤ）といったリムーバブルディスクがある。ドライブ装置１００Ｉは、可搬型記録媒体２４０に記録されたプログラムやデータを読み込む。
ネットワークＩ／Ｆ１００Ｄは、例えばポートとPhysical Layer Chip（ＰＨＹチップ）とを備えている。テストケース生成装置１００は、ネットワークＩ／Ｆ１００Ｄを介してネットワークと接続される。
【００６８】
上述したＲＡＭ１００Ｂには、ＲＯＭ１００ＣやＨＤＤ１００Ｅに記憶されたプログラムがＣＰＵ１００Ａによって格納される。ＲＡＭ１００Ｂには、可搬型記録媒体２４０に記録されたプログラムがＣＰＵ１００Ａによって格納される。格納されたプログラムをＣＰＵ１００Ａが実行することにより、上述した各種の動作が実行される。尚、プログラムは上述したフローチャートに応じたものとすればよい。
【００６９】
以上、本発明の好ましい実施形態について詳述したが、本発明に係る特定の実施形態に限定されるものではなく、特許請求の範囲に記載された本発明の要旨の範囲内において、種々の変形・変更が可能である。
【００７０】
なお、以上の説明に関して更に以下の付記を開示する。
（付記１）対象プログラムにおいて実行される複数の関数の各々についてシンボリック実行を行うとともに、シンボル変数に関わる分岐を辿った履歴を表す第１の条件と、当該関数の引数及び返却値についての第２の条件の少なくともいずれかを含むパス条件表を前記複数の関数の各々について生成し、前記複数の関数に含まれるいずれかの関数を呼び出す第１の関数と前記第１の関数に呼び出される第２の関数とのマッチングを求め、求めたマッチングの少なくとも１つより大きなマッチングを求めた前記第１の関数と前記第２の関数との間毎に、関数毎の前記パス条件表を論理積によって並列に統合し、統合後のパス条件表を満たすシンボル変数の値を算出し、算出した当該シンボル変数の値を含むテストケースを生成する処理をコンピュータに実行させるためのテストケース生成プログラム。
（付記２）前記第２の関数が複数の前記第１の関数から呼び出される場合に、前記第２の関数を呼出元毎に複製する処理をさらに含むことを特徴とする付記１に記載のテストケース生成プログラム。
（付記３）前記パス条件表を生成する処理を、前記複数の関数の各々について並列に実行させることを特徴とする付記１又は２に記載のテストケース生成プログラム。
（付記４）前記シンボル変数を設定するためのドライバと当該ドライバにおいて呼び出されるスタブを生成する処理をさらに含み、前記ドライバと前記スタブを生成する処理を、前記複数の関数の各々について並列に実行させることを特徴とする付記１から３のいずれか１項に記載のテストケース生成プログラム。
（付記５）対象プログラムにおいて実行される複数の関数の各々についてシンボリック実行を行うとともに、シンボル変数に関わる分岐を辿った履歴を表す第１の条件と、当該関数の引数及び返却値についての第２の条件の少なくともいずれかを含むパス条件表を前記複数の関数の各々について生成し、前記複数の関数に含まれるいずれかの関数を呼び出す第１の関数と前記第１の関数に呼び出される第２の関数とのマッチングを求め、求めたマッチングの少なくとも１つより大きなマッチングを求めた前記第１の関数と前記第２の関数との間毎に、関数毎の前記パス条件表を論理積によって並列に統合し、統合後のパス条件表を満たすシンボル変数の値を算出し、算出した当該シンボル変数の値を含むテストケースを生成する処理をコンピュータが実行するテストケース生成方法。
（付記６）対象プログラムにおいて実行される複数の関数の各々についてシンボリック実行を行うとともに、シンボル変数に関わる分岐を辿った履歴を表す第１の条件と、当該関数の引数及び返却値についての第２の条件の少なくともいずれかを含むパス条件表を前記複数の関数の各々について生成する第１の生成手段と、前記複数の関数に含まれるいずれかの関数を呼び出す第１の関数と前記第１の関数に呼び出される第２の関数とのマッチングを求め、求めたマッチングの少なくとも１つより大きなマッチングを求めた前記第１の関数と前記第２の関数との間毎に、関数毎の前記パス条件表を論理積によって並列に統合する統合手段と、統合後のパス条件表を満たすシンボル変数の値を算出し、算出した当該シンボル変数の値を含むテストケースを生成する第２の生成手段と、を有するテストケース生成装置。
（付記７）前記統合手段は、前記第２の関数が複数の前記第１の関数から呼び出される場合に、前記第２の関数を呼出元毎に複製することを特徴とする付記６に記載のテストケース生成装置。
（付記８）前記第１の生成手段は、前記複数の関数の各々について前記パス条件表を並列に生成することを特徴とする付記６又は７に記載のテストケース生成装置。
（付記９）前記シンボル変数を設定するためのドライバと当該ドライバにおいて呼び出されるスタブを生成する第３の生成手段をさらに含み、前記第３の生成手段は、前記複数の関数の各々について前記ドライバと前記スタブを並列に生成することを特徴とする付記６から８のいずれか１項に記載のテストケース生成装置。
【符号の説明】
【００７１】
１００  テストケース生成装置
１０３  ドライバ・スタブ生成部（第３の生成手段）
１０５  シンボリック実行部（第１の生成手段）
１０９  パス条件統合部（統合手段）
１１０  テストケース生成部（第２の生成手段）
【図１】
0006331756.tif 000002
【図２】
0006331756.tif 000003
【図３】
0006331756.tif 000004
【図４】
0006331756.tif 000005
【図５】
0006331756.tif 000006
【図６】
0006331756.tif 000007
【図７】
0006331756.tif 000008
【図８】
0006331756.tif 000009
【図９】
0006331756.tif 000010
【図１０】
0006331756.tif 000011
【図１１】
0006331756.tif 000012
【図１２】
0006331756.tif 000013
【図１３】
0006331756.tif 000014
【図１４】
0006331756.tif 000015
【図１５】
0006331756.tif 000016
【図１６】
0006331756.tif 000017
【図１７】
0006331756.tif 000018
【図１８】
0006331756.tif 000019
【図１９】
0006331756.tif 000020
【図２０】
0006331756.tif 000021
【図２１】
0006331756.tif 000022
【図２２】
0006331756.tif 000023
【図２３】
0006331756.tif 000024
【図２４】
0006331756.tif 000025
【図２５】
0006331756.tif 000026
【図２６】
0006331756.tif 000027