(57)【要約】      （修正有）【課題】被検査プログラムの検証品質を向上させることができる、より少数のテストケースに対応したパスを、被検査プログラムから抽出する。【解決手段】テストケース生成装置１０は、抽出部１２、集約部１４、取得部１６、生成部２０を備える。抽出部は、被検査プログラム２２から抽出した分岐網羅を実現するパス毎にパス条件を抽出し、パス条件に含まれる条件式（個別条件式）を抽出する。集約部は、個別条件式を集約する（原子論理式）。取得部は、原子論理式の真偽値の組み合わせから、抽出部が抽出した何れのパス条件も表していない真偽値の組み合わせで、且つ、原子論理式の各々が取る真偽値の組み合わせとして矛盾しない真偽値の組み合わせを取得し、抽出部が抽出したパス条件に、取得した原子論理式の真偽値の組み合わせに対応した新たなパス条件を追加した拡張パス条件を取得する。生成部は、拡張パス条件の各々に対応したテストケース２４を生成する。【選択図】図４
2015187756.tif 000002
【特許請求の範囲】
【請求項１】
コンピュータに、
被検査プログラムに含まれる複数の条件分岐の各々に対応した条件式により前記被検査プログラムの経路が表されたパス条件から抽出された複数の前記条件式を、予め定めた規則に基づいて複数の集約条件式に集約し、
前記集約条件式の真偽値の組み合わせから、前記パス条件を表す真偽値の組み合わせと異なる真偽値の組み合わせで、且つ、前記集約条件式の真偽値の組み合わせとして矛盾のない真偽値の組み合わせを選択して新たなパス条件を取得し、
前記新たなパス条件及び前記被検査プログラムから抽出された前記パス条件に基づいて、前記被検査プログラムの動作を検証するテストケースを生成する
ことを含む処理を実行させるためのテストケース生成プログラム。
【請求項２】
前記新たなパス条件を取得する際、前記新たなパス条件に対応する前記集約条件式の真偽値の組み合わせのうち何れかの真偽値が定まっていない場合で、且つ、前記集約条件式の真偽値の組み合わせから取得できる真偽値の組み合わせが存在しない場合は、前記集約条件式の各々が取る真偽値の組み合わせとして矛盾がない真偽値を、真偽値が定まっていない前記集約条件式の真偽値として設定し、前記新たなパス条件を取得する
請求項１記載のテストケース生成プログラム。
【請求項３】
前記予め定めた規則は、前記被検査プログラムから抽出された前記パス条件の前記条件式に予め定めた演算子が含まれる場合、前記予め定めた演算子を論理的に逆の関係にある演算子に変更し、重複する前記条件式をまとめて前記集約条件式として集約する規則である
請求項１又は請求項２記載のテストケース生成プログラム。
【請求項４】
前記集約条件式の真偽値の組み合わせは、前記集約条件式から選択した２つの前記集約条件式の真偽値の組み合わせである
請求項１〜請求項３の何れか１項に記載のテストケース生成プログラム。
【請求項５】
被検査プログラムに含まれる複数の条件分岐の各々に対応した条件式により前記被検査プログラムの経路が表されたパス条件から抽出された複数の前記条件式を、予め定めた規則に基づいて複数の集約条件式に集約する集約部と、
前記集約部により集約された前記集約条件式の真偽値の組み合わせから、前記パス条件と異なる真偽値の組み合わせで、且つ、前記集約条件式の各々が取る真偽値として矛盾のない真偽値の組み合わせを選択して新たなパス条件を取得する取得部と、
前記取得部により取得された前記新たなパス条件及び前記被検査プログラムから抽出された前記パス条件に基づいて、前記被検査プログラムの動作を検証するテストケースを生成する生成部と、
を含むテストケース生成装置。
【請求項６】
被検査プログラムに含まれる複数の条件分岐の各々に対応した条件式により前記被検査プログラムの経路が表されたパス条件から抽出された複数の前記条件式を、予め定めた規則に基づいて複数の集約条件式に集約し、
前記集約条件式の真偽値の組み合わせから、前記パス条件を表す真偽値の組み合わせと異なる真偽値の組み合わせで、且つ、前記集約条件式の真偽値の組み合わせとして矛盾のない真偽値の組み合わせを選択して新たなパス条件を取得し、
前記新たなパス条件及び前記被検査プログラムから抽出された前記パス条件に基づいて、前記被検査プログラムの動作を検証するテストケースを生成する
ことを含むテストケース生成方法。
【発明の詳細な説明】
【技術分野】
【０００１】
開示の技術は、テストケース生成プログラム、装置、及び方法に関する。
【背景技術】
【０００２】
ソフトウエア開発において、開発対象であるプログラム（被検査プログラム）から、被検査プログラムの開始から終了までに至る経路（パス）を抽出し、被検査プログラムの動作を検証する手法が知られている。
【０００３】
パスの抽出法として、例えば、被検査プログラムに含まれるパスを網羅的に抽出する方法（パス網羅）が存在する。また、その他のパス抽出法として、All-Pair法によりパスを抽出する方法、及び、被検査プログラムの仕様を記述したＵＭＬ等のモデリング言語に含まれる制御条件を組み合わせることによりパスを抽出する方法が存在する。
【０００４】
そして、ソフトウエア開発担当者は、このようにして抽出されたパスからテストケースを生成した後、テストケースに基づいて被検査プログラムを実行し、被検査プログラムが目的とする動作を行うか否かを判定することで、被検査プログラムの品質を検証する。ここでテストケースとは、抽出したパスが実行されるように生成された、被検査プログラムに含まれる変数の具体的な値の組み合わせをいう。
【先行技術文献】
【特許文献】
【０００５】
【特許文献１】特開２０１０−１０２６２４号公報
【特許文献２】特開２０００−１６３１１６号公報
【特許文献３】特開２０１２−２４８１０１号公報
【特許文献４】特開２００７−２４９８２６号公報
【発明の概要】
【発明が解決しようとする課題】
【０００６】
しかしながら、パス網羅によるパス抽出では、被検査プログラムに含まれる条件分岐の数が多くなるに従って抽出すべきパスの数が増大し、パス抽出に要する処理時間及びメモリ容量等の関係から、現実的にはパス抽出が困難となる状況が発生する場合がある。
【０００７】
そこで、実際にはパス抽出の方法を分岐網羅とすることで、被検査プログラムから抽出されるパス数を、パス網羅によって被検査プログラムから抽出されるパス数より減少させる方法が採られる場合がある。
【０００８】
ここで分岐網羅とは、被検査プログラムに含まれる全ての条件分岐の分岐先を１回以上実行するパスを抽出するパスの抽出法であり、例えばＤＡＲＴ法（Directed Auto-mated Random Testing）等の公知の分岐網羅指向のパス抽出法が知られている。
【０００９】
しかしながら、分岐網羅指向のパス抽出法では、全てのパスに基づいてテストケースを生成しているわけではないため、被検査プログラムに未検証のパスが残る場合がある。従って、被検査プログラムの品質検査に、分岐網羅指向のパス抽出法によって生成されたテストケースを用いる場合、パス網羅によって生成されたテストケースを用いる場合と比較して、被検査プログラムの品質検査の質が低下する場合が考えられる。
【００１０】
１つの側面では、本発明は、被検査プログラムの検証品質を向上させることができる、より少数のテストケースに対応したパスを、被検査プログラムから抽出することを目的とする。
【課題を解決するための手段】
【００１１】
１つの態様では、被検査プログラムに含まれる複数の条件分岐の各々に対応した条件式により被検査プログラムの経路が表されたパス条件から抽出された複数の条件式を予め定めた規則に基づいて複数の集約条件式に集約する。そして、開示の技術は、集約条件式の真偽値の組み合わせから、パス条件を表す真偽値の組み合わせと異なる真偽値の組み合わせで、且つ、集約条件式の真偽値の組み合わせとして矛盾のない真偽値の組み合わせを選択して新たなパス条件を取得する。そして、新たなパス条件及び被検査プログラムから抽出されたパス条件に基づいて、被検査プログラムの動作を検証するテストケースを生成する。
【発明の効果】
【００１２】
一つの側面として、被検査プログラムの検証品質を向上させることができる、より少数のテストケースに対応したパスを、被検査プログラムから抽出することができる、という効果を有する。
【図面の簡単な説明】
【００１３】
【図１】図１は、パス網羅の説明に係る被検査プログラムの一例を示した図である。
【図２】図２は、被検査プログラムの一例を示した図である。
【図３】図３は、図２に示した被検査プログラムで例外を発生させるテストケースの一例を示した図である。
【図４】図４は、テストケース生成装置の機能ブロック図である。
【図５】図５は、パス条件から原子論理式を集約する過程について説明するための図である。
【図６】図６は、集約テーブルの一例を示した図である。
【図７】図７は、空の組み合わせ表及び空の管理表の一例を示した図である。
【図８】図８は、図２に示した被検査プログラムのパス条件Ｎｏ．１に従って設定された組み合わせ表及び管理表の一例を示した図である。
【図９】図９は、図２に示した被検査プログラムのパス条件Ｎｏ．２に従って設定された組み合わせ表及び管理表の一例を示した図である。
【図１０】図１０は、図２に示した被検査プログラムのパス条件Ｎｏ．３に従って設定された組み合わせ表及び管理表の一例を示した図である。
【図１１】図１１は、図２に示した被検査プログラムのパス条件Ｎｏ．４に従って設定された組み合わせ表及び管理表の一例を示した図である。
【図１２】図１２は、図２に示した被検査プログラムのパス条件Ｎｏ．５に従って設定された組み合わせ表及び管理表の一例を示した図である。
【図１３】図１３は、図２に示した被検査プログラムの組み合わせ表Ｎｏ．３にTRUEを設定した際の組み合わせ表及び管理表の一例を示した図である。
【図１４】図１４は、パス条件の充足可能性について説明するための図である。
【図１５】図１５は、図２に示した被検査プログラムの組み合わせ表Ｎｏ．３にFALSEを設定した際の組み合わせ表及び管理表の一例を示した図である。
【図１６】図１６は、図２に示した被検査プログラムの組み合わせ表Ｎｏ．４にTRUEを設定した際の組み合わせ表及び管理表の一例を示した図である。
【図１７】図１７は、図２に示した被検査プログラムの組み合わせ表Ｎｏ．４にFALSEを設定した際の組み合わせ表及び管理表の一例を示した図である。
【図１８】図１８は、図２に示した被検査プログラムの組み合わせ表Ｎｏ．５にTRUEを設定した際の組み合わせ表及び管理表の一例を示した図である。
【図１９】図１９は、組み合わせ表の各領域に真偽値が設定された際の組み合わせ表及び管理表の一例を示した図である。
【図２０】図２０は、管理表の領域を選択した際の組み合わせ表及び管理表の一例を示した図である。
【図２１】図２１は、図２０とは異なる管理表の領域を選択した際の組み合わせ表及び管理表の一例を示した図である。
【図２２】図２２は、図２０及び図２１とは異なる管理表の領域を選択した際の組み合わせ表及び管理表の一例を示した図である。
【図２３】図２３は、図２０〜図２２とは異なる管理表の領域を選択した際の組み合わせ表及び管理表の一例を示した図である。
【図２４】図２４は、組み合わせ表の追加行への真偽値の設定方法を説明するための図である。
【図２５】図２５は、組み合わせ表の追加行への真偽値の設定方法を説明するための図である。
【図２６】図２６は、生成した拡張パス条件の一例を示した図である。
【図２７】図２７は、生成したテストケースの一例を示した図である。
【図２８】図２８は、テストケース生成装置として機能するコンピュータのブロック図である。
【図２９】図２９は、テストケース生成処理の流れを示す全体フローチャートである。
【図３０】図３０は、パス条件集約処理の流れを示すフローチャートである。
【図３１】図３１は、テーブル作成処理の流れを示すフローチャートである。
【図３２】図３２は、組み合わせ表設定処理の流れを示すフローチャートである。
【図３３】図３３は、管理表設定処理の流れを示すフローチャートである。
【図３４】図３４は、拡張パス条件生成処理の流れを示すフローチャートである。
【図３５】図３５は、組み合わせ表補充処理の流れを示すフローチャートである。
【図３６】図３６は、組み合わせ表追加処理の流れを示すフローチャートである。
【図３７】図３７は、充足判定処理の流れを示すフローチャートである。
【発明を実施するための形態】
【００１４】
以下、図面を参照して、開示の技術の実施形態の一例を詳細に説明する。
【００１５】
ソフトウエア開発において、シンボリック実行（symbolic execution）技術を利用して、被検査プログラムの動作を検証する手法がある。
【００１６】
シンボリック実行技術とは、被検査プログラムに含まれる変数に具体的な数値を代入する替わりに、数値を代表するシンボル値を代入することで被検査プログラムを疑似的に実行し、被検査プログラムからパスを抽出する技術である。
【００１７】
シンボリック実行の際に用いられるパスの抽出法の一例として、例えばパス網羅が挙げられる。
【００１８】
しかしながら、図１に示した被検査プログラムは、ＩＦ文等の条件分岐を１０個しか含んでいないが、パス網羅によるパス抽出を実行した場合、被検査プログラムから２の１０乗通り、即ち１０２４通りものパスが抽出されることになる。
【００１９】
従って、パスの抽出法としてパス網羅を用いる場合、条件分岐の数が多くなるに従って、パス抽出に要する処理時間が累乗のオーダーで増大するため、パス抽出に要する時間として許容できる時間を超過する場合がある。更に、この場合、条件分岐の数が多くなるに従ってパス抽出に要する計算量が増大するため、パス抽出に要するメモリ量がコンピュータに実装されているメモリ量を超過して、パス抽出が中断する場合も考えられる。
【００２０】
ここで、パス抽出に要する時間として許容できる時間を超過するとは、例えば、被検査プログラムに含まれるパスを抽出し終えるまでに要する時間が、予定された被検査プログラムの動作検証工程期間内に収まらない場合等をいう。なお、条件分岐はＩＦ文に限られず、条件分岐に含まれる分岐の条件を評価した値に応じて、被検査プログラムの実行先を決定するものであればよい。
【００２１】
そこで、被検査プログラムから抽出されるパス数を抑制するため、ＤＡＲＴ法に代表される分岐網羅指向のパス抽出法が用いられる場合がある。
【００２２】
ＤＡＲＴ法は、変数に具体的な値をランダムに設定した上で被検査プログラムを実行して実行したパス上のパス条件を収集し、収集したパス条件から既に通過したパスと異なるパスを通過する値を生成して、被検査プログラムから順次パスを抽出する方法である。
【００２３】
ここで、パス条件とは、パスが終了するまでに経由する条件分岐の各条件式に含まれる変数をシンボル値で置き換えた上で、各条件式を積（ＡＮＤ条件：以下、記号‘＆’で表示する）で連結した条件である。
【００２４】
図２は、ＤＡＲＴ法によって被検査プログラムから抽出したパスに基づいてテストケースを生成する際の一例を示した図である。なお、図２に示すパス条件では、変数ａはシンボル値SymA、変数ｂはシンボル値SymB、変数ｃはシンボル値SymCにそれぞれ置き換えられている。
【００２５】
図２に示す被検査プログラムの場合、ＤＡＲＴ法を用いることで５つのパスに対応したパス条件が抽出されると共に、パス条件の各々に対応したテストケースが生成される。
【００２６】
しかし、図２に示す被検査プログラムの各変数ａ、ｂ、及びｃに対して、図２には存在しない図３に示すテストケースが代入された場合、演算子equalsがnullに対して定義されていないものとすれば、a.equals(c)を実行した際に例外が発生する。
【００２７】
このように、分岐網羅指向のパス抽出法では、分岐網羅を達成するパスを抽出した際にパスの抽出を終了する場合があることから、不具合を発生させるテストケースに対応するパスが抽出されず、被検査プログラムに含まれる不具合を発見できない場合がある。
【００２８】
一方、以下の開示の技術は、従来の分岐網羅指向のパス抽出法と比較して、被検査プログラムの検証品質を向上させることができるテストケースに対応したパスを被検査プログラムから抽出する。また、この際に抽出されるパスの数は、パス網羅によるパス抽出の場合と比較して、より少数に抑えられる。
【００２９】
図４には、本実施形態に係るテストケース生成装置１０が示されている。テストケース生成装置１０は、抽出部１２、集約部１４、取得部１６、及び生成部２０を含む。
【００３０】
テストケース生成装置１０は、シンボリック実行技術により被検査プログラム２２を実行し、被検査プログラム２２の動作を検証するためのテストケース２４を生成するための装置である。
【００３１】
抽出部１２は、被検査プログラム２２を受け付け、被検査プログラム２２をテストケース生成装置１０内部に取り込む。そして、抽出部１２は、例えばＤＡＲＴ法等の分岐網羅指向のパス抽出法を用いて被検査プログラム２２から分岐網羅を実現するパスを抽出する。更に、抽出部１２は、抽出したパス毎にパス条件を抽出し、パス条件に含まれる条件式（個別条件式）を抽出する。
【００３２】
集約部１４は、予め定めた集約規則が規定された集約テーブルを参照して、抽出部１２で抽出した個別条件式を集約する。なお、集約部１４によって集約された個別条件式を原子論理式という。原子論理式は、開示の技術の集約条件式の一例である。
【００３３】
取得部１６は、集約部１４が集約した原子論理式の真偽値の組み合わせから、抽出部１２が抽出した何れのパス条件も表していない真偽値の組み合わせで、且つ、原子論理式の各々が取る真偽値の組み合わせとして矛盾しない真偽値の組み合わせを取得する。
【００３４】
そして、取得部１６は、集約部１４が集約した原子論理式の真偽値の組み合わせから、原子論理式の真偽値の組み合わせを取得できない場合には、原子論理式の各々が取る真偽値の組み合わせとして矛盾しない真偽値を設定する。
【００３５】
更に、取得部１６は、抽出部１２が抽出したパス条件に、取得した原子論理式の真偽値の組み合わせに対応した新たなパス条件を追加した拡張パス条件を取得する。
【００３６】
生成部２０は、取得部１６が取得した拡張パス条件の各々に対応したテストケース２４を生成する。
【００３７】
以下、各部での処理内容を詳細に説明する。なお、以下の説明では、被検査プログラム２２の一例として、図２に示した被検査プログラムを用いるものとする。なお、被検査プログラム２２が図２に示した被検査プログラムに限定されないことは言うまでもない。
【００３８】
図５は、図２に示した被検査プログラム２２からＤＡＲＴ法によって抽出したパスに対応するパス条件を、原子論理式に集約する過程を示した図である。
【００３９】
まず、抽出部１２は、各パス条件から‘＆’で結合された個々の条件式を分割し、個別条件式として列挙する。この際、抽出部１２は、重複する個別条件式は同じ個別条件式としてまとめる。
【００４０】
次に、集約部１４は、図６に示した集約テーブルを参照して、個別条件式を集約する。なお、ここで「集約」とは、条件式から条件式を形成する最小単位の条件式を抽出することである。
【００４１】
集約テーブルは、個別条件式を集約するための規則が記載されたテーブルである。例えば、開示の技術に係る集約テーブルは、条件式１の欄及び条件式２の欄を含み、条件式１の欄に記載される演算子と、条件式２の欄に記載される演算子と、が論理的に互いに逆の関係を有するように記載されたテーブルである。
【００４２】
ここで、論理的に逆の関係にある演算子とは、互いに否定関係にある演算子をいう。例えば、右辺と左辺が等しい場合に真（TRUE）を示す演算子‘＝’と、右辺と左辺が等しくない場合にTRUEを示す演算子‘！＝’は、論理的に逆の関係を有する演算子である。
【００４３】
同様に、右辺の値が左辺の値より大きい場合にTRUEを示す演算子‘＜’と、右辺の値が左辺の値以下の場合にTRUEを示す演算子‘＞＝’も、論理的に逆の関係を有する演算子である。また、左辺の値が右辺の値より大きい場合にTRUEを示す演算子‘＞’と、左辺の値が右辺の値以下の場合にTRUEを示す演算子‘＜＝’も、論理的に逆の関係を有する演算子である。更に、右辺と左辺が等しい場合にTRUEを示す演算子‘equals’と、右辺と左辺が等しくない場合にTRUEを示す演算子‘notEquals’のような真偽値を出力する関数又はメソッドも、論理的に逆の関係を有する演算子に含まれる。
【００４４】
今、条件式１の欄に記載される演算子を含む個別条件式（個別条件式１とする）と、当該演算子と論理的に逆の関係を有する演算子を含む個別条件式（個別条件式２とする）と、が演算子以外同じ内容である場合を考える。この場合、個別条件式１がTRUEであることと、個別条件式２がFALSEであることは同等である。従って、個別条件式１と個別条件式２とは、論理的に逆の関係を有する何れか一方の演算子を用いて集約することができる。
【００４５】
集約部１４は、一例として、条件式１の欄に記載された演算子を含む個別条件式の演算子を、対応する条件式２の欄に記載された演算子に変更する。この演算子の変更により重複する個別条件式が発生した場合、集約部１４は、重複する個別条件式を１つに集約する。このようにして集約部１４は、例えば図５に示すように、パス条件の各々をＮｏ．（Number：番号）１〜４の４つの原子論理式に集約する。
【００４６】
なお、本実施形態では、集約テーブルの条件式１に記載された演算子を含む個別条件式の演算子を条件式２の欄に記載された演算子に変更したが、演算子の変更方法はこれに限られない。例えば、集約テーブルの条件式２に記載された演算子を含む個別条件式の演算子を条件式１の欄に記載された演算子に変更して、重複する個別条件式を１つに集約するようにしてもよい。また、図６に示した集約テーブルが一例であることは言うまでもない。
【００４７】
次に、取得部１６は、図７に示すような、各行各列によって表される領域になにも設定されていない空の組み合わせ表及び空の管理表を作成する。
【００４８】
組み合わせ表の各列には、集約部１４で集約した各々の原子論理式が配置される。一方、管理表は、各行各列に原子論理式が配置された２次元の表として作成される。この際、管理表の各行各列に配置された原子論理式の各々は、更に、原子論理式の真偽値を示す真偽値の項目に分割される。そして、管理表の各行各列で示される各領域のうち、同じ原子論理式の組み合わせに対応した領域、及び原子論理式の組み合わせとして重複する一方の領域には、当該領域を選択することができないことを示す記号、例えば‘−’が設定される。
【００４９】
例えば、管理表において、行方向の原子論理式及び列方向の原子論理式が、共に（SymA!=null）の場合に対応する領域には、記号‘−’が設定される。同様に、行方向の原子論理式及び列方向の原子論理式が、共に（SymB!=null）、（SymC!=null）、及び（SymA equals SymC）の場合に対応する領域にも、記号‘−’が設定される。
【００５０】
また、原子論理式の組み合わせとして、例えば（SymA!=null）と（SymB!=null）とを選択した場合、この原子論理式の組み合わせに対応した管理表の領域は、領域Ｒ１と領域Ｒ２となる。従って、領域Ｒ１と領域Ｒ２のうち、何れか一方の領域、例えば領域Ｒ２を選択することができないようにすることで、原子論理式の組み合わせと、当該原子論理式の組み合わせに対応した領域と、が一意に関連付けられるようになる。なお、以降、空の管理表と称す場合、このように原子論理式の組み合わせと、当該原子論理式の組み合わせに対応した領域と、が一意に関連付けられるように予め選択できる領域を制限した管理表を指すものとする。
【００５１】
次に、取得部１６は、抽出部１２で抽出したパス条件毎に、各々のパス条件を表すように、組み合わせ表の原子論理式の真偽値を設定する。そして、取得部１６は、管理表の領域のうち、組み合わせ表に記載されたパス条件を表す原子論理式の真偽値から選択した、２つの原子論理式の真偽値の組み合わせに対応した領域を選択済みに設定する。
【００５２】
図８は、図２における被検査プログラム２２から抽出されたパス条件Ｎｏ．１に基づいて設定された、組み合わせ表及び管理表を示した図である。
【００５３】
パス条件Ｎｏ．１には、個別条件式として（SymA!=null）、（SymB!=null）、（SymC!=null）、及び（SymA equals SymC）が含まれる。従って、組み合わせ表において、（SymA!=null）をTRUE、（SymB!=null）をTRUE、（SymC!=null）をTRUE、（SymA equals SymC）をTRUEに設定すれば、組み合わせ表Ｎｏ．１でパス条件Ｎｏ．１を表すことができる。
【００５４】
そして、取得部１６は、組み合わせ表Ｎｏ．１から、２つの原子論理式の真偽値の全ての組み合わせに対応した管理表の領域に、例えば記号‘○’を設定して、選択済みに設定する。なお、組み合わせ表Ｎｏ．Ｘ（Ｘは整数）における２つの原子論理式の真偽値の全ての組み合わせを、単に、組み合わせ表Ｎｏ．Ｘの組み合わせと称すものとする。
【００５５】
例えば、パス条件Ｎｏ．１から（SymA!=null）：TRUE、（SymB!=null）：TRUEの組み合わせを選択した場合、SymA!=nullがTRUEの行と、SymB!=nullがTRUEの列とが交差する領域に‘○’を設定する。以下、説明を簡略化するため、管理表の各行に１，・・・，ｎ（ｎは整数）、各列にＡ，・・・，Ψ（Ψはアルファベット）の記号を付し、例えば、SymA!=nullがTRUEの行と、SymB!=nullがTRUEの列とが交差する領域を１Ｃ領域と示すものとする。
【００５６】
以上の処理により、管理表の１Ｃ領域、１Ｅ領域、１Ｇ領域、３Ｅ領域、３Ｇ領域、及び５Ｇ領域が選択済みに設定される。
【００５７】
次に、取得部１６は、組み合わせ表及び管理表のパス条件Ｎｏ．２に対応した領域を設定する。
【００５８】
図９は、パス条件Ｎｏ．２の内容を反映した組み合わせ表及び管理表を示した図である。
【００５９】
この場合、パス条件Ｎｏ．２を表すように、組み合わせ表Ｎｏ．２の（SymA!=null）がTRUE、（SymB!=null）がTRUE、（SymC!=null）がTRUE、（SymA equals SymC）がFALSEに設定される。そして、管理表において、組み合わせ表Ｎｏ．２の組み合わせに対応した領域のうち、未選択領域である１Ｈ領域、３Ｈ領域、及び５Ｈ領域が選択される。
【００６０】
次に、取得部１６は、組み合わせ表及び管理表のパス条件Ｎｏ．３に対応した領域を設定する。
【００６１】
図１０は、パス条件Ｎｏ．３の内容を反映した、組み合わせ表及び管理表を示した図である。
【００６２】
この場合、パス条件Ｎｏ．３を表すように、組み合わせ表Ｎｏ．３の（SymA!=null）がTRUE、（SymB!=null）がTRUE、（SymC!=null）がFALSEに設定される。なお、パス条件Ｎｏ．３には、組み合わせ表の（SymA equals SymC）の真偽値を設定する原子論理式が含まれないため、組み合わせ表Ｎｏ．３の（SymA equals SymC）の真偽値を未設定とする。換言すれば、パス条件Ｎｏ．３は、原子論理式（SymA equals SymC）の真偽値とは無関係に決定されたパス条件と言うことができる。
【００６３】
そして、管理表において、組み合わせ表Ｎｏ．３の組み合わせに対応した領域のうち、未選択領域である１Ｆ領域及び３Ｆ領域が選択される。
【００６４】
次に、取得部１６は、組み合わせ表及び管理表のパス条件Ｎｏ．４に対応した領域を設定する。
【００６５】
図１１は、パス条件Ｎｏ．４の内容を反映した、組み合わせ表及び管理表を示した図である。
【００６６】
この場合、パス条件Ｎｏ．４を表すように、組み合わせ表Ｎｏ．４の（SymA!=null）がTRUE、（SymB!=null）がFALSE、（SymC!=null）がFALSEに設定される。なお、パス条件Ｎｏ．４にも、組み合わせ表の（SymA equals SymC）の真偽値を設定する原子論理式が含まれないため、組み合わせ表Ｎｏ．４の（SymA equals SymC）の真偽値を未設定とする。
【００６７】
そして、管理表において、組み合わせ表Ｎｏ．４の組み合わせに対応した領域のうち、未選択領域である１Ｄ領域及び４Ｆ領域が選択される。
【００６８】
次に、取得部１６は、組み合わせ表及び管理表のパス条件Ｎｏ．５に対応した領域を設定する。
【００６９】
図１２は、パス条件Ｎｏ．５の内容を反映した、組み合わせ表及び管理表を示した図である。
【００７０】
この場合、パス条件Ｎｏ．５を表すように、組み合わせ表Ｎｏ．５の（SymA!=null）、（SymB!=null）、及び（SymC!=null）がFALSEに設定される。なお、パス条件Ｎｏ．５にも、組み合わせ表の（SymA equals SymC）の真偽値を設定する原子論理式が含まれないため、組み合わせ表Ｎｏ．５の（SymA equals SymC）の真偽値を未設定とする。
【００７１】
そして、管理表において、組み合わせ表Ｎｏ．５の組み合わせに対応した領域のうち、未選択領域である２Ｄ領域及び２Ｆ領域が選択される。
【００７２】
以上の処理により、取得部１６は、ＤＡＲＴ法によって抽出されたパスに対応するパス条件を、組み合わせ表及び管理表に反映する。
【００７３】
次に、取得部１６は、組み合わせ表における各組み合わせ表Ｎｏ．の原子論理式のうち、真偽値が未設定となっている原子論理式の真偽値を設定する。
【００７４】
以下に、組み合わせ表において、真偽値が未設定となっている原子論理式の真偽値の設定方法を詳細に説明する。
【００７５】
まず、取得部１６は、組み合わせ表のうち、真偽値が未設定となっている原子論理式の真偽値に、TRUE及びFALSEの何れか一方の真偽値を仮設定する。
【００７６】
そして、取得部１６は、原子論理式の真偽値を仮設定した組み合わせ表Ｎｏ．Ｘにおいて、仮に設定した原子論理式の真偽値を含む、２つの原子論理式の真偽値の全ての組み合わせを取得する。そして、取得部１６は、当該原子論理式の組み合わせに対応した管理表の領域のうち、未選択領域を仮選択する。更に、取得部１６は、仮設定した原子論理式の真偽値を含む組み合わせ表Ｎｏ．Ｘにおいて、各原子論理式が取る真偽値に論理的な矛盾がないか否か判定する。
【００７７】
ここで論理的に矛盾がないとは、成立可能な論理であることをいう。例えば論理式Ａは（人間Ｈは男である）と規定され、論理式Ｂは（人間Ｈは女である）と規定されている場合に、論理式Ａ＆論理式Ｂという論理は成立しない。従って、この場合は論理的に矛盾があると言える。一方、論理式Ｃが（人間Ｈは学生である）と規定されている場合、論理式Ａ＆論理式Ｃという論理は成立する。従って、この場合は論理的に矛盾がないと言える。
【００７８】
各原子論理式が取る真偽値に論理的な矛盾がない場合、取得部１６は、組み合わせ表の仮に設定した真偽値をそのまま確定させると共に、管理表の仮選択した領域を選択済みとする。一方、各原子論理式が取る真偽値に論理的な矛盾がある場合、取得部１６は、組み合わせ表の仮に設定した真偽値を未設定状態に戻すと共に、管理表の仮選択した領域を未選択状態に戻す。
【００７９】
そして、取得部１６は、組み合わせ表の未設定状態に戻した領域に、先ほど仮設定した真偽値とは逆の真偽値を仮設定し、上記に説明した処理を再び実施することで、組み合わせ表で未設定となっている原子論理式の真偽値を設定する。
【００８０】
なお、組み合わせ表Ｎｏ．Ｘにおいて、各原子論理式が取る真偽値に論理的な矛盾がないか否かの判定には、例えばＳＡＴ（satisfiability）、又はＳＭＴ（satisfiability modulo theory）ソルバ等の公知の制約ソルバが利用される。
【００８１】
図１３は、真偽値が未設定となっている組み合わせ表Ｎｏ．３の（SymA equals SymC）に、仮にTRUEを設定した場合の組み合わせ表及び管理表を示した図である。なお、図１３の組み合わせ表では仮設定した真偽値を“（  ）”で表している。また、以降の図の組み合わせ表においても、同様の意味で同様の表記を用いる。
【００８２】
この場合、組み合わせ表Ｎｏ．３から、｛（SymA!=null）,（SymA equals SymC）｝＝（TRUE,TRUE）、｛（SymB!=null）,（SymA equals SymC）｝＝（TRUE,TRUE）、｛（SymC!=null）,（SymA equals SymC）｝＝（FALSE,TRUE）の組み合わせが取得される。これらの組み合わせは、管理表の１Ｇ領域、３Ｇ領域、及び６Ｇ領域に対応するが、このうち未選択領域は６Ｇ領域のみであるため、６Ｇ領域を仮選択する。
【００８３】
なお、図１３の管理表では、取得した原子論理式の組み合わせに対応する領域を点線枠で表し、真偽値が未設定となっている原子論理式の真偽値の設定処理で仮選択の場合を含めて選択された領域を、記号“◎”で表している。また、｛原子論理式Ａ、原子論理式Ｂ｝＝（値Ａ、値Ｂ）の表記は、原子論理式Ａ＝値Ａ、且つ、原子論理式Ｂ＝値Ｂであることを示している。
【００８４】
そして、取得部１６は図１４に示すように、組み合わせ表Ｎｏ．３に含まれる原子論理式の真偽値に基づいたパス条件を生成する。この場合、（SymC!=null）のみがFALSEであることから、”（SymA!=null）&（SymB!=null）&（SymC=null）&（SymA equals SymC）”というパス条件が生成される。
【００８５】
しかし、（SymA!=null）で、且つ、（SymC=null）の場合に、（SymA equals SymC）がTRUEになることはないため、このパス条件には論理的な矛盾があることになる。なお、パス条件に論理的な矛盾がないことを充足可能、パス条件に論理的な矛盾があることを充足不可能という場合がある。
【００８６】
従って、取得部１６は、管理表の６Ｇ領域を未選択状態に戻し、組み合わせ表Ｎｏ．３の（SymA equals SymC）に、今度は仮にFALSEを設定する。
【００８７】
図１５は、組み合わせ表Ｎｏ．３の（SymA equals SymC）に、仮にFALSEを設定した場合の組み合わせ表及び管理表を示した図である。
【００８８】
この場合、組み合わせ表Ｎｏ．３から、｛（SymA!=null）,（SymA equals SymC）｝＝（TRUE,FALSE）、｛（SymB!=null）,（SymA equals SymC）｝＝（TRUE,FALSE）、｛（SymC!=null）,（SymA equals SymC）｝＝（FALSE,FALSE）の組み合わせが取得される。これらの組み合わせは、管理表の１Ｈ領域、３Ｈ領域、及び６Ｈ領域に対応するが、このうち未選択領域は６Ｈ領域のみであるため、６Ｈ領域を仮選択する。
【００８９】
そして、取得部１６は組み合わせ表Ｎｏ．３に含まれる原子論理式の真偽値に基づいたパス条件を生成する。この場合、（SymC!=null）及び（SymA equals SymC）がFALSEであることから、”（SymA!=null）&（SymB!=null）&（SymC=null）&（SymA notEquals SymC）”というパス条件が生成される。今度はパス条件に論理的な矛盾がないため、図１６に示すように、組み合わせ表Ｎｏ．３の（SymA equals SymC）の真偽値がFALSEで確定し、管理表の６Ｈ領域が選択済みになる。
【００９０】
次に、取得部１６は、真偽値が未設定となっている組み合わせ表Ｎｏ．４の（SymA equals SymC）の真偽値を設定する。
【００９１】
図１６は、組み合わせ表Ｎｏ．４の（SymA equals SymC）に、仮にTRUEを設定した場合の組み合わせ表及び管理表を示した図である。
【００９２】
この場合、組み合わせ表Ｎｏ．４から、｛（SymA!=null）,（SymA equals SymC）｝＝（TRUE,TRUE）、｛（SymB!=null）,（SymA equals SymC）｝＝（FALSE,TRUE）、｛（SymC!=null）,（SymA equals SymC）｝＝（FALSE,TRUE）の組み合わせが取得される。これらの組み合わせは、管理表の１Ｇ領域、４Ｇ領域、及び６Ｇ領域に対応するが、このうち未選択領域は４Ｇ領域及び６Ｇ領域であるため、４Ｇ領域及び６Ｇ領域を仮選択する。
【００９３】
そして、取得部１６は組み合わせ表Ｎｏ．４に含まれる原子論理式の真偽値に基づいたパス条件を生成する。この場合、”（SymA!=null）&（SymB=null）&（SymC=null）&（SymA equals SymC）”というパス条件が生成される。
【００９４】
しかし、（SymA!=null）で、且つ、（SymC=null）の場合に、（SymA equals SymC）がTRUEになることはないため、このパス条件には論理的な矛盾があることになる。
【００９５】
従って、取得部１６は、管理表の４Ｇ領域及び６Ｇ領域を未選択状態に戻し、組み合わせ表Ｎｏ．４の（SymA equals SymC）に、今度は仮にFALSEを設定する。
【００９６】
図１７は、組み合わせ表Ｎｏ．４の（SymA equals SymC）に、仮にFALSEを設定した場合の組み合わせ表及び管理表を示した図である。
【００９７】
この場合、組み合わせ表Ｎｏ．４から、｛（SymA!=null）,（SymA equals SymC）｝＝（TRUE,FALSE）、｛（SymB!=null）,（SymA equals SymC）｝＝（FALSE,FALSE）、｛（SymC!=null）,（SymA equals SymC）｝＝（FALSE,FALSE）の組み合わせが取得される。これらの組み合わせは、管理表の１Ｈ領域、４Ｈ領域、及び６Ｈ領域に対応するが、このうち未選択領域は４Ｈ領域のみであるため、４Ｈ領域を選択済みにする。
【００９８】
そして、取得部１６は組み合わせ表Ｎｏ．４に含まれる原子論理式の真偽値に基づいたパス条件を生成する。この場合、（SymA!=null）のみがTRUEであることから、”（SymA!=null）&（SymB=null）&（SymC=null）&（SymA notEquals SymC）”というパス条件が生成される。今度はパス条件に論理的な矛盾がないため、組み合わせ表Ｎｏ．４の（SymA equals SymC）の真偽値がFALSEで確定し、管理表の４Ｈ領域が選択済みになる。
【００９９】
次に、取得部１６は、真偽値が未設定となっている組み合わせ表Ｎｏ．５の（SymA equals SymC）の真偽値を設定する。
【０１００】
図１８は、組み合わせ表Ｎｏ．５の（SymA equals SymC）に、仮にTRUEを設定した場合の組み合わせ表及び管理表を示した図である。
【０１０１】
この場合、組み合わせ表Ｎｏ．５から、｛（SymA!=null）,（SymA equals SymC）｝＝（FALSE,TRUE）、｛（SymB!=null）,（SymA equals SymC）｝＝（FALSE,TRUE）、｛（SymC!=null）,（SymA equals SymC）｝＝（FALSE,TRUE）の組み合わせが取得される。これらの組み合わせは、管理表の２Ｇ領域、４Ｇ領域、及び６Ｇ領域に対応するが、これらの領域は全て未選択領域であるため、２Ｇ領域、４Ｇ領域、及び６Ｇ領域を仮選択する。
【０１０２】
そして、取得部１６は組み合わせ表Ｎｏ．５に含まれる原子論理式の真偽値に基づいたパス条件を生成する。この場合、“（SymA=null）&（SymB=null）&（SymC=null）&（SymA equals SymC）”というパス条件が生成される。
【０１０３】
生成したパス条件に論理的な矛盾はないため、組み合わせ表Ｎｏ．５の（SymA equals SymC）の真偽値がTRUEで確定し、管理表の２Ｇ領域、４Ｇ領域、及び６Ｇ領域が選択済みになる。
【０１０４】
図１９は、以上に示した取得部１６のこれまでの処理より設定された、組み合わせ表及び管理表の状態を示した図である。
【０１０５】
次に、取得部１６は、管理表にまだ未選択領域が存在する場合、組み合わせ表に行を追加して、新たな組み合わせ表Ｎｏ．Ｘを取得する。
【０１０６】
以下に、組み合わせ表において、新たな組み合わせ表Ｎｏ．Ｘを取得する方法を詳細に説明する。
【０１０７】
まず、取得部１６は、組み合わせ表に新たな行を追加する。そして、取得部１６は、管理表の未選択領域を１つ選択し、選択した領域に対応した原子論理式の真偽値を、組み合わせ表の新たな行に設定する処理を繰り返し、組み合わせ表の新たな行に含まれる各原子論理式の真偽値を設定する。なお、取得部１６は、組み合わせ表の新たな行に含まれる原子論理式の真偽値が未設定であるにもかかわらず、管理表の未選択領域が存在しなくなった場合、新たな行における原子論理式の真偽値の組み合わせとして矛盾のない原子論理式の真偽値を設定する。
【０１０８】
図２０は、組み合わせ表に組み合わせ表Ｎｏ．６の行を追加し、管理表から未選択領域である２Ｃ領域を選択した場合の組み合わせ表及び管理表の状態を示した図である。なお、図２０の管理表では、組み合わせ表に行を追加する以降の処理で仮選択の場合を含めて選択された領域を、記号“△”で表している。
【０１０９】
２Ｃ領域は、｛（SymA!=null）,（SymB!=null）｝＝（FALSE，TRUE）の組み合わせに対応した領域である。従って、取得部１６は、組み合わせ表Ｎｏ．６の（SymA!=null）の真偽値をFALSE、組み合わせ表Ｎｏ．６の（SymB!=null）の真偽値をTRUEに設定する。
【０１１０】
そして、取得部１６は、追加した組み合わせ表Ｎｏ．６において、原子論理式が取る真偽値に論理的な矛盾がないか否か判定する。原子論理式が取る真偽値に論理的な矛盾がない場合、取得部１６は、組み合わせ表Ｎｏ．６に設定した真偽値をそのまま確定させると共に、選択した管理表の領域を選択済みとする。一方、原子論理式が取る真偽値に論理的な矛盾がある場合、取得部１６は、組み合わせ表Ｎｏ．６に設定した真偽値を未設定状態に戻すと共に、選択した管理表の領域を未選択状態に戻す。
【０１１１】
図２０に示した組み合わせ表Ｎｏ．６の真偽値から、（SymA=null）&（SymB!=null）というパス条件が生成されるが、このパス条件に論理的な矛盾はない。従って、組み合わせ表Ｎｏ．６の（SymA!=null）の真偽値はFALSE、組み合わせ表Ｎｏ．６の（SymB!=null）の真偽値はTRUEで確定する。
【０１１２】
しかし、組み合わせ表Ｎｏ．６には、原子論理式の真偽値が未定の領域がまだ含まれるため、取得部１６は、管理表から次の未選択領域、例えば２Ｅ領域を選択する。
【０１１３】
図２１は、管理表から２Ｅ領域を選択した場合の組み合わせ表及び管理表の状態を示した図である。
【０１１４】
２Ｅ領域は、｛（SymA!=null），（SymC!=null）｝＝（FALSE，TRUE）の組み合わせに対応した領域である。従って、取得部１６は、組み合わせ表Ｎｏ．６の（SymA!=null）の真偽値は既にFALSEとなっていることから、組み合わせ表Ｎｏ．６の（SymC!=null）の真偽値をTRUEに設定する。
【０１１５】
図２１に示した組み合わせ表Ｎｏ．６の真偽値から、（SymA=null）&（SymB!=null）&（SymC!=null）というパス条件が生成されるが、このパス条件に論理的な矛盾はない。従って、組み合わせ表Ｎｏ．６の（SymC!=null）の真偽値はTRUEで確定する。
【０１１６】
しかし、組み合わせ表Ｎｏ．６には、原子論理式の真偽値が未定の領域がまだ含まれるため、取得部１６は、管理表から更に次の未選択領域、例えば２Ｈ領域を選択する。
【０１１７】
図２２は、管理表から２Ｈ領域を選択した場合の組み合わせ表及び管理表の状態を示した図である。
【０１１８】
２Ｈ領域は、｛（SymA!=null）,（SymA equals SymC）｝＝（FALSE，FALSE）の組み合わせに対応した領域である。従って、取得部１６は、組み合わせ表Ｎｏ．６の（SymA!=null）の真偽値は既にFALSEとなっていることから、組み合わせ表Ｎｏ．６の（SymA equals SymC）の真偽値をFALSEに設定する。
【０１１９】
図２２に示した組み合わせ表Ｎｏ．６の真偽値から、（SymA=null）&（SymB!=null）&（SymC!=null）&（SymA notEquals SymC）というパス条件が生成されるが、このパス条件に論理的な矛盾はない。従って、組み合わせ表Ｎｏ．６の（SymA equals SymC）の真偽値はFALSEで確定する。
【０１２０】
以上により、組み合わせ表の組み合わせ表Ｎｏ．６に含まれる各原子論理式の真偽値が確定する。
【０１２１】
しかしながら、管理表には、まだ４Ｅ領域が未選択領域として残っている。従って、取得部１６は、組み合わせ表に組み合わせ表Ｎｏ．７の行を追加する。
【０１２２】
図２３は、組み合わせ表に組み合わせ表Ｎｏ．７の行を追加し、管理表から未選択領域である４Ｅ領域を選択した場合の組み合わせ表及び管理表の状態を示した図である。
【０１２３】
４Ｅ領域は、｛（SymB!=null）,（SymC!=null）｝＝（FALSE，TRUE）の組み合わせに対応した領域である。従って、取得部１６は、組み合わせ表Ｎｏ．７の（SymB!=null）の真偽値をFALSE、組み合わせ表Ｎｏ．７の（SymC!=null）の真偽値をTRUEに設定する。
【０１２４】
この時点で、管理表に未選択領域が存在しない状態となるが、組み合わせ表Ｎｏ．７の（SymA!=null）の真偽値と、（SymA equals SymC）の真偽値はまだ設定されていない。
【０１２５】
この場合、取得部１６は、組み合わせ表において真偽値が未設定となっている原子論理式に真偽値を設定する。
【０１２６】
以下に、組み合わせ表において真偽値が未設定となっている原子論理式の真偽値の設定方法を詳細に説明する。
【０１２７】
まず、取得部１６は、真偽値が未設定となっている原子論理式の真偽値に、TRUE及びFALSEの何れか一方の真偽値を仮設定する。そして、取得部１６は、仮設定した原子論理式の真偽値を含む組み合わせ表Ｎｏ．Ｘにおいて、各原子論理式が取る真偽値に論理的な矛盾がないか否か判定する。
【０１２８】
各原子論理式が取る真偽値に論理的な矛盾がない場合、取得部１６は、組み合わせ表の仮設定した真偽値をそのまま確定させる。
【０１２９】
一方、各原子論理式が取る真偽値に論理的な矛盾がある場合、取得部１６は、組み合わせ表の仮設定した真偽値を未設定状態に戻す。
【０１３０】
そして、取得部１６は、組み合わせ表の未設定状態に戻した領域に、先ほど仮設定した真偽値とは逆の真偽値を仮設定し、上記に説明した処理を再び実施することで、追加した組み合わせ表Ｎｏ．Ｘで未設定となっている原子論理式の真偽値を設定する。
【０１３１】
図２４は、追加した組み合わせ表Ｎｏ．７の真偽値が未設定となっている（SymA!=null）に、TRUEを仮設定した場合の組み合わせ表及び管理表を示した図である。
【０１３２】
この場合、組み合わせ表Ｎｏ．７に含まれる原子論理式の真偽値に基づいたパス条件を生成すると、“（SymA!=null）&（SymB=null）&（SymC!=null）”というパス条件が生成される。生成されたパス条件に論理的な矛盾はないため、組み合わせ表Ｎｏ．７の（SymA!=null）の真偽値はTRUEに確定される。
【０１３３】
組み合わせ表Ｎｏ．７には、まだ真偽値が未設定となっている原子論理式が存在するため、引き続き取得部１６は、原子論理式の真偽値を設定する処理を継続する。
【０１３４】
図２５は、追加した組み合わせ表Ｎｏ．７の真偽値が未設定となっている（SymA equals SymC）に、TRUEを仮設定した場合の組み合わせ表及び管理表を示した図である。
【０１３５】
この場合、組み合わせ表Ｎｏ．７に含まれる原子論理式の真偽値に基づいたパス条件を生成すると、“（SymA!=null）&（SymB=null）&（SymC!=null）&（SymA equals SymC）”というパス条件が生成される。生成されたパス条件に論理的な矛盾はないため、組み合わせ表Ｎｏ．７の（SymA equals SymC）の真偽値はTRUEに確定される。
【０１３６】
以上の処理により、組み合わせ表における各原子論理式の真偽値が設定される。
【０１３７】
更に、取得部１６は、各原子論理式の真偽値が設定され、且つ、管理表の各領域が選択済みとなった際の組み合わせ表に基づいて、パス条件を生成する。なお、取得部１６において生成するパス条件は、ＤＡＲＴ法によって抽出されたパスに対応するパス条件に加え、組み合わせ表の追加行に対応したパス条件を含むことから、拡張パス条件という。
【０１３８】
図２６は、取得部１６で生成した拡張パス条件の一例を示した図である。なお、拡張パス条件Ｎｏ．Ｘは、同じ番号を有する組み合わせ表Ｎｏ．に含まれる原子論理式の真偽値に基づいて生成されたパス条件である。
【０１３９】
そして、生成部２０は、拡張パス条件の各々に対応したテストケース２４を生成する。
【０１４０】
図２７は、生成したテストケース２４の一例を示した図である。
【０１４１】
例えば、図２７の拡張パス条件Ｎｏ．６は、“（SymA=null）&（SymB!=null）&（SymC!=null）&（SymA notEquals SymC）”であるから、SymAにnullが設定され、SymB及びSymCにnull以外の値が設定される。そして、この際、（SymA notEquals SymC）の条件が存在することから、SymAとSymCに同じ値が設定されないようにする。具体的には、例えば拡張パス条件Ｎｏ．６から、ａ＝null、ｂ＝“ａ”、ｃ＝“ａ”に設定されたテストケースが生成される。
【０１４２】
同様に、拡張パス条件Ｎｏ．７は、“（SymA!=null）&（SymB=null）&（SymC!=null）&（SymA equals SymC）”であるから、SymBにnullが設定され、SymA及びSymCにnull以外の値が設定される。そして、この際、SymAとSymCに同じ値が設定されるようにする。具体的には、例えば拡張パス条件Ｎｏ．７から、ａ＝“ａ”、ｂ＝null、ｃ＝“ａ”に設定されたテストケースが生成される。
【０１４３】
このように、テストケース生成装置１０により生成された図２７のテストケースには、パス条件の抽出にＤＡＲＴ法のみを用いて生成された図２のテストケースには含まれない拡張パス条件Ｎｏ．６及び拡張パス条件Ｎｏ．７に対応したテストケースが含まれる。
【０１４４】
特にテストケースＮｏ．６は、図２に示した被検査プログラム２２に対して例外発生を引き起こすテストケースと一致するため、図２７に示したテストケースを用いることで、被検査プログラム２２に含まれる不具合が検出される。従って、パスの抽出にＤＡＲＴ法のみを用いて生成されたテストケースと比較して、開示の技術に係るテストケース生成装置１０により生成されたテストケースの方が、被検査プログラム２２の検証品質を向上させることができる。
【０１４５】
また、パス網羅によるパス抽出を用いて生成されたテストケースの場合、図２に示した被検査プログラム２２に対して１６個のテストケースが生成されるが、開示の技術に係るテストケース生成装置１０により生成されるテストケースは７個となる。従って、開示の技術に係るテストケース生成装置１０は、パス網羅によるパス抽出を用いてテストケースを生成する場合と比較して、生成されるテストケースの数を抑制することができる。
【０１４６】
以上に説明したテストケース生成装置１０は、例えば、図２８に示すコンピュータ４０で実現することができる。コンピュータ４０は、ＣＰＵ４２、メモリ４４、及び不揮発性の記憶部４６を含み、これらはバス４８を介して互いに接続される。
【０１４７】
また、記憶部４６はＨＤＤ（Hard Disk Drive）又はフラッシュメモリ等によって実現できる。記憶媒体としての記憶部４６には、コンピュータ４０を被検査プログラム２２に対するテストケース生成装置１０として機能させるためのテストケース生成プログラム５０が記憶されている。ＣＰＵ４２は、テストケース生成プログラム５０を記憶部４６から読み出してメモリ４４に展開し、テストケース生成プログラム５０に含まれる各種プロセスを順次実行する。
【０１４８】
テストケース生成プログラム５０は、抽出プロセス５２、集約プロセス５４、取得プロセス５６、及び生成プロセス６０を含む。
【０１４９】
ＣＰＵ４２は、抽出プロセス５２を実行することで、図４に示す抽出部１２として動作する。また、ＣＰＵ４２は、集約プロセス５４を実行することで、図４に示す集約部１４として動作する。また、ＣＰＵ４２は、取得プロセス５６を実行することで、図４に示す取得部１６として動作する。また、ＣＰＵ４２は、生成プロセス６０を実行することで、図４に示す生成部２０として動作する。
【０１５０】
以上により、テストケース生成プログラム５０を実行したコンピュータ４０が、テストケース生成装置１０として動作する。なお、テストケース生成プログラム５０は、開示の技術におけるテストケース生成プログラムの一例を示したものである。
【０１５１】
なお、テストケース生成装置１０は、例えば半導体集積回路、より詳しくはＡＳＩＣ（Application Specific Integrated Circuit)等で実現することも可能である。
【０１５２】
次に、本実施形態に係るテストケース生成装置１０の作用を説明する。本実施形態に係るテストケース生成装置１０は、抽出部１２に被検査プログラム２２が入力されると、図２９に示すテストケース生成処理を実行する。
【０１５３】
図２９は、テストケース生成装置１０で実行されるテストケース生成処理の全体フローチャートである。
【０１５４】
ステップＳ１００では、抽出部１２は、被検査プログラム２２から分岐網羅を実現するパスを抽出し、抽出したパス毎にパス条件を生成して、パス条件に含まれる個別条件式を抽出する。そして、集約部１４は、集約テーブルを参照して、個別条件式を原子論理式に集約する。
【０１５５】
ステップＳ２００では、取得部１６は、ステップＳ１００の処理で集約した原子論理式に基づいて組み合わせ表及び管理表を作成し、同じくステップＳ１００の処理で生成したパス条件に基づいて、組み合わせ表及び管理表の対応する領域を設定する。
【０１５６】
ステップＳ３００では、取得部１６は、ステップＳ１００の処理で生成したパス条件とは異なる拡張パス条件を生成する。
【０１５７】
そして、ステップＳ４００では、ステップＳ３００の処理で生成された拡張パス条件の各々に基づいて、テストケース２４を生成する。
【０１５８】
以下に、ステップＳ１００〜Ｓ３００の各処理について詳細に説明する。
【０１５９】
図３０は、ステップＳ１００の処理を示したサブルーチンのフローチャートである。
【０１６０】
まず、ステップＳ１０５では、抽出部１２が被検査プログラム２２を受け付け、例えばメモリ４４の予め定めた領域に被検査プログラム２２を記憶する。そして、抽出部１２は、公知の分岐網羅指向のパス抽出法、例えばＤＡＲＴ法により被検査プログラム２２からパスを抽出し、抽出したパス毎にパス条件を生成して、メモリ４４の予め定めた領域に記憶する。
【０１６１】
ステップＳ１１０では、抽出部１２は、ステップＳ１０５の処理で記憶された、まだ選択していない未処理のパス条件をメモリ４４から１つ選択する。この際、抽出部１２は、選択したパス条件には選択済みであることを示す識別子を関連付けて、メモリ４４に記憶する。
【０１６２】
ステップＳ１１５では、抽出部１２は、ステップＳ１１０の処理で選択したパス条件を個別条件式に分割し、個別条件式をメモリ４４の予め定めた領域に記憶する。
【０１６３】
ステップＳ１２０では、集約部１４は、ステップＳ１１５の処理で記憶された、まだ選択していない未処理の個別条件式をメモリ４４から１つ選択する。この際、集約部１４は、選択した個別条件式には選択済みであることを示す識別子を関連付けて、メモリ４４に記憶する。
【０１６４】
ステップＳ１２５では、集約部１４は、メモリ４４の予め定めた領域に記憶されている集約テーブルを参照して、ステップＳ１２０の処理で選択した個別条件式に、変換を要する演算子が含まれているか否かを判定する。肯定判定の場合には、ステップＳ１３０へ移行し、否定判定の場合には、ステップＳ１３０の処理を省略して、ステップＳ１３５へ移行する。なお、集約テーブルは記憶部４６の予め定めた領域に予め記憶されており、テストケース生成プログラム５０をメモリ４４に展開する際に、メモリ４４に展開される。
【０１６５】
ステップＳ１３０では、集約部１４は、個別条件式に含まれる演算子を、集約テーブルに規定された逆の関係を有する演算子に変更する。
【０１６６】
そして、ステップＳ１３５では、集約部１４は、選択中の個別条件式が、メモリ４４の予め定めた領域に展開される原子論理式テーブルに記憶されているか否かを判定する。否定判定の場合には、ステップＳ１４０へ移行し、肯定判定の場合には、ステップＳ１４０の処理を省略して、ステップＳ１４５へ移行する。
【０１６７】
ステップＳ１４０では、集約部１４は、個別条件式を原子論理式として原子論理式テーブルに追加する。
【０１６８】
ステップＳ１４５では、集約部１４は、抽出部１２がステップＳ１１５の処理でパス条件から分割した個別条件式に、まだ選択していない未処理の個別条件式があるか否かを判定する。肯定判定の場合にはステップＳ１２０へ移行し、集約部１４は、ステップＳ１２０〜Ｓ１４５の処理を繰り返して、ステップＳ１１５の処理でパス条件から分割した個別条件式の各々から原子論理式を生成する。一方、否定判定の場合には、ステップＳ１５０へ移行する。
【０１６９】
ステップＳ１５０では、集約部１４は、抽出部１２がステップＳ１０５の処理で生成したパス条件に、まだ選択していない未処理のパス条件があるか否かを判定する。肯定判定の場合にはステップＳ１１０の処理へ移行し、ステップＳ１１０〜Ｓ１５０の処理を繰り返して、集約部１４は、ステップＳ１０５の処理で生成したパス条件の各々から原子論理式を生成する。一方、否定判定の場合には、本サブルーチンを終了する。
【０１７０】
なお、集約部１４は本サブルーチンを終了する際、例えば、ステップＳ１１０の処理でパス条件に関連付けて記憶した識別子と、ステップＳ１２０の処理で個別条件式に関連付けて記憶した識別子と、を消去して、パス条件及び個別条件式を未選択状態に戻す。
【０１７１】
以上の処理により、図２９に示すステップＳ１００の処理が終了し、被検査プログラム２２から抽出したパスに基づいた原子論理式が得られる。
【０１７２】
次に、ステップＳ２００の処理について説明する。
【０１７３】
図３１は、ステップＳ２００の処理を示したサブルーチンのフローチャートである。
【０１７４】
まず、ステップＳ２０５では、取得部１６は、ステップＳ１００の処理で集約部１４が集約した原子論理式に基づいて空の組み合わせ表を生成し、メモリ４４の予め定めた領域に空の組み合わせ表を展開する。なお、既に説明したように、組み合わせ表の各列には、集約部１４が集約した原子論理式が配置される。
【０１７５】
ステップＳ２１０では、取得部１６は、ステップＳ１００の処理で集約部１４が集約した原子論理式に基づいて空の管理表を生成し、メモリ４４の予め定めた領域に空の管理表を展開する。なお、既に説明したように、管理表の各行各列には、集約部１４が集約した各原子論理式の真偽値が配置される。
【０１７６】
ステップＳ２１５では、取得部１６は、図３０のステップＳ１０５の処理で記憶された、まだ選択していない未処理のパス条件をメモリ４４から１つ選択する。この際、取得部１６は、選択したパス条件には選択済みであることを示す識別子を関連付けて、メモリ４４に記憶する。
【０１７７】
ステップＳ２２０では、取得部１６は、ステップＳ２０５の処理で生成した組み合わせ表に行を追加し、追加した行を現在処理行として取り扱う。
【０１７８】
ステップＳ２２５では、取得部１６は、ステップＳ２１５の処理で選択したパス条件を個別条件式に分割し、個別条件式をメモリ４４の予め定めた領域に記憶する。
【０１７９】
ステップＳ２３０では、取得部１６は、ステップＳ２２５の処理で記憶された、まだ選択していない未処理の個別条件式をメモリ４４から１つ選択する。この際、取得部１６は、選択した個別条件式には選択済みであることを示す識別子を関連付けて、メモリ４４に記憶する。
【０１８０】
ステップＳ２３５では、取得部１６は、ステップＳ２３０の処理で選択した個別条件式に基づいて、現在処理行の個別条件式に対応した原子論理式の真偽値を設定する。
【０１８１】
図３２は、ステップＳ２３５の処理を詳細に示したサブルーチンのフローチャートである。
【０１８２】
まず、ステップＳ５００では、取得部１６は、組み合わせ表の現在処理行の各列から、ステップＳ２３０で選択した個別条件式と一致する原子論理式の列を選択する。もし、一致する原子論理式の列が存在しない場合には、取得部１６は、集約テーブルを参照して、ステップＳ２３０で選択した個別条件式に含まれる演算子を、集約テーブルに規定された逆の関係を有する演算子に変更する。そして、取得部１６は、組み合わせ表の現在処理行の各列から、演算子を変更した個別条件式と一致する原子論理式の列を選択する。
【０１８３】
次に、ステップＳ５０５では、取得部１６は、ステップＳ２３０の処理で選択した個別条件式と、ステップＳ５００で選択した列の原子論理式と、を比較して、選択した原子論理式の列で示される現在処理行の領域に真偽値を設定する。例えば、取得部１６は、個別条件式と原子論理式が同じであればTRUEを設定し、個別条件式と原子論理式が異なる場合にはFALSEを設定する。具体的には、取得部１６は、例えば個別条件式が（SymA!=null）で、原子論理式も（SymA!=null）ならTRUEを設定し、個別条件式が（SymA=null）で、原子論理式が（SymA!=null）ならFALSEを設定する。
【０１８４】
以上、ステップＳ５００及びステップＳ５０５の処理が、ステップＳ２３５の処理として実行される。
【０１８５】
引き続き、図３１のステップＳ２４０では、取得部１６は、パス条件から分割した個別条件式に、まだ選択していない未処理の個別条件式があるか否かを判定する。肯定判定の場合にはステップＳ２３０へ移行し、取得部１６はステップＳ２３０〜Ｓ２４０の処理を繰り返して、ステップＳ２２５の処理でパス条件から分割した個別条件式の各々に基づいて、現在処理行の個別条件式に対応した原子論理式の真偽値を設定する。一方、否定判定の場合には、ステップＳ２４５へ移行する。
【０１８６】
ステップＳ２４５では、取得部１６は、現在処理行における原子論理式の真偽値の組み合わせの各々に対応した管理表の領域を、選択済みに設定する。
【０１８７】
図３３は、ステップＳ２４５の処理を詳細に示したサブルーチンのフローチャートである。
【０１８８】
まず、ステップＳ６００では、取得部１６は、ステップＳ２３０〜Ｓ２４０の処理によって設定された現在処理行の各原子論理式の真偽値から、２つの原子論理式の真偽値を選択する全ての組み合わせを生成し、メモリ４４の予め定めた領域に記憶する。
【０１８９】
ステップＳ６０５では、取得部１６は、ステップＳ６００の処理で生成した原子論理式の真偽値の組み合わせから、まだ選択していない未処理の原子論理式の真偽値の組み合わせを１つ選択する。この際、取得部１６は、選択した原子論理式の真偽値の組み合わせには選択済みであることを示す識別子を関連付けて、メモリ４４に記憶する。
【０１９０】
ステップＳ６１０では、取得部１６は、ステップＳ６０５の処理で選択した原子論理式の真偽値の組み合わせに対応した管理表の領域に、選択済みであることを示す識別子を関連付けてメモリ４４に記憶することで、管理表を更新する。
【０１９１】
ステップＳ６１５では、取得部１６は、ステップＳ６００の処理で生成した原子論理式の真偽値の組み合わせに、まだ選択していない未処理の組み合わせがあるか否かを判定する。肯定判定の場合にはステップＳ６０５へ移行し、ステップＳ６０５〜Ｓ６１５の処理を繰り返して、現在処理行における原子論理式の真偽値の組み合わせの各々に対応した管理表の領域を選択済みに設定する。一方、否定判定の場合には、本サブルーチンを終了する。
【０１９２】
引き続き、図３１のステップＳ２５０では、取得部１６は、図３０のステップＳ１０５の処理で生成されたパス条件のうち、まだ選択していない未処理のパス条件があるか否かを判定する。そして、肯定判定の場合にはステップＳ２１５へ移行して、ステップＳ２１５〜Ｓ２５０の処理を繰り返す。一方、否定判定の場合には、図３１に示したテーブル作成処理サブルーチンを終了する。
【０１９３】
以上の処理により、図２９に示すステップＳ２００の処理が終了し、ＤＡＲＴ法によって抽出されたパスに対応するパス条件が、組み合わせ表及び管理表に反映される。
【０１９４】
次に、ステップＳ３００の処理について説明する。
【０１９５】
図３４は、ステップＳ３００の処理を示したサブルーチンの全体フローチャートである。
【０１９６】
拡張パス条件を生成するステップＳ３００は、ステップＳ７００、ステップＳ８００、及びステップＳ１０００の各処理を含む。
【０１９７】
そして、ステップＳ７００では、原子論理式の真偽値が設定されていない組み合わせ表の領域に真偽値を設定する。ステップＳ８００では、組み合わせ表に新たな行を追加して、追加した行の原子論理式の各々に真偽値を設定する。ステップＳ１０００では、組み合わせ表に基づいて拡張パス条件を生成する。
【０１９８】
まず、ステップＳ７００の処理について詳細に説明する。
【０１９９】
図３５は、ステップＳ７００の処理を示したサブルーチンのフローチャートである。
【０２００】
ステップＳ７０５では、取得部１６は、組み合わせ表に原子論理式の真偽値が設定されていない領域（真偽値未定領域）が存在するか否かを判定する。否定判定の場合には、組み合わせ表に原子論理式の真偽値を設定する必要がないため、本サブルーチンを終了する。一方、肯定判定の場合にはステップＳ７１０へ移行する。
【０２０１】
ステップＳ７１０では、取得部１６は、組み合わせ表から真偽値未定領域を１つ選択する。この際、取得部１６は、当該領域に選択済みであることを示す識別子を関連付けて、メモリ４４に記憶する。
【０２０２】
ステップＳ７１５では、取得部１６は、ステップＳ７１０の処理で選択した真偽値未定領域に真偽値としてTRUEを設定する。
【０２０３】
ステップＳ７２０では、取得部１６は、ステップＳ７１５の処理で真偽値を設定した真偽値未定領域を含む組み合わせ表の行において、当該真偽値未定領域の原子論理式の真偽値を含む２つの原子論理式の真偽値の全ての組み合わせを取得する。そして、取得部１６は、取得した原子論理式の真偽値の組み合わせに対応した管理表の領域のうち、未選択領域を検索する。
【０２０４】
ステップＳ７２５では、取得部１６は、ステップＳ７２０の処理で取得した原子論理式の真偽値の組み合わせの各々に対応した管理表の領域に、未選択領域があるか否かを判定する。否定判定の場合にはステップＳ７５０へ移行し、肯定判定の場合にはステップＳ７３０へ移行する。
【０２０５】
ステップＳ７３０では、取得部１６は、管理表から未選択となっている領域を選択する。この際、取得部１６は、当該領域に選択済みであることを示す識別子を関連付けて、メモリ４４に記憶する。
【０２０６】
ステップＳ７３５では、取得部１６は、ステップＳ７１０の処理で選択した真偽値未定領域に対応する組み合わせ表の行に含まれる原子論理式の真偽値に基づいて、パス条件を復元する。
【０２０７】
ステップＳ７４０では、取得部１６は、ステップＳ７３５の処理で復元したパス条件に論理的な矛盾がないか否かを判定する。否定判定の場合にはステップＳ７４５へ移行する。
【０２０８】
ステップＳ７４５では、取得部１６は、ステップＳ７３０の処理で管理表の領域に関連付けて記憶した識別子を消去して、ステップＳ７３０の処理で選択した領域を未選択状態に戻す。
【０２０９】
ステップＳ７５０では、取得部１６は、ステップＳ７１０の処理で選択した真偽値未定領域に、ステップＳ７１５で設定した真偽値とは逆の真偽値であるFALSEを設定し、ステップＳ７２０へ移行する。
【０２１０】
一方、ステップＳ７４０の処理において肯定判定となった場合には、ステップＳ７５５へ移行する。
【０２１１】
ステップＳ７５５では、取得部１６は、組み合わせ表に真偽値未定領域がまだ存在するか否かを判定する。そして、肯定判定の場合にはステップＳ７１０へ移行し、ステップＳ７１０〜Ｓ７５５の処理を繰り返し、真偽値未定領域に真偽値を設定する処理を繰り返す。
【０２１２】
以上の処理により、図３４に示すステップＳ７００の処理が終了し、組み合わせ表に含まれる領域の各々に真偽値が設定される。
【０２１３】
次に、ステップＳ８００の処理について詳細に説明する。
【０２１４】
図３６は、ステップＳ８００の処理を示したサブルーチンのフローチャートである。
【０２１５】
まず、ステップＳ８０５では、取得部１６は、組み合わせ表に原子論理式の真偽値が未設定状態の空の行を追加し、追加した行を現在処理行として取り扱う。
【０２１６】
ステップＳ８１０では、取得部１６は、管理表に未選択領域が存在するか否かを判定する。否定判定の場合には、後述するステップＳ８１５〜Ｓ８２５の処理を省略してステップＳ８３０へ移行する。肯定判定の場合には、ステップＳ８１５へ移行する。
【０２１７】
ステップＳ８１５では、取得部１６は、管理表の未選択領域のうち何れか１つの領域を選択する。この際、取得部１６は、当該領域に選択済みであることを示す識別子を関連付けて、メモリ４４に記憶する。
【０２１８】
ステップＳ８２０では、取得部１６は、ステップＳ８１５の処理で選択した領域に対応した原子論理式の真偽値を現在処理行に設定した場合に、現在処理行に含まれる原子論理式の真偽値に基づいて復元したパス条件が充足可能か否かを判定する。そして、取得部１６は、復元したパス条件が充足可能である場合に、ステップＳ８１５の処理で選択した領域に対応した原子論理式の真偽値を組み合わせ表の現在処理行に設定する。なお、ステップＳ８２０での処理の詳細は後ほど説明する。
【０２１９】
ステップＳ８２５では、取得部１６は、ステップＳ８０５の処理で追加した現在処理行に、まだ原子論理式の真偽値が設定されていない未処理の領域があるか否かを判定する。肯定判定の場合には、ステップＳ８１０へ移行し、ステップＳ８１０〜Ｓ８２５の処理を繰り返すことで、取得部１６は、現在処理行の原子論理式の真偽値を設定する。一方、否定判定の場合には、ステップＳ８３５へ移行する。
【０２２０】
一方、ステップＳ８３０では、取得部１６は、後述する図３７のステップＳ９３５の処理で記憶された領域がある場合には、当該領域に関連付けられた識別子を消去して、当該領域を未選択状態に戻す。
【０２２１】
ステップＳ８３５では、取得部１６は、ステップＳ８０５の処理で追加した現在処理行に、真偽値未定領域があるか否かを判定し、肯定判定の場合にはステップＳ８４５へ移行する。
【０２２２】
ステップＳ８４５では、取得部１６は、現在処理行の真偽値未定領域のうち、何れか１つの領域を選択する。この際、取得部１６は、当該領域に選択済みであることを示す識別子を関連付けて、メモリ４４に記憶する。
【０２２３】
ステップＳ８５０では、取得部１６は、ステップＳ８４５の処理で選択した真偽値未定領域に真偽値としてTRUEを設定する。
【０２２４】
ステップＳ８５５では、取得部１６は、現在処理行の原子論理式の真偽値に基づいてパス条件を復元し、復元したパス条件に論理的な矛盾がないか否かを判定する。肯定判定の場合には、ステップＳ８４５の処理で選択した真偽値未定領域の真偽値をTRUEに確定して、ステップＳ８３５へ移行し、現在処理行に他の真偽値未定領域があるか否かを判定する。一方、否定判定の場合にはステップＳ８６０へ移行する。
【０２２５】
ステップＳ８６０では、取得部１６は、ステップＳ８４５の処理で選択した真偽値未定領域に、ステップＳ８５０の処理で設定した真偽値とは逆の真偽値であるFALSEを設定する。
【０２２６】
そして、ステップＳ８６５では、取得部１６は、現在処理行の原子論理式の真偽値に基づいてパス条件を復元し、復元したパス条件に論理的な矛盾がないか否かを判定する。肯定判定の場合には、ステップＳ８４５の処理で選択した真偽値未定領域の真偽値をFALSEに確定して、ステップＳ８３５へ移行し、現在処理行に他の真偽値未定領域があるか否かを判定する。
【０２２７】
一方、ステップＳ８３５の判定が否定判定の場合には、ステップＳ８４０へ移行する。ステップＳ８４０では、取得部１６は、更に管理表に未選択領域が存在するか否かを判定する。肯定判定の場合にはステップＳ８０５へ移行し、組み合わせ表に空の行を追加して、ステップＳ８０５〜Ｓ８６５を繰り返すことで追加した行の原子論理式の真偽値を設定する。否定判定の場合には本サブルーチンを終了する。
【０２２８】
以上の処理により、図３４に示すステップＳ８００の処理が終了し、原子論理式の真偽値が設定された新たな行が、組み合わせ表に追加される。
【０２２９】
そして、ステップＳ１０００では、ステップＳ８００の処理で作成された組み合わせ表の行毎に含まれる原子論理式の真偽値に基づいて、パス条件を復元し、復元したパス条件を拡張パス条件としてメモリ４４に記憶する。
【０２３０】
以上の処理により、図２９に示すステップＳ３００の処理が終了し、拡張パス条件が生成される。
【０２３１】
次に、ステップＳ３００の処理において、まだ説明していない図３６のステップＳ８２０の処理について詳細に説明する。
【０２３２】
図３７は、ステップＳ８２０の処理を示したサブルーチンのフローチャートである。本サブルーチンでは、選択した管理表の領域に対応した原子論理式の真偽値を現在処理行に設定した場合に、現在処理行に含まれる原子論理式の真偽値に基づいて復元したパス条件が充足可能か否かを判定する。
【０２３３】
まず、ステップＳ９００では、取得部１６は、図３６のステップＳ８１５の処理で選択した管理表の領域に対応する原子論理式の真偽値の組み合わせを取得し、メモリ４４に記憶する。
【０２３４】
例えば、取得部１６が図２０において管理表から２Ｃ領域を選択した場合の、管理表の領域に対応する原子論理式の真偽値の組み合わせとは、｛（SymA!=null）,（SymB!=null）｝＝（FALSE，TRUE）を意味する。なお、説明上、管理表の領域に対応する原子論理式の真偽値の組み合わせのうち一方の原子論理式（前述の例では（SymA!=null））を原子論理式Ａ、他方の原子論理式（前述の例では（SymB!=null））を原子論理式Ｂとする。
【０２３５】
そして、取得部１６は、現在処理行の原子論理式Ａに対応する領域を選択する。
【０２３６】
ステップＳ９０５では、取得部１６は、ステップＳ９００の処理で選択した現在処理行の領域に真偽値が設定されていないか、又は、当該選択した領域に原子論理式Ａの真偽値と同じ真偽値が設定されているか否かを判定する。そして、否定判定の場合には本サブルーチンを終了する。一方、肯定判定の場合にはステップＳ９１０へ移行する。
【０２３７】
ステップＳ９１０では、取得部１６は、ステップＳ９００の処理で取得した原子論理式Ｂに対応する現在処理行の領域を選択する。
【０２３８】
ステップＳ９１５では、取得部１６は、ステップＳ９１０の処理で選択した現在処理行の領域に真偽値が設定されていないか、又は、当該選択した領域に原子論理式Ｂの真偽値と同じ真偽値が設定されているか否かを判定する。否定判定の場合には本サブルーチンを終了する。一方、肯定判定の場合にはステップＳ９２０へ移行する。
【０２３９】
ステップＳ９２０では、取得部１６は、ステップＳ９００の処理で選択した現在処理行の領域に原子論理式Ａの真偽値を設定し、ステップＳ９１０の処理で選択した現在処理行の領域に原子論理式Ｂの真偽値を設定する。
【０２４０】
ステップＳ９２５では、取得部１６は、現在処理行に含まれる原子論理式の真偽値に基づいて、パス条件を復元する。
【０２４１】
そして、ステップＳ９３０では、取得部１６は、ステップＳ９３０の処理で復元したパス条件に論理的な矛盾がないか否かを判定する。肯定判定の場合には本サブルーチンを終了する。一方、否定判定の場合にはステップＳ９３５へ移行する。
【０２４２】
ステップＳ９３５では、取得部１６は、現在処理行から復元されたパス条件に論理的な矛盾を引き起こす、ステップＳ８１５の処理で選択した管理表の領域をメモリ４４に記憶して、本サブルーチンを終了する。なお、本ステップで記憶された管理表の領域は、図３６のステップＳ８３０の処理で未選択状態に戻される。
【０２４３】
以上の処理により、図３６に示すステップＳ８２０の処理が終了し、現在処理行に管理表から選択した領域に対応する原子論理式の真偽値の組み合わせが設定される。
【０２４４】
そして、図２９のステップＳ４００では、ステップＳ３００の処理で生成した拡張パス条件に基づいて、例えば、図２７に示すようなテストケースを生成する。
【０２４５】
以上の処理により、コンピュータ４０上で図２９に示すテストケース生成処理が実行される。
【０２４６】
次に、図１に示す被検査プログラムから生成されるテストケース数を比較する。パス網羅によるパス抽出法では、既に説明したように１０２４個のテストケースが生成され、ＤＡＲＴ法によるパス抽出法では、１１個のテストケースが生成される。
【０２４７】
一方、実施形態に開示したテストケース生成処理を用いた場合、２０個のテストケースが生成される。
【０２４８】
この様に、本実施形態に係るテストケース生成装置１０は、従来の分岐網羅指向のパス抽出法により生成されるテストケースに含まれないテストケースを生成することができる。従って、本実施形態に係るテストケース生成装置１０は、従来の分岐網羅指向のパス抽出法を用いたテストケース生成装置に比べ、被検査プログラム２２に含まれるより多くのパスを検証することができ、被検査プログラム２２の検証品質を向上させることができる。
【０２４９】
一方、本実施形態に係るテストケース生成装置１０は、パス網羅によるパス抽出を用いてテストケースを生成する場合と比較して、生成されるテストケースの数を抑制することができる。
【０２５０】
以上、開示の技術を実施形態を用いて説明したが、開示の技術は上記実施形態に記載の範囲には限定されない。開示の技術の要旨を逸脱しない範囲で上記実施形態に多様な変更または改良を加えることができ、当該変更または改良を加えた形態も開示の技術の技術的範囲に含まれる。例えば、開示の技術の要旨を逸脱しない範囲で、図２９〜図３７に示した処理の順序を変更してもよい。
【０２５１】
具体的には、図３５のステップＳ７１５及びステップＳ７５０の処理を入れ替えたものや、図３６のステップＳ８５０の処理及びステップＳ８６０の処理を入れ替えたものも、開示の技術の技術的範囲に含まれる。
【０２５２】
また、上記では開示の技術に係るテストケース生成プログラムの一例であるテストケース生成プログラム５０が記憶部４６に予め記憶（インストール）されている態様を説明したが、これに限定されるものではない。開示の技術に係るテストケース生成プログラムは、コンピュータ読取可能な記録媒体に記録されている形態で提供することも可能である。例えば、開示の技術に係るテストケース生成プログラムは、ＣＤ−ＲＯＭ、ＤＶＤ−ＲＯＭ、及びＵＳＢメモリ等の可搬型記録媒体、並びに、フラッシュメモリ等の半導体メモリ等に記録されている形態で提供することも可能である。
【０２５３】
更に、実施形態に開示したテストケース生成装置１０は、２次元の管理表を例にして拡張パス条件を生成する例を説明したが、管理表の次元数はこれに限られず、３次元以上の管理表を用いて拡張パス条件を生成するようにしてもよい。
【０２５４】
例えば、図３１のステップＳ２１０の処理で３次元の空の管理表を生成し、図３３のステップＳ６００の処理で現在処理行の各原子論理式の真偽値から、３つの原子論理式の真偽値を選択する全ての組み合わせを生成して管理表の対応する領域を選択する。
【０２５５】
そして、図３４のステップＳ８００の処理で追加した組み合わせ表の行に管理表の未選択の領域に対応した原子論理式の真偽値を設定して、拡張パス条件を生成するようにしてもよい。なお、２次元の管理表を用いた場合、３次元以上の管理表を用いた場合と比較して、図２９に示したテストケース生成処理に要するコンピュータ４０の計算量が減少し、より短い時間でテストケースを生成することができる。
【０２５６】
また、実施形態に開示したテストケース生成装置１０は、被検査プログラム２２を受け付け、抽出部１２で公知の分岐網羅指向のパス抽出法を用いて被検査プログラム２２からパスを抽出し、抽出したパスに対応したパス条件から個別条件式を抽出するようにした。
【０２５７】
しかし、テストケース生成装置１０は、被検査プログラム２２ではなく、被検査プログラム２２から公知の分岐網羅指向のパス抽出法により予め抽出されたパスのパス条件を受け付けるようにしてもよい。この場合、集約部１４においてパス条件から個別条件式を抽出するようにすれば、抽出部１２は不要となる。
【０２５８】
また、実施形態に開示したテストケース生成装置１０は、単一のコンピュータ４０上で実現されるものとして説明した。しかし、プロセスを異なるコンピュータの記憶部４６に記憶させ、各々のコンピュータを有線又は無線の通信回線で接続した分散処理の形態で、テストケース生成装置１０を実現するようにしてもよい。
【０２５９】
また、実施形態に開示したテストケース生成装置１０は、ネットワークを経由して被検査プログラム２２を受け付け、生成したテストケースをネットワーク経由で出力する、所謂ネットサービスの態様をとるようにしてもよい。
【０２６０】
以上の実施形態に関し、更に以下の付記を開示する。
【０２６１】
（付記１）
コンピュータに、
被検査プログラムに含まれる複数の条件分岐の各々に対応した条件式により前記被検査プログラムの経路が表されたパス条件から抽出された複数の前記条件式を、予め定めた規則に基づいて複数の集約条件式に集約し、
前記集約条件式の真偽値の組み合わせから、前記パス条件を表す真偽値の組み合わせと異なる真偽値の組み合わせで、且つ、前記集約条件式の真偽値の組み合わせとして矛盾のない真偽値の組み合わせを選択して新たなパス条件を取得し、
前記新たなパス条件及び前記被検査プログラムから抽出された前記パス条件に基づいて、前記被検査プログラムの動作を検証するテストケースを生成する
ことを含む処理を実行させるためのテストケース生成プログラム。
【０２６２】
（付記２）
前記新たなパス条件を取得する際、前記新たなパス条件に対応する前記集約条件式の何れかの真偽値が定まっていない場合で、且つ、前記集約条件式の真偽値の組み合わせから取得できる真偽値の組み合わせが存在しない場合は、前記集約条件式の各々が取る真偽値の組み合わせとして矛盾がない真偽値を、真偽値が定まっていない前記集約条件式の真偽値として設定し、前記新たなパス条件を取得する
付記１記載のテストケース生成プログラム。
【０２６３】
（付記３）
前記予め定めた規則は、前記被検査プログラムから抽出された前記パス条件の前記条件式に予め定めた演算子が含まれる場合、前記予め定めた演算子を論理的に逆の関係にある演算子に変更し、重複する前記条件式をまとめて前記集約条件式として集約する規則である
付記１又は付記２記載のテストケース生成プログラム。
【０２６４】
（付記４）
前記集約条件式の真偽値の組み合わせは、前記集約条件式から選択した２つの前記集約条件式の真偽値の組み合わせである
付記１〜付記３の何れか１項に記載のテストケース生成プログラム。
【０２６５】
（付記５）
コンピュータに、
被検査プログラムに含まれる複数の条件分岐の各々に対応した条件式により前記被検査プログラムの経路が表されたパス条件から抽出された複数の前記条件式を、予め定めた規則に基づいて複数の集約条件式に集約し、
前記集約条件式の真偽値の組み合わせから、前記パス条件を表す真偽値の組み合わせと異なる真偽値の組み合わせで、且つ、前記集約条件式の真偽値の組み合わせとして矛盾のない真偽値の組み合わせを選択して新たなパス条件を取得し、
前記新たなパス条件及び前記被検査プログラムから抽出された前記パス条件に基づいて、前記被検査プログラムの動作を検証するテストケースを生成する
ことを含む処理を実行させるためのプログラムを記録したコンピュータ読み取り可能な記録媒体。
【０２６６】
（付記６）
被検査プログラムに含まれる複数の条件分岐の各々に対応した条件式により前記被検査プログラムの経路が表されたパス条件から抽出された複数の前記条件式を、予め定めた規則に基づいて複数の集約条件式に集約する集約部と、
前記集約部により集約された前記集約条件式の真偽値の組み合わせから、前記パス条件を表す真偽値の組み合わせと異なる真偽値の組み合わせで、且つ、前記集約条件式の真偽値の組み合わせとして矛盾のない真偽値の組み合わせを選択して新たなパス条件を取得する取得部と、
前記取得部により取得された前記新たなパス条件及び前記被検査プログラムから抽出された前記パス条件に基づいて、前記被検査プログラムの動作を検証するテストケースを生成する生成部と、
を含むテストケース生成装置。
【０２６７】
（付記７）
前記取得部は、前記新たなパス条件を取得する際、前記新たなパス条件に対応する前記集約条件式の何れかの真偽値が定まっていない場合で、且つ、前記集約条件式の真偽値の組み合わせから取得できる真偽値の組み合わせが存在しない場合には、前記集約条件式の各々が取る真偽値の組み合わせとして矛盾がない真偽値を、真偽値が定まっていない前記集約条件式の真偽値として設定し、前記新たなパス条件を取得する
付記６記載のテストケース生成装置。
【０２６８】
（付記８）
前記予め定めた規則は、前記被検査プログラムから抽出された前記パス条件の前記条件式に予め定めた演算子が含まれる場合、前記予め定めた演算子を論理的に逆の関係にある演算子に変更し、重複する前記条件式をまとめて前記集約条件式として集約する規則である
付記６又は付記７記載のテストケース生成装置。
【０２６９】
（付記９）
前記集約条件式の真偽値の組み合わせは、前記集約条件式から選択した２つの前記集約条件式の真偽値の組み合わせである
付記６〜付記８の何れか１項に記載のテストケース生成装置。
【０２７０】
（付記１０）
被検査プログラムに含まれる複数の条件分岐の各々に対応した条件式により前記被検査プログラムの経路が表されたパス条件から抽出された複数の前記条件式を、予め定めた規則に基づいて複数の集約条件式に集約し、
前記集約条件式の真偽値の組み合わせから、前記パス条件を表す真偽値の組み合わせと異なる真偽値の組み合わせで、且つ、前記集約条件式の真偽値の組み合わせとして矛盾のない真偽値の組み合わせを選択して新たなパス条件を取得し、
前記新たなパス条件及び前記被検査プログラムから抽出された前記パス条件に基づいて、前記被検査プログラムの動作を検証するテストケースを生成する
ことを含むテストケース生成方法。
【符号の説明】
【０２７１】
１０   テストケース生成装置
１２   抽出部
１４   集約部
１６   取得部
２０   生成部
２２   被検査プログラム
２４   テストケース
４０   コンピュータ
４４   メモリ
４６   記憶部
５０   テストケース生成プログラム
【図１】
2015187756.tif 000003
【図２】
2015187756.tif 000004
【図３】
2015187756.tif 000005
【図４】
2015187756.tif 000006
【図５】
2015187756.tif 000007
【図６】
2015187756.tif 000008
【図７】
2015187756.tif 000009
【図８】
2015187756.tif 000010
【図９】
2015187756.tif 000011
【図１０】
2015187756.tif 000012
【図１１】
2015187756.tif 000013
【図１２】
2015187756.tif 000014
【図１３】
2015187756.tif 000015
【図１４】
2015187756.tif 000016
【図１５】
2015187756.tif 000017
【図１６】
2015187756.tif 000018
【図１７】
2015187756.tif 000019
【図１８】
2015187756.tif 000020
【図１９】
2015187756.tif 000021
【図２０】
2015187756.tif 000022
【図２１】
2015187756.tif 000023
【図２２】
2015187756.tif 000024
【図２３】
2015187756.tif 000025
【図２４】
2015187756.tif 000026
【図２５】
2015187756.tif 000027
【図２６】
2015187756.tif 000028
【図２７】
2015187756.tif 000029
【図２８】
2015187756.tif 000030
【図２９】
2015187756.tif 000031
【図３０】
2015187756.tif 000032
【図３１】
2015187756.tif 000033
【図３２】
2015187756.tif 000034
【図３３】
2015187756.tif 000035
【図３４】
2015187756.tif 000036
【図３５】
2015187756.tif 000037
【図３６】
2015187756.tif 000038
【図３７】
2015187756.tif 000039