(57)【特許請求の範囲】
【請求項１】
ソースコードに含まれる条件により分岐されて通過する処理経路の組み合わせで示される実行経路を、原子論理式を論理積で連結して形成される論理式により表した情報である経路条件情報を取得する取得部と、
前記経路条件情報を、１以上の原子論理式を含む論理式である目標論理式に、分解する分解部と、
前記分解された目標論理式を前記経路条件情報毎に関係付けた情報である経路分解情報を格納する分解格納部と、
前記目標論理式を格納する目標論理式格納部と、
前記分解格納部から前記経路分解情報を取得し、該取得した経路分解情報が前記目標論理式格納部に格納された前記目標論理式以外の目標論理式である差分の論理式を含む場合、該差分の論理式を抽出して前記目標論理式格納部に格納する抽出部と、
前記取得した経路条件情報から、前記差分の論理式が抽出された前記経路分解情報に対応する経路条件情報を選択する選択部と、
を備えることを特徴とする経路条件選択装置。
【請求項２】
前記目標論理式は、原子論理式であり、
前記分解部は、前記取得した経路条件情報を、原子論理式毎に分解し、
前記分解格納部は、前記分解された原子論理式を前記経路条件情報毎に関係付けた情報である経路分解情報を格納し、
前記目標論理式格納部は、前記目標論理式として前記原子論理式を格納し、
前記抽出部は、前記分解格納部から前記経路分解情報を取得し、該取得した経路分解情報に含まれる第１の原子論理式と、前記目標論理式格納部に格納された第２の原子論理式とを照合し、該第１の原子論理式が前記目標論理式格納部に格納された前記第２の原子論理式以外の原子論理式である場合、該第１の原子論理式を抽出して前記目標論理式格納部に格納し、
前記選択部は、前記取得した経路条件情報から、前記第１の原子論理式が抽出された前記経路分解情報に対応する経路条件情報を選択する
ことを特徴とする請求項１に記載の経路条件選択装置。
【請求項３】
前記処理経路は、複数の条件により決定される処理経路であり、
取得される前記経路条件情報は、該経路条件情報に含まれる前記原子論理式に、前記ソースコードにおける、該原子論理式に対応する前記条件が記述された位置を示す位置情報を含み、
前記分解部は、前記取得した経路条件情報に含まれる前記論理式を、前記位置情報毎に分解して前記原子論理式の組み合わせを得て、該原子論理式の組み合わせと該位置情報とを関係付け、
前記分解格納部は、前記位置情報を関係付けた原子論理式の組み合わせを前記経路条件情報毎に関係付けた情報である経路分解情報を格納し、
前記目標論理式格納部は、前記目標論理式として前記位置情報を関係付けた原子論理式の組み合わせを格納し、
前記抽出部は、前記分解格納部から前記経路分解情報を取得し、該取得した経路分解情報に含まれる原子論理式の組み合わせを示す第１の組み合わせと、前記目標論理式格納部に格納された原子論理式の組み合わせを示す第２の組み合わせであって該第１の組み合わせの位置情報と一致する位置情報と関係付けられた該第２の組み合わせとを照合し、該第１の組み合わせが前記目標論理式格納部に格納された前記第２の組み合わせ以外の原子論理式の組み合わせである場合、該第１の組み合わせを抽出して前記目標論理式格納部に格納し、
前記選択部は、前記取得した経路条件情報から、前記第１の組み合わせが抽出された経路分解情報に対応する経路条件情報を選択する
ことを特徴とする請求項１に記載の経路条件選択装置。
【請求項４】
前記経路条件選択装置は、さらに、
前記ソースコードから前記経路条件情報を生成すると共に、前記ソースコードに含まれる前記実行経路に応じて設定される変数に基づいて、該実行経路が特定の実行経路であるかを判定し、該実行経路が該特定の実行経路であると判定された場合、該実行経路が該特定の実行経路であるか否かを示す特定経路判定情報を、生成した該経路条件情報に付与する生成部と、
を備え、
前記抽出部は、前記分解格納部から前記特定の実行経路であることを示す前記特定経路判定情報を有する前記経路分解情報を取得し、取得した該経路分解情報が前記目標論理式格納部に格納された前記目標論理式以外の目標論理式である差分の論理式を含む場合、該差分の論理式を抽出して前記目標論理式格納部に格納した後、前記分解格納部から前記特定の実行経路でないことを示す前記特定経路判定情報を有する前記経路分解情報を取得し、該取得した経路分解情報が前記目標論理式格納部に格納された前記目標論理式以外の目標論理式である差分の論理式を含む場合、該差分の論理式を抽出して前記目標論理式格納部に格納する
ことを特徴とする請求項１に記載の経路条件選択装置。
【請求項５】
コンピュータに、
ソースコードに含まれる条件により分岐されて通過する処理経路の組み合わせで示される実行経路を、原子論理式を論理積で連結して形成される論理式により表した情報である経路条件情報を取得し、
前記経路条件情報を、１以上の原子論理式を含む論理式である目標論理式に、分解し、
前記分解された目標論理式を前記経路条件情報毎に関係付けた情報である経路分解情報を分解格納部に格納し、
前記分解格納部から前記経路分解情報を取得し、該取得した経路分解情報が前記目標論理式が格納された目標論理式格納部に格納された前記目標論理式以外の目標論理式である差分の論理式を含む場合、該差分の論理式を抽出して前記目標論理式格納部に格納し、
前記取得した経路条件情報から、前記差分の論理式が抽出された前記経路分解情報に対応する経路条件情報を選択する
処理を実行させる経路条件選択プログラム。
【請求項６】
前記目標論理式は、原子論理式であり、
前記経路条件情報を分解する場合、前記取得した経路条件情報を、原子論理式毎に分解し、該分解した原子論理式を前記経路条件情報毎に関係付けた情報である経路分解情報を前記分解格納部に格納し、
前記差分論理式を抽出する場合、前記分解格納部から前記経路分解情報を取得し、該取得した経路分解情報に含まれる第１の原子論理式と、前記目標論理式として前記原子論理式が格納された目標論理式格納部に格納された第２の原子論理式とを照合し、該第１の原子論理式が前記目標論理式格納部に格納された前記第２の原子論理式以外の原子論理式である場合、該第１の原子論理式を抽出して前記目標論理式格納部に格納し、
前記経路条件情報を選択する場合、前記取得した経路条件情報から、前記第１の原子論理式が抽出された前記経路分解情報に対応する経路条件情報を選択する
ことを特徴とする請求項５に記載の経路条件選択プログラム。
【請求項７】
前記処理経路は、複数の条件により決定される処理経路であり、
取得される前記経路条件情報は、該経路条件情報に含まれる前記原子論理式に、前記ソースコードにおける、該原子論理式に対応する前記条件が記述された位置を示す位置情報を含み、
前記経路条件情報を分解する場合、前記取得した経路条件情報に含まれる前記論理式を、前記位置情報毎に分解して前記原子論理式の組み合わせを得て、該原子論理式の組み合わせと該位置情報とを関係付け、前記位置情報を関係付けた原子論理式の組み合わせを前記経路条件情報毎に関係付けた情報である経路分解情報を前記分解格納部に格納し、
前記差分論理式を抽出する場合、前記分解格納部から前記経路分解情報を取得し、該取得した経路分解情報に含まれる原子論理式の組み合わせを示す第１の組み合わせと、前記目標論理式として前記位置情報を関係付けた原子論理式の組み合わせが格納された目標論理式格納部に格納された原子論理式の組み合わせを示す第２の組み合わせであって該第１の組み合わせの位置情報と一致する位置情報と関係付けられた該第２の組み合わせとを照合し、該第１の組み合わせが前記目標論理式格納部に格納された前記第２の組み合わせ以外の原子論理式の組み合わせである場合、該第１の組み合わせを抽出して前記目標論理式格納部に格納し、
前記経路条件情報を選択する場合、前記取得した経路条件情報から、前記第１の組み合わせが抽出された経路分解情報に対応する経路条件情報を選択する
ことを特徴とする請求項５に記載の経路条件選択プログラム。
【請求項８】
前記コンピュータに、さらに、
前記ソースコードから前記経路条件情報を生成すると共に、前記ソースコードに含まれる前記実行経路に応じて設定される変数に基づいて、該実行経路が特定の実行経路であるかを判定し、該実行経路が該特定の実行経路であると判定された場合、該実行経路が該特定の実行経路であるか否かを示す特定経路判定情報を、生成した該経路条件情報に付与する処理を実行させ、
前記差分論理式を抽出する場合、前記分解格納部から前記特定の実行経路であることを示す前記特定経路判定情報を有する前記経路分解情報を取得し、取得した該経路分解情報が前記目標論理式格納部に格納された前記目標論理式以外の目標論理式である差分の論理式を含む場合、該差分の論理式を抽出して前記目標論理式格納部に格納した後、前記分解格納部から前記特定の実行経路でないことを示す前記特定経路判定情報を有する前記経路分解情報を取得し、該取得した経路分解情報が前記目標論理式格納部に格納された前記目標論理式以外の目標論理式である差分の論理式を含む場合、該差分の論理式を抽出して前記目標論理式格納部に格納する
ことを特徴とする請求項５に記載の経路条件選択プログラム。
【請求項９】
コンピュータにより実行される経路条件選択方法であって、
前記コンピュータは、
入力装置により入力された、ソースコードに含まれる条件により分岐されて通過する処理経路の組み合わせで示される実行経路を、原子論理式を論理積で連結して形成される論理式により表した情報である経路条件情報を取得し、
前記経路条件情報を、１以上の原子論理式を含む論理式である目標論理式に、分解し、
前記分解された目標論理式を前記経路条件情報毎に関係付けた情報である経路分解情報を分解格納部に格納し、
前記分解格納部から前記経路分解情報を取得し、該取得した経路分解情報が前記目標論理式が格納された目標論理式格納部に格納された前記目標論理式以外の目標論理式である差分の論理式を含む場合、該差分の論理式を抽出して前記目標論理式格納部に格納し、
前記取得した経路条件情報から、前記差分の論理式が抽出された前記経路分解情報に対応する経路条件情報を選択し、
前記選択した経路条件情報を出力装置に出力する
処理を実行させる経路条件選択方法。
【請求項１０】
前記目標論理式は、原子論理式であり、
前記コンピュータは、
前記経路条件情報を分解する場合、前記取得した経路条件情報を、原子論理式毎に分解し、該分解した原子論理式を前記経路条件情報毎に関係付けた情報である経路分解情報を前記分解格納部に格納し、
前記差分論理式を抽出する場合、前記分解格納部から前記経路分解情報を取得し、該取得した経路分解情報に含まれる第１の原子論理式と、前記目標論理式として前記原子論理式が格納された目標論理式格納部に格納された第２の原子論理式とを照合し、該第１の原子論理式が前記目標論理式格納部に格納された前記第２の原子論理式以外の原子論理式である場合、該第１の原子論理式を抽出して前記目標論理式格納部に格納し、
前記経路条件情報を選択する場合、前記取得した経路条件情報から、前記第１の原子論理式が抽出された前記経路分解情報に対応する経路条件情報を選択する
ことを特徴とする請求項９に記載の経路条件選択方法。
【請求項１１】
前記処理経路は、複数の条件により決定される処理経路であり、
取得される前記経路条件情報は、該経路条件情報に含まれる前記原子論理式に、前記ソースコードにおける、該原子論理式に対応する前記条件が記述された位置を示す位置情報を含み、
前記コンピュータは、
前記経路条件情報を分解する場合、前記取得した経路条件情報に含まれる前記論理式を、前記位置情報毎に分解して前記原子論理式の組み合わせを得て、該原子論理式の組み合わせと該位置情報とを関係付け、前記位置情報を関係付けた原子論理式の組み合わせを前記経路条件情報毎に関係付けた情報である経路分解情報を前記分解格納部に格納し、
前記差分論理式を抽出する場合、前記分解格納部から前記経路分解情報を取得し、該取得した経路分解情報に含まれる原子論理式の組み合わせを示す第１の組み合わせと、前記目標論理式として前記位置情報を関係付けた原子論理式の組み合わせが格納された目標論理式格納部に格納された原子論理式の組み合わせを示す第２の組み合わせであって該第１の組み合わせの位置情報と一致する位置情報と関係付けられた該第２の組み合わせとを照合し、該第１の組み合わせが前記目標論理式格納部に格納された前記第２の組み合わせ以外の原子論理式の組み合わせである場合、該第１の組み合わせを抽出して前記目標論理式格納部に格納し、
前記経路条件情報を選択する場合、前記取得した経路条件情報から、前記第１の組み合わせが抽出された経路分解情報に対応する経路条件情報を選択する
ことを特徴とする請求項９に記載の経路条件選択方法。
【請求項１２】
前記コンピュータは、さらに、
前記ソースコードから前記経路条件情報を生成すると共に、前記ソースコードに含まれる前記実行経路に応じて設定される変数に基づいて、該実行経路が特定の実行経路であるかを判定し、該実行経路が該特定の実行経路であると判定された場合、該実行経路が該特定の実行経路であるか否かを示す特定経路判定情報を、生成した該経路条件情報に付与する処理を実行し、
前記差分論理式を抽出する場合、前記コンピュータは、前記分解格納部から前記特定の実行経路であることを示す前記特定経路判定情報を有する前記経路分解情報を取得し、取得した該経路分解情報が前記目標論理式格納部に格納された前記目標論理式以外の目標論理式である差分の論理式を含む場合、該差分の論理式を抽出して前記目標論理式格納部に格納した後、前記分解格納部から前記特定の実行経路でないことを示す前記特定経路判定情報を有する前記経路分解情報を取得し、該取得した経路分解情報が前記目標論理式格納部に格納された前記目標論理式以外の目標論理式である差分の論理式を含む場合、該差分の論理式を抽出して前記目標論理式格納部に格納する
ことを特徴とする請求項９に記載の経路条件選択方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本技術は、プログラムの動作をテストするためのテストケースを選択する技術に関する。
【背景技術】
【０００２】
業務システムが仕様通りに設計されているかを検証するためにテストが行われる。そのようなテストは、業務仕様（業務として意味のある項目間の関係や変化）に関するチェックや、境界値テスト等のプログラムのエラーがデータの境界で起こりやすいという経験則からのチェックなど、様々な観点より行われる。そのため、チェック内容に応じて、１つの業務仕様に対して複数のテストデータが用意される。
【０００３】
業務仕様からテストデータを自動的に生成するための技術として、テストしたい状況が表現された制約式（画面、データベース（DB）項目やプログラム変数を用いた論理式）の充足可能性判定問題を解くことで充足値をテストデータとして用いる技術がある。
【０００４】
ところで、プログラムのテストを行う際のテストデータを作成する技術の１つに、シンボリック実行（symbolic execution）がある。シンボリック実行とは、変数を具体的な値としてではなく、シンボル値という値を１つに特定しないで実行する仕組みをいう。シンボリック実行では、ある一連の遷移についてその遷移を流れることになるテストデータを、そのプログラムが取り得る一連の遷移の各々について作成することができる。
【先行技術文献】
【特許文献】
【０００５】
【特許文献１】特開２０１１−１３７９７号公報
【特許文献２】特開２０１１−８１６５３号公報
【特許文献３】特開２０１１−８５９６７号公報
【特許文献４】特開平１０−３２０１９０号公報
【特許文献５】特開２００９−０３２１３３号公報
【特許文献６】特開２００３−２０２９８５号公報
【発明の概要】
【発明が解決しようとする課題】
【０００６】
しかしながら、テストにおいて、前段の処理経路とは関係なく、処理経路の確認を行えばよい場合でも、全ての処理経路を実行するまで、テストケースを逐次実行している。例えば、テストケース１とテストケース２とを行うことで、テストケース３で実行される処理経路を全て通るので、テスト内容によっては、テストケース３を行なわなくてもよい場合がある。しかし、そのような場合でも、テストケース１とテストケース２とを行うだけでなく、テストケース３をも逐次実行していた。
【０００７】
そこで、シンボリック実行により生成されるテストケースから冗長なくテストケースを選択する技術を提供する。
【課題を解決するための手段】
【０００８】
経路条件選択装置は、取得部、分解部、分解格納部、目標論理式格納部、抽出部、選択部を含む。取得部は、ソースコードに含まれる条件により分岐されて通過する処理経路の組み合わせで示される実行経路を、原子論理式を論理積で連結して形成される論理式により表した情報である経路条件情報を取得する。分解部は、経路条件情報を、１以上の原子論理式を含む論理式である目標論理式に、分解する。分解格納部は、分解された目標論理式を経路条件情報毎に関係付けた情報である経路分解情報を格納する。目標論理式格納部は、目標論理式を格納する。抽出部は、分解格納部から経路分解情報を取得する。抽出部は、取得した経路分解情報が目標論理式格納部に格納された目標論理式以外の目標論理式である差分の論理式を含む場合、差分の論理式を抽出して目標論理式格納部に格納する。選択部は、取得した経路条件情報から、差分の論理式が抽出された経路分解情報に対応する経路条件情報を選択する。
【発明の効果】
【０００９】
本実施形態の１つの観点によれば、シンボリック実行により生成されるテストケースから冗長なくテストケースを選択することができる。
【図面の簡単な説明】
【００１０】
【図１】ソースコードの一例である。
【図２】シンボリック実行によるテストケース生成を説明するための図である。
【図３】本実施形態における経路条件選択装置の一例を示す。
【図４】第１の実施形態を説明するための図である。
【図５】第１の実施形態におけるテストケース選択装置の構成の一例を示す。
【図６】図１のソースコードに対してシンボリック実行をした結果得られた、入力情報としてのパスコンディション情報の一例を示す。
【図７】第１の実施形態におけるパスコンディションテーブルの一例を示す。
【図８】第１の実施形態における原子論理式テーブルの一例を示す。
【図９】図８の原子論理式テーブルにデータ項目「選択」１９３を追加した一例を示す。
【図１０】第１の実施形態における目標論理式テーブルの一例を示す。
【図１１】第１の実施形態における選択パスコンディションテーブルの一例を示す。
【図１２】第１の実施形態におけるテストケース選択フロー（その１）の一例を示す。
【図１３】第１の実施形態におけるテストケース選択フロー（その２）の一例を示す。
【図１４】第１の実施形態におけるテストケース選択フロー（その３）の一例を示す。
【図１５】第２の実施形態を説明するための図（その１）である。
【図１６】第２の実施形態を説明するための図（その２）である。
【図１７】第２の実施形態におけるテストケース選択装置の構成の一例を示す。
【図１８】第２の実施形態におけるソースコードの一例を示す。
【図１９】図１８のソースコードに対してシンボリック実行をした結果得られた、入力情報としてのパスコンディション情報の一例を示す。
【図２０】第２の実施形態におけるパスコンディションテーブルの一例を示す。
【図２１】第２の実施形態における行番号テーブルを示す。
【図２２】第２の実施形態における組み合わせテーブルの一例を示す。
【図２３】図２２の組み合わせテーブルにデータ項目「選択」３２３を追加した一例を示す。
【図２４】第２の実施形態における目標論理式テーブルの一例を示す。
【図２５】第２の実施形態における選択パスコンディションテーブルの一例を示す。
【図２６】第２の実施形態におけるテストケース選択フロー（その１）の一例を示す。
【図２７】第２の実施形態におけるテストケース選択フロー（その２）の一例を示す。
【図２８】第２の実施形態におけるテストケース選択フロー（その３）の一例を示す。
【図２９】第２の実施形態におけるテストケース選択フロー（その４）の一例を示す。
【図３０】第２の実施形態におけるテストケース選択フロー（その５）の一例を示す。
【図３１】テスト対象プログラムのソースコードの一例を示す。
【図３２】図３１のテスト対象プログラムのフローチャートを示す。
【図３３】（Ａ）シンボリック実行により得られるテストケース、（Ｂ）第１の実施形態を用いて選択されたテストケースを示す。
【図３４】第３の実施形態（実施例１）におけるテストケース選択装置の構成の一例を示す。
【図３５】第３の実施形態（実施例１）におけるドライバ変更部の処理を説明するための図である。
【図３６】第３の実施形態（実施例１）におけるシンボリック実行により得られるテストケース（パスコンディション）の一例を示す。
【図３７】第３の実施形態（実施例１）におけるテストケース調整部の処理を説明するための図である。
【図３８】第３の実施形態（実施例１）における選択パスコンディションテーブルの一例を示す。
【図３９】第３の実施形態（実施例１）におけるテストケース選択フローの一例を示す。
【図４０】第３の実施形態（実施例２）におけるテストケース選択装置の構成の一例を示す。
【図４１】第３の実施形態（実施例２）における原子論理式テーブルの一例を示す。
【図４２】第３の実施形態（実施例２）におけるテストケース選択フローの一例を示す。
【図４３】第１〜第３の実施形態を適用したコンピュータのハードウェア環境の構成ブロック図である。
【発明を実施するための形態】
【００１１】
図１は、ソースコードの一例である。図２は、シンボリック実行によるテストケース生成を説明するための図である。シンボリック実行は、そのプログラムに含まれる変数に具体的な数値を入力する代わりに、数値を代表するシンボルでプログラムを模擬的に実行し、その結果を評価する技術である。プログラムにおいてシンボル値が分岐等の判定条件に利用された場合、シンボリック実行を行うと、論理的に可能なシンボル値の組み合わせを加味しながらプログラムが実行される（シンボリック実行ツリーの生成）。
【００１２】
例えば、図１に示すようなソースコードをシンボリック実行する場合を考える。図１のソースコードでは、２つのｉｆ文が記述されている。図１のソースコードについてシンボリック実行を行う。すると、変数a、ｂ、ｃの値に対応するシンボル値Sa、Sb、Scについて、図２に示すように、シンボリック実行ツリーが生成される。例えば、図１に記述されたコード「a >= 0  & a <= 5」は、「Sa >= 0  ∧ Sa <= 5」で表される。また、図１に記述されたコード「b>0 & c > 0」は、「Sb>0 ∧ Sc > 0」で表される。
【００１３】
シンボリック実行ツリーにおいて判定条件より分岐する経路は、シンボリック実行で代入文や条件文などを通過したときに満たすべき論理的な制約（すなわちパスコンディション）を表している。シンボリック実行では、パスコンディションを代入文や条件文などを通過する毎に積み上げる処理を行う。
【００１４】
シンボリック実行ツリー内の根（ルート）から葉（リーフ）までの経路を実行パスという。実行パスは、各シンボルに対する条件（パスコンディション）を有している。例えば、図２のシンボリックツリーにおいて、実行パスＰのパスコンディション（破線で囲まれた部分）は、「Sa >= 0  ∧ Sa <= 5 ∧ Sb>0 ∧ Sc > 0」で示される。
【００１５】
このようなシンボリック実行の後に、パスコンディションが充足可能か否かの判定は、例えばＳＡＴ（satisfiability）又はＳＭＴ（satisfiability modulo theory）ソルバを利用して行われる。なお、シンボリック実行は、ＪＰＦ（Java（登録商標） Path Finder）などのモデル検査エンジンと組み合わせて使用される場合もある。
【００１６】
ここで、実行パスは、テストケースとして示すことができる。また、パスコンディション内のシンボル値の充足値は、テストデータとして示すことができる。このように、シンボリック実行を用いることにより、論理的に可能なパスコンディションの組み合わせの範囲でテストケースのバリエーションを生成することができる。
【００１７】
そこで、シンボリック実行では、条件分岐においてその充足可能な全ての実行パスを自動的に発生させて、プログラムの網羅的な実行を可能としている。このとき、主に冗長で膨大になりがちなテストケース自動生成技術により生成されたテストケースから、ある観点・価値（コードカバレッジ、類似性等）に基づきテストケースを選択し、テストケース数を削減することが要求される。
【００１８】
コードカバレッジには、たとえば、ステートメントカバレッジ、ブランチカバレッジ、条件カバレッジ、マルチ条件カバレッジ、パスカバレッジ等がある。シンボリック実行により生成されるテストケースはパスカバレッジに基づくものである。
【００１９】
しかしながら、シンボリック実行は、上述したように、実行可能な全てのパスコンディションを生成するため、パスコンディションの組み合わせが膨大になる。その結果、パスカバレッジに基づくテストケースの数も膨大になる。
【００２０】
したがって、より現実的なケース数となるようにテストケースを選択することが求められる。あるコードカバレッジを満たすようなテストケースを選択するためには、テストケースを１つずつ実際に実行しながら、カバレッジ測定装置を用いてあるカバレッジを満たした時点のテストケースの集合を選択したケースとする方法が考えられる。
【００２１】
ところが、その方法では、テストケースを１つずつ実際に実行してみないとカバレッジを測定することができないため、テストケースを絞り込んでおくことが望まれる。このように、テストケースの絞込みの精度が実際に実行する順番に大きく依存する。つまり、その絞り込んだテストケースの集合には、冗長なテストケースを多く含む可能性があり、十分なテストケースの削減をすることが難しい。
そこで、冗長なテストケースを排除して、テストケースを選択するテストケース選択技術を提供する。
【００２２】
図３は、本実施形態における経路条件選択装置の一例を示す。経路条件選択装置１は、取得部２、分解部３、抽出部４、選択部５、分解格納部６、目標論理式格納部７を含む。
取得部２は、経路条件情報（パスコンディション）を取得する。経路条件情報は、ソースコードに含まれる条件により分岐されて通過する処理経路の組み合わせで示される実行経路を、原子論理式を論理積で連結して形成される論理式により表した情報である。取得部２の一例としては、取得部１３が挙げられる。
【００２３】
分解部３は、経路条件情報を、１以上の原子論理式を含む論理式である目標論理式に、分解する。分解部３の一例としては、分解部１４，１４ａが挙げられる。
分解格納部６は、分解された目標論理式を経路条件情報毎に関係付けた情報である経路分解情報を格納する。分解格納部６の一例としては、原子論理式テーブル１９、組み合わせテーブル３２が挙げられる。
【００２４】
目標論理式格納部７は、目標論理式を格納する。目標論理式格納部７の一例としては、目標論理式テーブル２０，３３が挙げられる。
抽出部４は、分解格納部６から経路分解情報を取得する。抽出部４は、取得した経路分解情報が目標論理式格納部７に格納された目標論理式以外の目標論理式である差分の論理式を含む場合、差分の論理式を抽出して目標論理式格納部７に格納する。抽出部４の一例としては、抽出部１５，１５ａが挙げられる。
【００２５】
選択部５は、取得した経路条件情報から、差分の論理式が抽出された経路分解情報に対応する経路条件情報を選択する。選択部５の一例としては、選択部１６が挙げられる。
【００２６】
ここで、目標論理式が原子論理式である場合、次の処理が行われる。分解部３は、取得した経路条件情報を、原子論理式毎に分解する。分解格納部６は、分解された原子論理式を経路条件情報毎に関係付けた情報である経路分解情報を格納する。目標論理式格納部７は、目標論理式として原子論理式を格納する。抽出部４は、分解格納部から経路分解情報を取得する。抽出部４は、取得した経路分解情報に含まれる第１の原子論理式と、目標論理式格納部に格納された第２の原子論理式とを照合する。抽出部４は、第１の原子論理式が目標論理式格納部７に格納された第２の原子論理式以外の原子論理式である場合、第１の原子論理式を抽出して目標論理式格納部７に格納する。選択部５は、取得した経路条件情報から、第１の原子論理式が抽出された経路分解情報に対応する経路条件情報を選択する。
【００２７】
このように構成することにより、コンディションカバレッジに関するテストのために、シンボリック実行により生成されるテストケースから、冗長のないテストケースを選択することができる。
【００２８】
また、処理経路が複数の条件により決定される処理経路であってもよい。この場合、取得される経路条件情報は、該経路条件情報に含まれる原子論理式に、ソースコードにおける、原子論理式に対応する条件が記述された位置を示す位置情報を含む。分解部３は、取得した経路条件情報に含まれる論理式を、位置情報毎に分解して原子論理式の組み合わせを得て、原子論理式の組み合わせと位置情報とを関係付ける。分解格納部６は、位置情報を関係付けた原子論理式の組み合わせを経路条件情報毎に関係付けた情報である経路分解情報を格納する。目標論理式格納部７は、目標論理式として位置情報を関係付けた原子論理式の組み合わせを格納する。抽出部４は、分解格納部６から経路分解情報を取得する。抽出部４は、取得した経路分解情報に含まれる原子論理式の組み合わせを示す第１の組み合わせと、目標論理式格納部に格納された原子論理式の組み合わせを示す第２の組み合わせを照合する。ここで、該第２の組み合わせは、第１の組み合わせの位置情報と一致する位置情報と関係付けられた原子論理式の組み合わせである。抽出部４は、第１の組み合わせが目標論理式格納部７に格納された第２の組み合わせ以外の原子論理式の組み合わせである場合、第１の組み合わせを抽出して目標論理式格納部７に格納する。選択部５は、取得した経路条件情報から、第１の組み合わせが抽出された経路分解情報に対応する経路条件情報を選択する。
【００２９】
このように構成することにより、マルチコンディションカバレッジに関するテストのために、シンボリック実行により生成されるテストケースから、冗長のないテストケースを選択することができる。
【００３０】
経路条件選択装置１は、さらに、生成部８を含む。生成部８は、ソースコードから経路条件情報を生成する。これと共に、生成部８は、ソースコードに含まれる実行経路に応じて設定される変数に基づいて、実行経路が特定の実行経路であるかを判定する。生成部８は、実行経路が該特定の実行経路であると判定された場合、実行経路が特定の実行経路であるか否かを示す特定経路判定情報を、生成した経路条件情報に付与する。生成部８の一例としては、ソースコード４０について、ドライバ変更部４２により上記所定のコードが組み込まれたシンボリック実行用のドライバを用いて、シンボリック実行を行うテストケース生成部４３が挙げられる。
【００３１】
この場合、抽出部４は、分解格納部６から特定の実行経路であることを示す特定経路判定情報を有する経路分解情報を取得する。抽出部４は、取得した経路分解情報が目標論理式格納部７に格納された目標論理式以外の目標論理式である差分の論理式を含む場合、差分の論理式を抽出して目標論理式格納部７に格納する。その後、抽出部４は、分解格納部６から特定の実行経路でないことを示す特定経路判定情報を有する経路分解情報を取得する。抽出部４は、取得した経路分解情報が目標論理式格納部７に格納された目標論理式以外の目標論理式である差分の論理式を含む場合、差分の論理式を抽出して目標論理式格納部７に格納する。
【００３２】
このように構成することにより、シンボリック実行により生成されるテストケースから、特定のテストケースを選択しつつ、冗長なくテストケースを選択することができる。
【００３３】
＜第１の実施形態＞
第１の実施形態では、シンボリック実行により生成されるパスコンディション（テストケース）を原子論理式に分解して、パスコンディションに含まれる全種類の原子論理式を実行できるようにパスコンディション（テストケース）を選択する。このとき、テストケースの選択に際して、既に選択したいずれのパスコンディションにも含まれていない原子論理式を含むパスコンディションを選択する。ここで、原子論理式とは、論理式の最小単位（単独の条件）またはその否定である。論理式とは、条件（事前条件または事後条件）を表す式である。論理式の否定とは、論理式にＮＯＴを結合した論理式である。
【００３４】
図４は、第１の実施形態を説明するための図である。テストケース選択装置は、各テストケースが有するパスコンディションを解析することで、テストケースを実際に実行することなく、全テストケースから、あるカバレッジを満たすテストケースを探す。すなわち、テストケース選択装置は、パスコンディションに含まれる原子論理式をプログラム上の条件式として、各パスコンディションが全種類の原子論理式（もしくはその組み合わせ）のうちどれだけの原子論理式を充足したかをパスコンディション上で解析する。コードカバレッジは、プログラム中の条件式内の原子条件と密接な関係がある。ここで、原子条件とは、原子論理式に対応するソースコード上の条件である。
【００３５】
図４の表は、シンボリック実行により得られたパスコンディション（テストケース）を原子論理式に分解してテーブル化したものである。図４の表の列方向には、パスコンディション上の原子論理式が並べられている。例えば、原子論理式「Sa≧0」は、図１のソースコード上の原子条件「a >= 0」に対応する。テストケース１が「Sa ≧ ０ Sa≦５∧ Sb>0 ∧ Sc > 0」であると、図４の表では、テストケース１に対応する「Sa ≧ ０」、「Sa≦５」、「Sb>0」、「Sc > 0」に「〇」が付されている。
【００３６】
まず、テストケース１を選択する。テストケース１には、上述の通り、原子論理式「Sa ≧ ０」、「Sa≦５」、「Sb>0」、「Sc > 0」を含む。
次にテストケース２に着目する。テストケース２では、テストケース１に含まれない原子論理式「¬（Sb > ０）」を含むので、テストケース２を選択する。
【００３７】
次にテストケース３に着目する。テストケース３では、テストケース１及び２のいずれにも含まれない原子論理式「¬（Sc > ０）」を含むので、テストケース３を選択する。
次にテストケース４に着目する。テストケース４に含まれる原子論理式はいずれも、テストケース１，２，３のいずれかに含まれるものなので、テストケース４については選択しない。
【００３８】
次にテストケース５に着目する。テストケース５では、テストケース１〜４のいずれにも含まれない原子論理式「¬（Sa ≧ ０）」を含むので、テストケース５を選択する。
テストケース６以降についても同様に、着目しているテストケースがそれまでに選択したテストケースに含まれる原子論理式と異なる原子論理式を含む場合に、その着目しているテストケースを選択する。そうすると、図４の表の場合には、１２個のテストケースから５個のテストケース１，２，３，５，９が選択される。これにより、テストケース１，２，３，５，９を用いれば、全パスコンディションの原子論理式を全て充足することができるテストを実行することができる。
【００３９】
図５は、第１の実施形態におけるテストケース選択装置の構成の一例を示す。テストケース選択装置１１は、制御部１２、記憶部２２を含む。記憶部２２は、パスコンディションテーブル１８、原子論理式テーブル１９、目標論理式テーブル２０、選択パスコンディションテーブル２１を含む。
【００４０】
パスコンディションテーブル１８には、ソースコードについてシンボリック実行を行うことにより得られた実行パスの組み合わせ、すなわちパスコンディションの組み合わせ（テストケース）が格納される。原子論理式テーブル１９には、パスコンディション毎に、パスコンディションに含まれる原子論理式が格納される。目標論理式テーブル２０には、パスコンディションを構成する原子論理式が種類毎に格納される。選択パスコンディションテーブル２１には、パスコンディションテーブル１５に含まれるパスコンディションのうち、選択部１６により選択されたパスコンディションが格納される。
【００４１】
制御部１２は、取得部１３、分解部１４、抽出部１５、選択部１６、出力部１７を含む。取得部１３は、入力装置（不図示）により、ソースコードに対してシンボリック実行を行うことにより得られたパスコンディション情報（テストケース）１０を取得し、パスコンディションテーブル１８に格納する。
【００４２】
分解部１４は、パスコンディションテーブル１８に格納した各パスコンディションを原子論理式に分解する。分解部１４は、その原子論理式を、パスコンディション毎に、原子論理式テーブル１９に格納する。
【００４３】
抽出部１５は、原子論理式テーブル１９において、着目しているパスコンディションの原子論理式から、目標論理式テーブル２０にそれまでに保持した原子論理式以外の原子論理式を抽出する。抽出部１５は、その抽出した原子論理式を目標論理式テーブル２０に格納する。また、抽出部１５は、その抽出された原子論理式を含んでいたパスコンディションを特定するために、原子論理式テーブル１９において、そのパスコンディションにフラグを立てる。
【００４４】
選択部１６は、原子論理式テーブル１９から、フラグの立っているパスコンディションを検出する。選択部１６は、パスコンディションテーブル１８から、その検出したパスコンディションに対応するパスコンディションを選択し、選択パスコンディションテーブル２１に格納する。
【００４５】
出力部１７は、選択パスコンディションテーブル２１に格納したパスコンディション１０ａをディスプレイ、プリンタ等の出力装置に出力する。
取得部１３、分解部１４、抽出部１５、選択部１６の機能について、図６〜図１１を用いてさらに詳述する。
【００４６】
図６は、図１のソースコードに対してシンボリック実行をした結果得られた、入力情報としてのパスコンディション情報の一例を示す。図６では、図２で説明したように、シンボリック実行により、パスコンディション１〜１２（pc1〜pc12）で示される１２個のパスコンディション情報１０が得られたとする。パスコンディション情報１０において、pc1〜pc12は、パスコンディションを識別する識別情報である。
【００４７】
図７は、第１の実施形態におけるパスコンディションテーブルの一例を示す。パスコンディションテーブル１８は、データ項目「No.」１８１、「パスコンディション」１８２を含む。「No.」１８１には、パスコンディションを識別する情報に対応するNo.が格納される。「パスコンディション」１０２には、「No.」１８１に格納されたNo.に対応するパスコンディション情報が格納される。
【００４８】
ここで、パスコンディションテーブル１８に関する取得部１３の動作について説明する。取得部１３は、入力装置により入力されたパスコンディション情報１０を取得し、パスコンディションテーブル１８に格納する。
【００４９】
図８は、第１の実施形態における原子論理式テーブルの一例を示す。原子論理式テーブル１９は、データ項目「No.」１９１、「原子論理式」１９２を含む。「No.」１９１には、パスコンディションの識別情報に対応するNo.が格納される。「原子論理式」１０２には、「No.」１９１に格納されたNo.に対応するパスコンディション情報に含まれる原子論理式が格納される。
【００５０】
ここで、原子論理式テーブル１９に関する分解部１４の動作について説明する。分解部１４は、パスコンディションテーブル１８からパスコンディション情報を読み出し、読み出したパスコンディション情報を原子論理式に分解する。分解部１４は、その原子論理式を、パスコンディション毎に、原子論理式テーブル１９に格納する。
【００５１】
図９は、図８の原子論理式テーブルにデータ項目「選択」１９３を追加した一例を示す。図１０は、第１の実施形態における目標論理式テーブルの一例を示す。目標論理式テーブル２０には、原子論理式テーブル１９において、着目しているパスコンディションに含まれる原子論理式のうち、それまでに保持した原子論理式以外の原子論理式が保持される。これにより、目標論理式テーブル２０には、最終的に、原子論理式テーブル１９に含まれる全ての種類の原子論理式が格納される。すなわち、目標論理式テーブル２０には、最終的に、全パスコンディションに含まれる原子論理式が種類毎に格納される。
【００５２】
ここで、目標論理式テーブル２０に関する抽出部１５の動作について説明する。抽出部１５は、原子論理式テーブル１９において、着目しているパスコンディションの原子論理式から、目標論理式テーブル２０に保持されていない原子論理式を抽出する。抽出部１５は、その抽出した原子論理式を目標論理式テーブル２０に格納する。また、抽出部１５は、原子論理式テーブル１９において、その抽出された原子論理式を含んでいたパスコンディションに対応する「選択」１９３にフラグ（選択フラグ）を立てる。
【００５３】
図１１は、第１の実施形態における選択パスコンディションテーブルの一例を示す。選択部１６は、原子論理式テーブル１９から、フラグの立っているパスコンディションを検出する。選択部１６は、パスコンディションテーブル１８から、その検出したパスコンディションに対応するパスコンディションを選択し、選択パスコンディションテーブル２１に格納する。
【００５４】
図１２−図１４は、第１の実施形態におけるテストケース選択フローの一例を示す。ユーザは、シンボリック実行により得られたパスコンディションを、入力装置を用いて、テストケース選択装置１１に入力する。取得部１３は、その入力されたパスコンディションを取得し、パスコンディションテーブル１８に格納する（Ｓ１）。
【００５５】
分解部１４は、パスコンディションテーブル１８からレコードを読み出す（Ｓ３）。分解部１４は、読み出したレコードのパスコンディションに原子論理式が存在するか否かを判定する（Ｓ４）。読み出したレコードのパスコンディションに原子論理式が存在する場合（Ｓ４で「Ｙｅｓ」）、分解部１４はそのレコードのパスコンディションに含まれる原子論理式を取り出し、原子論理式テーブル１９に格納する（Ｓ５）。そのレコードのパスコンディションから全ての原子論理式を取り出し終わるまで、分解部１４はＳ５の処理を繰り返す。
【００５６】
読み出したレコードのパスコンディションに原子論理式が存在しない場合（Ｓ４で「Ｎｏ」）、パスコンディションテーブル１８に未処理のレコードが存在すれば（Ｓ２で「Ｙｅｓ」）、分解部１４は、次の処理を行う。すなわち、分解部１４は、パスコンディションテーブル１８から次のレコードを読み出し、Ｓ３〜Ｓ５の処理を行う。パスコンディションテーブル１８に未処理のレコードが存在しなければ（Ｓ２で「Ｎｏ」）、図１３のＳ６の処理へ処理が遷移する。
【００５７】
次に、原子論理式テーブル１９に、Ｓ７〜Ｓ１０の処理について未処理のレコードが存在する場合、抽出部１５は、原子論理式テーブル１９からレコードを読み出す（Ｓ７）。抽出部１５は、Ｓ７で読み出したレコードに含まれる原子論理式のうち、目標論理式テーブル２０に存在しない原子論理式が存在するか否かを判定する（Ｓ８）。
【００５８】
Ｓ７で読み出したレコードに含まれる原子論理式のうち、目標論理式テーブル２０に存在しない原子論理式（差分）が存在する場合、抽出部１５は、その差分の原子論理式を目標論理式テーブル２０に追加する（Ｓ９）。このとき、抽出部１５は、原子論理式テーブル１９において、読み出したレコードのデータ項目「選択」１９３にフラグを立てる。
【００５９】
一方、Ｓ８において、読み出したレコードに含まれる全ての原子論理式が目標論理式テーブル２０に存在する場合（Ｓ８で「Ｎｏ」）、または、Ｓ１０の処理が終了した場合、処理がＳ６へ戻る。原子論理式テーブル１９に未処理のレコードが存在する間（Ｓ６で「Ｙｅｓ」）、抽出部１５は、原子論理式テーブル１９から次のレコードを読み出し、Ｓ７〜Ｓ１０の処理を行う。原子論理式テーブル１９に未処理のレコードが存在しない間（Ｓ６で「Ｎｏ」）、図１４のＳ１１の処理へ処理が遷移する。
【００６０】
次に、原子論理式テーブル１９にＳ１２〜Ｓ１４について未処理のレコードが存在する場合、選択部１６は、原子論理式テーブル１９からレコードを読み出す（Ｓ１２）。選択部１６は、その読み出したレコードの選択フラグが立っているか否かを判定する（Ｓ１３）。
【００６１】
Ｓ１３において、その読み出したレコードの選択フラグが立っていると判定した場合（Ｓ１３で「Ｙｅｓ」）、選択部１６は、パスコンディションテーブル１８から、選択フラグの立っているレコードと同じNo.のパスコンディションを取得する。選択部１６は、その取得したパスコンディションを選択パスコンディションテーブル２１に追加する（Ｓ１４）。
【００６２】
Ｓ１３において、対象レコードの選択フラグが立っていないと判定した場合（Ｓ１３で「Ｎｏ」）、または、Ｓ１４の処理が終了した場合、処理がＳ１１へ戻る。原子論理式テーブル１９にＳ１２〜Ｓ１４の処理について未処理のレコードが存在する間（Ｓ１１で「Ｙｅｓ」）、抽出部１５は、原子論理式テーブル１９から次のレコードを読み出し（Ｓ１２）、Ｓ１３〜Ｓ１４の処理を行う。原子論理式テーブル１９の全レコードについて処理が完了すれば（Ｓ１１で「Ｎｏ」）、本フローは終了する。
【００６３】
本実施形態によれば、テストケースの選択において、目標論理式テーブル内に含まれる原子論理式（全パスコンディションを構成する全ての原子論理式の種類の集合）から構成されるテストケースを選択しないようにすることができる。これにより、冗長なテストケースを排除することができる。そのため、目標論理式テーブル内に含まれる原子論理式から構成されるテストケースが多いほど、テストケースを１つずつ実行しながらカバレッジ測定する方法よりもテストケース数を削減することができる。つまり、シンボリック実行により得られたテストケース数が多いほど、テストケース数の削減率が向上する。
【００６４】
＜第２の実施形態＞
第１の実施形態では、パスコンディションを全てＡＮＤ部分で分割して原子論理式に分解し、パスコンディションの選択の際、既に選択したパスコンディションに含まれていない原子論理式を含むパスコンディションを選択した。それに対して、第２の実施形態では、一定の論理式については複数の原子論理式の集合（部分論理式）で取り扱い、パスコンディションの選択の際、既に選択したパスコンディションに含まれていない部分論理式を含むパスコンディションを選択する。ここで、部分論理式は、プログラムの変数に関係演算を適用した項（プログラム変数に関する述語）を論理的に組み合わせた論理式である。部分論理式の一例としては、図１の「a >= 0 & a <= 5」が挙げられる。部分論理式「a >= 0 & a <= 5」は、「a >= 0」の項と「a <= 5」の項とを論理的に組み合わせた論理式である。
【００６５】
１つの変数の値によって分岐先を決定するのではなく、複数の変数の組み合わせで分岐先が決まることをマルチ条件という。プログラムの分岐条件がマルチ条件である場合、その分岐条件の要素の条件を個別に判定をできるようにするために、次の処理が行われる。つまり、分岐の判断となる「一連の条件」に関しては、AND部分があっても分割をしないようにする。ここで、「一連の条件」となるかの判断は、一連の条件は元のプログラムのソースコードで同じ行など近接に記載をされることから、例えば、行番号から判断をすることができる。行番号は、シンボリック実行においてパスコンディションに、元プログラムのソースコードにおける行番号を付与して出力を行うことにより取得することができる。
【００６６】
図１５及び図１６は、第２の実施形態を説明するための図である。第２の実施形態では、達成したいコードカバレッジに応じた、テストケースが充足すべき目標となる部分論理式の集合を抽出し、その部分論理式を有するパスコンディションを選択する。全種類の部分論理式を充足するまでパスコンディションが選択される。ただし、パスコンディションの選択の際、既に選択したパスコンディションに含まれていない部分論理式を含むパスコンディションが選択される。
【００６７】
図１５（Ａ）は、シンボリック実行により生成されたパスコンディションの集合（テストケースの集合）を示す。図１５（Ｂ）は、テストケースが充足すべき目標となる部分論理式の集合（目標部分論理式集合）であるとする。
【００６８】
図１６の表は、シンボリック実行により得られたテストケース毎のパスコンディションを目標部分論理式毎に分解してテーブル化したものである。図１６の表の列方向には、パスコンディション上の目標部分論理式集合が並べられている。
【００６９】
まず、テストケース１を選択する。テストケース１には、目標部分論理式「(Sa ≧ 0)∧(Sa ≦ 5)」、「(Sb > 0) ∧ (Sc > 0)」を含む。
次にテストケース２に着目する。テストケース２では、テストケース１に含まれない目標部分論理式「¬(Sb > 0) ∧ (Sc > 0)」を含むので、テストケース２を選択する。
【００７０】
次にテストケース３に着目する。テストケース３では、テストケース１及び２のいずれにも含まれない目標部分論理式「(Sb > 0) ∧ ¬(Sc > 0)」を含むので、テストケース３を選択する。
【００７１】
次にテストケース４に着目する。テストケース４では、テストケース１〜３のいずれにも含まれない目標部分論理式「¬(Sb > 0) ∧ ¬(Sc > 0)」を含むので、テストケース４を選択する。
【００７２】
次にテストケース５に着目する。テストケース５では、テストケース１〜４のいずれにも含まれない目標部分論理式「¬ (Sa ≧ 0) ∧(Sa ≦ 5)」を含むので、テストケース５を選択する。
【００７３】
次にテストケース６に着目する。テストケース６の目標部分論理式はいずれも、テストケース１〜５のいずれかに含まれるものなので、テストケース６については選択しない。
テストケース７以降についても同様に、着目しているテストケースの目標部分論理式が、それまでに選択したテストケースに含まれる目標部分論理式と異なる場合に、その着目しているテストケースを選択する。そうすると、図１６の表の場合には、１２個のテストケースから６個のテストケース１，２，３，４，５，９が選択される。これにより、テストケース１，２，３，４，５，９を用いれば、パスコンディション内の目標部分論理式を全て充足するテストを実行することができる。
【００７４】
図１７は、第２の実施形態におけるテストケース選択装置の構成の一例を示す。テストケース選択装置１１は、制御部１２、記憶部２２を含む。記憶部２２は、パスコンディションテーブル３１、組み合わせテーブル３２、目標論理式テーブル３３、選択パスコンディションテーブル３４、行番号テーブル３５を含む。
【００７５】
パスコンディションテーブル３１には、ソースコードに対してシンボリック実行を行うことにより得られた実行パスの組み合わせ、すなわちパスコンディションの組み合わせ（テストケース）が格納される。なお、本実施形態では、パスコンディションに含まれる原子論理式には、後述するように、ソースコード上において、その原子論理式に対応する条件が記述されている位置を示す情報（例えば、行の番号）が付与されている。
【００７６】
組み合わせテーブル３２には、パスコンディション毎に、パスコンディションに含まれる、付与された行番号毎に分解された原子論理式の組み合わせ、すなわちパスコンディションに含まれる論理式（部分論理式）が格納される。
【００７７】
目標論理式テーブル３３には、パスコンディションを構成する行番号毎に分解された原子論理式の組み合わせ（部分論理式）が、行番号に応じて格納される。
選択パスコンディションテーブル３４には、パスコンディションテーブル３１に含まれるパスコンディションのうち、選択部１６により選択されたパスコンディションが格納される。
【００７８】
制御部１２は、取得部１３、分解部１４ａ、抽出部１５ａ、選択部１６、出力部１７を含む。第１の実施形態と動作が異なるのは、分解部１４ａ、抽出部１５ａである。取得部１３は、入力装置（不図示）により、ソースコードに対してシンボリック実行を行うことにより得られたパスコンディションの組み合わせであるパスコンディション情報（テストケース）３０を取得し、パスコンディションテーブル１８に格納する。
【００７９】
分解部１４ａは、パスコンディションテーブル３１の全てのパスコンディションに存在する全ての行番号を抽出し、行番号テーブル３５に格納する。それから、分解部１４ａは、パスコンディションテーブル３１内の各パスコンディションを行番号毎に分解して部分論理式を取得する。分解部１４ａは、行番号毎に分解して得た原子論理式の組み合わせを、パスコンディション毎に、組み合わせテーブル３２に格納する。
【００８０】
抽出部１５ａは、組み合わせテーブル３２に含まれる原子論理式の組み合わせ（部分論理式）を、行番号に応じた目標論理式テーブル３３へ格納する。ただし、抽出部１５ａは、既に目標論理式テーブル３３にある原子論理式の組み合わせ（部分論理式）を格納しない。このとき、抽出部１５ａは、目標論理式テーブル３３に格納した原子論理式の組み合わせ（部分論理式）を有するパスコンディションについては、組み合わせテーブル３２において、そのパスコンディションにフラグ（選択フラグ）を立てる。
【００８１】
選択部１６は、組み合わせテーブル３２から、選択フラグの立っているパスコンディションを検出する。選択部１６は、パスコンディションテーブル３１から、その検出したパスコンディションに対応するパスコンディションを選択し、選択パスコンディションテーブル３４に格納する。
【００８２】
出力部１７は、選択パスコンディションテーブル２１に格納したパスコンディションをディスプレイ、プリンタ等の出力装置に出力する。
【００８３】
図１８は、第２の実施形態におけるソースコードの一例を示す。図１８において、「a >=0 & a <= 5」の条件がソースコードの第１行目に記述されているとする。また。「ｂ > 0 ＆ｃ > 0」の条件がソースコードの第２行目に記述されているとする。
【００８４】
図１９は、図１８のソースコードに対してシンボリック実行をした結果得られた、入力情報としてのパスコンディション情報の一例を示す。図６と比べて、図１９では、シンボリック実行においてパスコンディションに元プログラムにおける行番号を併せて出力を行う機能を用いている。そのため、パスコンディションに含まれる各原子論理式には、ソースコード上の行番号が付されている。例えば、(l1,(Sa ≧ 0))は、ソースコードの第１行目に「Sa ≧ 0」に相当する条件が記述されていることを示す。
【００８５】
図２０は、第２の実施形態におけるパスコンディションテーブルの一例を示す。パスコンディションテーブル３１は、データ項目「No.」３１１、「パスコンディション」３１２を含む。「No.」３１１には、パスコンディションを識別する情報に対応するNo.が格納される。「パスコンディション」３１２には、「No.」３１１に格納されたNo.に対応するパスコンディション情報が格納される。
【００８６】
ここで、パスコンディションテーブル３１に関する取得部１３の動作について説明する。取得部１３は、入力装置により入力されたパスコンディション情報３０を取得し、パスコンディションテーブル３１に格納する。
【００８７】
図２１は、第２の実施形態における行番号テーブルを示す。行番号テーブル３５には、パスコンディションに含まれる原子論理式に付与された行番号が格納される。
ここで、行番号テーブル３５に関する分解部１４ａの動作について説明する。分解部１４ａは、パスコンディションテーブル３１の全てのパスコンディションに存在する全ての行番号を抽出し、行番号テーブル３５に格納する。
【００８８】
図２２は、第２の実施形態における組み合わせテーブルの一例を示す。組み合わせテーブル３２は、データ項目「No.」３２１、「行番号毎の原子論理式の組み合わせ」３２２を含む。「No.」３２１には、パスコンディションの識別情報に対応するNo.が格納される。「原子論理式の組み合わせ」３２２には、「No.」３２１に格納されたNo.に対応するパスコンディション情報に含まれる、行番号毎の原子論理式の組み合わせが格納される。たとえば、組み合わせテーブル３２のレコード（No.01）には、行番号１の原子論理式の組み合わせ「(l1,(Sa ≧ 0) ) ∧ (l1, (Sa ≦5))」と、行番号１の原子論理式の組み合わせ「(l2, (Sb > 0)) ∧ (l2, (Sc > 0))」が格納されている。
【００８９】
ここで、組み合わせテーブル３２に関する分解部１４ａの動作について説明する。分解部１４ａは、パスコンディションテーブル３１内のパスコンディションを行番号毎に分解した、原子論理式の組み合わせを取得する。分解部１４ａは、行番号毎に分解して得た原子論理式の組み合わせを、パスコンディション毎に、組み合わせテーブル３２に格納する。
【００９０】
図２３は、図２２の組み合わせテーブル３２にデータ項目「選択」３２３を追加した一例を示す。目標論理式テーブル３３には、組み合わせテーブル３２において、着目しているパスコンディションに含まれる原子論理式の組み合わせのうち、それまでに保持した原子論理式の組み合わせ以外の原子論理式の組み合わせが、行番号毎に、保持される。
【００９１】
図２４は、第２の実施形態における目標論理式テーブルの一例を示す。図２４（A）は、行番号１（ｌ１）の原子論理式の組み合わせについての目標論理式テーブル３３１を示す。目標論理式テーブル３３１には、図２３の組み合わせテーブル３２において、下線で示した行番号１（ｌ１）の原子論理式の組み合わせが格納される。図２４（B）は、行番号２（ｌ２）の原子論理式の組み合わせについての目標論理式テーブル３３２を示す。目標論理式テーブル３３２には、図２３の組み合わせテーブル３２において、斜体で示した行番号２（ｌ２）の原子論理式の組み合わせが格納される。これにより、目標論理式テーブル３３には、最終的に、行番号毎に、組み合わせテーブル３２に含まれる全ての種類の原子論理式の組み合わせが格納される。
【００９２】
ここで、目標論理式テーブル３３に関する抽出部１５ａの動作について説明する。抽出部１５ａは、組み合わせテーブル３２に含まれる原子論理式の組み合わせを、行番号に応じた目標論理式テーブル３３へ格納する。ただし、抽出部１５ａは、既に目標論理式テーブル３３にある原子論理式の組み合わせを格納しない。このとき、抽出部１５ａは、目標論理式テーブル３３に格納した原子論理式の組み合わせを有するパスコンディションについては、図２３に示すように、組み合わせテーブル３２において、そのパスコンディションにフラグ（選択フラグ）を立てる。
【００９３】
図２５は、第２の実施形態における選択パスコンディションテーブルの一例を示す。選択部１６は、組み合わせテーブル３２から、選択フラグの立っているパスコンディションを検出する。選択部１６は、パスコンディションテーブル３１から、その検出したパスコンディションに対応するパスコンディションを選択し、選択パスコンディションテーブル２４に格納する。
【００９４】
図２６−図３０は、第２の実施形態におけるテストケース選択フローの一例を示す。ユーザは、シンボリック実行により得られた、各原子論理式に行番号が付与されたパスコンディションを、入力装置を用いて、テストケース選択装置１１に入力する。取得部１３は、その入力されたパスコンディションを取得し、パスコンディションテーブル３１に格納する（Ｓ２１）。
【００９５】
分解部１４ａは、パスコンディションテーブル３１からレコードを読み出す（Ｓ２３）。分解部１４ａは、読み出したレコードのパスコンディションに原子論理式が存在するか否かを判定する（Ｓ２４）。読み出したレコードのパスコンディションに原子論理式が存在する場合（Ｓ２４で「Ｙｅｓ」）、分解部１４ａはそのレコードのパスコンディションの先頭の原子論理式と、その原子論理式に付与された行番号とを取り出する（Ｓ２５）。
【００９６】
分解部１４ａは、取り出した行番号が行番号テーブル３５に存在するか否かを判定する（Ｓ２６）。取り出した行番号が行番号テーブル３５に存在しない場合（Ｓ２６で「Ｎｏ」）、分解部１４ａは、その行番号を行番号テーブル３５に格納する（Ｓ２７）。
【００９７】
Ｓ２６において取り出した行番号が行番号テーブル３５に存在する場合（Ｓ２６で「Ｙｅｓ」）、または、Ｓ２７の処理後、処理がＳ２４へ戻る。分解部１４ａは、Ｓ２３で読み出したコンディション内にある各原子論理式についてＳ２５〜Ｓ２７の処理を行う。
【００９８】
Ｓ２３で読み出したパスコンディション内にある全原子論理式についてＳ２５〜Ｓ２７の処理が終了すると（Ｓ２４で「Ｎｏ」）、分解部１４ａは、パスコンディションテーブル３１から次のパスコンディションを読み出す（Ｓ２２で「Ｙｅｓ」、Ｓ２３）。分解部１４ａは、パスコンディションテーブル３１内にある全パスコンディションについて、Ｓ２３〜２７の処理を行う。
【００９９】
パスコンディションテーブル３１内にある全パスコンディションについて、Ｓ２３〜２７の処理が終了すると（Ｓ２２で「Ｎｏ」）、分解部１４ａは、再び、パスコンディションテーブル３１の先頭からパスコンディションを読み出す（Ｓ２９）。分解部１４ａは、行番号テーブル３５から行番号を取り出す（Ｓ３１）。分解部１４ａは、Ｓ２９で読み出したパスコンディションに、取り出した行番号を有する原子論理式が存在するか否かを判定する（Ｓ３２）。
【０１００】
Ｓ３２において、Ｓ２９で読み出したパスコンディションに、その取り出した行番号を有する原子論理式が存在する場合（Ｓ３２で「Ｙｅｓ」）、分解部１４ａは、次の処理を行う。すなわち、分解部１４ａは、論理積∧で接続された、その行番号を有する原子論理式同士の組み合わせを、組み合わせテーブル３２に追加する（Ｓ３３）。分解部１４ａは、Ｓ２９で読み出したパスコンディション内において、その取り出した行番号を有する全原子論理式についてＳ３３の処理を行う。
【０１０１】
Ｓ２９で読み出したパスコンディション内において、その取り出した行番号を有する全原子論理式についてＳ３３の処理が終了すると（Ｓ３２で「Ｎｏ」）、Ｓ３０へ処理が戻る。分解部１４ａは、行番号テーブル３５に格納されている各行番号について、Ｓ３１〜Ｓ３３の処理を行う。行番号テーブル３５に格納されている各行番号について、Ｓ３１〜Ｓ３３の処理が終了すると、Ｓ２８へ処理が戻る。
【０１０２】
分解部１４ａは、パスコンディションテーブル３１内にある全パスコンディションについて、Ｓ２９〜３３の処理を行う。
パスコンディションテーブル３１内にある全パスコンディションについてＳ２９〜３３３の処理が終わると（Ｓ２８で「Ｎｏ」）、抽出部１５ａは、行番号テーブル３５に格納されている行番号に対応する目標論理式テーブル３３を作成する（Ｓ３４、Ｓ３５）。
【０１０３】
行番号テーブル３５に格納されている行番号に対応する目標論理式テーブルが作成されると、抽出部１５ａは、組み合わせテーブル３２から１つのレコードを読み出す（Ｓ３７）。
【０１０４】
抽出部１５ａは、読み出したレコードから原子論理式の組み合わせを取り出す（Ｓ３９）。抽出部１５ａは、取り出した原子論理式の組み合わせに付与された行番号に対応する目標論理式テーブル３３に、同じ原子論理式の組み合わせが存在するか否かを判定する（Ｓ４０）。
【０１０５】
取り出した原子論理式の組み合わせに付与された行番号に対応する目標論理式テーブルに、同じ原子論理式の組み合わせが存在しない場合（Ｓ４０で「Ｎｏ」）、抽出部１５ａは、その目標論理式テーブル３３に、その原子論理式の組み合わせを追加する（Ｓ４１）。このとき、抽出部１５ａは、Ｓ３７で読み出したレコードに選択フラグを立てる（Ｓ４２）。その後、処理がＳ３８へ戻る。
【０１０６】
取り出した原子論理式の組み合わせに付与された行番号に対応する目標論理式テーブルに、同じ原子論理式の組み合わせが存在する場合（Ｓ４０で「Ｙｅｓ」）、処理がＳ３８へ戻る。
【０１０７】
抽出部１５ａは、Ｓ３７で読み出したレコード内に含まれる全原子論理式の組み合わせについてＳ３９〜Ｓ４２の処理を行う（Ｓ３８で「Ｙｅｓ」）。Ｓ３７で読み出したレコード内に含まれる全原子論理式の組み合わせについてＳ３９〜Ｓ４２の処理が終了すると（Ｓ３８で「Ｎｏ」）、処理がＳ３６へ戻る。抽出部１５ａは、組み合わせテーブル３２内にある全レコードについて、Ｓ３７〜４２の処理を行う（Ｓ３６で「Ｙｅｓ」）。組み合わせテーブル３２内にある全レコードについてＳ３７〜４２の処理が終了すると（Ｓ３６で「Ｎｏ」）、選択部１６は、組み合わせテーブル３２からレコードを読み出す（Ｓ４４）。選択部１６は、そのレコードの選択フラグが立っているか否かを判定する（Ｓ４５）。
【０１０８】
Ｓ４５において、そのレコードの選択フラグが立っていると判定した場合（Ｓ４５で「Ｙｅｓ」）、選択部１６は、パスコンディションテーブル３１から、選択フラグの立っているレコードと同じNo.のパスコンディションを取得する。選択部１６は、その取得したパスコンディションを選択パスコンディションテーブル３４に追加する（Ｓ４６）。
【０１０９】
Ｓ４５において、そのレコードの選択フラグが立っていないと判定した場合（Ｓ１３で「Ｎｏ」）、または、Ｓ４６の処理が終了した場合、処理がＳ４３へ戻る。
選択部１６は、組み合わせテーブル３２内にある全レコードについて、Ｓ４４〜４６の処理を行う。組み合わせテーブル３２内にある全レコードについて、Ｓ４４〜４６の処理が終了すると（Ｓ４３で「Ｎｏ」）、本フローは終了する。
【０１１０】
本実施形態によれば、マルチコンディションカバレッジに応じたテストケースを選択することができる。
【０１１１】
＜第３の実施形態＞
第１の実施形態では、テストケースの選択において、目標論理式テーブル内にまだ格納されていない原子論理式を含むテストケースを選択するようにした。しかしながら、この方法でテストを選択すると、特定の原子論理式の組み合わせを含むテストケースを選択することができない。その結果、選択されたテストケースから、例えば、正常系（エラーの起こらないケース）と呼ばれる利用頻度の高いパスコンディション（テストケース）等の特定のテストケースが漏れてしまう可能性がある。これについて、図３１−図３３を用いて説明する。
【０１１２】
図３１は、テスト対象プログラムのソースコードの一例を示す。図３２は、図３１のテスト対象プログラムのフローチャートを示す。図３３（Ａ）は、シンボリック実行により得られるテストケースを示す。図３３（Ｂ）は、第１の実施形態を用いて選択されたテストケースを示す。なお、図３３（Ａ）（Ｂ）に示すテストケースには、「No.」、「パスコンディション」、「入力」が含まれる。「入力」は、テストデータとしての入力情報を示す。
【０１１３】
図３１のテスト対象プログラムについてシンボリック実行を行った場合、図３３（Ａ）で示すように、No.1〜No.4のパスコンディションが得られたとする。No.1〜No.4のパスコンディションについて第１の実施形態を適用し、No.2及びNo.3で示すテストケースが選択されたとする（図３３（Ｂ））。この場合、No.2及びNo.3で示すテストケースには、No.1〜No.4のパスコンディションに含まれる全ての種類の原子論理式が存在するので、No.1及びNo.4のパスコンディションは選択されない。この場合、図３２に示すように、正常系のテストケース（エラーが起こらないケース）として、No.4で示すパスコンディションが選択されない。
【０１１４】
そこで、第３の実施形態では、シンボリック実行により生成されるテストケースから、特定のテストケースを優先的に選択しつつ、冗長なくテストケースを選択するテストケース選択技術について説明する。なお、第３の実施形態では、第１または第２の実施形態で説明した構成、機能、または処理と同じものについては、第１または第２の実施形態と同一の符号を付し、その説明を省略する。
【０１１５】
（実施例１）
図３４は、第３の実施形態（実施例１）におけるテストケース選択装置の構成の一例を示す。テストケース選択装置１１では、図５のテストケース選択装置１１の制御部１２に、ソースコード読取部４１、ドライバ変更部４２、テストケース生成部４３、テストケース調整部４４が追加されている。なお、第３の実施形態では、取得部１３、分解部１４、抽出部１５、選択部１６、及び出力部１７を選択制御部４５と称する。また、記憶部２２には、パスコンディションテーブル１８、原子論理式テーブル１９、目標論理式テーブル２０、選択パスコンディションテーブル２１、正常系パス判定式５１、シンボリック実行用のドライバ５２が格納されている。
【０１１６】
ソースコード読取部４１は、テスト対象プログラムのソースコード４０を読み取り、ＲＡＭ（Random Access Memory）等の記憶装置へ記憶する。ソースコード４０の一例は、図３１で示されている。ソースコード４０には、テスト対象プログラムが正常に実行された場合（正常系パスが実行された場合）には、例えば、所定の変数に、所定の値が入力される（または入力されない）ようにコーディングされている。
【０１１７】
ドライバ変更部４２は、シンボリック実行用のドライバ５２に対して、読み取ったソースコード４０中の所定の変数の値に基づいてテスト対象プログラムの実行結果が正常（正常系パス）であるか否かを判定する正常系パス判定式５１のコードを組み込む。ドライバ変更部４２は、さらに、シンボリック実行用のドライバ５２に対して、その判定した結果を、後述するシンボリック実行により得られたパスコンディションに反映するコードを組み込む。ここで、シンボリック実行用のドライバ５２とは、テスト対象プログラムのソースコード４０について、所定の実行パターンに従って、テストケース生成部４３にシンボリック実行を行わせるためのドライバコードである。
【０１１８】
テストケース生成部４３は、ソースコード４０について、ドライバ変更部４２により上記所定のコードが組み込まれたシンボリック実行用のドライバを用いて、シンボリック実行を行う。これにより、ソースコード４０についての実行パスの組み合わせ、すなわちパスコンディションの組み合わせ（テストケース）が得られ、記憶部２２に格納される。ここで得られる各パスコンディションには、正常系パスであるか否かの情報が付与されている。
【０１１９】
テストケース調整部４４は、シンボリック実行により生成されたテストケース群を、正常系パスに関するテストケース（パスコンディション）群と、正常系パス以外の実行パス（異常系パス）に関するテストケース（パスコンディション）群とに分類する。また、テストケース調整部４４は、パスコンディションテーブル１８、原子論理式テーブル１９、目標論理式テーブル２０、選択パスコンディションテーブル２１の内容を初期化する。
【０１２０】
テストケース調整部４４は、正常系パスに関するパスコンディション群について、取得部１３、分解部１４、抽出部１５、選択部１６にそれぞれ、第１の実施形態で説明した処理を実行させる。次に、テストケース調整部４４は、異常系パスに関するパスコンディション群について、取得部１３、分解部１４、抽出部１５、選択部１６にそれぞれ、第１の実施形態で説明した処理を実行させる。
【０１２１】
取得部１３は、テストケース調整部４４により分類された正常系パスまたは異常系パスに関するパスコンディション情報（テストケース）を取得し、パスコンディションテーブル１８に格納する。
【０１２２】
分解部１４は、パスコンディションテーブル１８に格納した各パスコンディションを原子論理式に分解する。分解部１４は、その原子論理式を、パスコンディション毎に、原子論理式テーブル１９に格納する。
【０１２３】
抽出部１５は、原子論理式テーブル１９において、着目しているパスコンディションの原子論理式から、目標論理式テーブル２０にそれまでに保持した原子論理式以外の原子論理式を抽出する。抽出部１５は、その抽出した原子論理式を目標論理式テーブル２０に格納する。また、抽出部１５は、その抽出された原子論理式を含んでいたパスコンディションを特定するために、原子論理式テーブル１９において、そのパスコンディションにフラグを立てる。
【０１２４】
選択部１６は、原子論理式テーブル１９から、フラグの立っているパスコンディションを検出する。選択部１６は、パスコンディションテーブル１８から、その検出したパスコンディションに対応するパスコンディションを選択し、選択パスコンディションテーブル２１に格納する。
【０１２５】
出力部１７は、選択パスコンディションテーブル２１に格納したパスコンディション４０ａをディスプレイ、プリンタ等の出力装置に出力する。
【０１２６】
図３５は、第３の実施形態（実施例１）におけるドライバ変更部の処理を説明するための図である。前提として、テスト対象プログラムのソースコード４０では、プログラムが正常に実行されない場合（異常系パスが実行された場合）、message変数に“ＥＲＲＯＲ”が設定されるようになっている。すなわち、ソースコード４０では、プログラムが正常に実行された場合（正常系パスが実行された場合）には、message変数に“ＥＲＲＯＲ”が設定されないようになっている。
【０１２７】
正常系パス判定式５１は、読み取ったソースコード４０中の所定の変数の値に基づいてテスト対象プログラムの実行結果が正常（正常系パス）であるか否かを判定する式の一例である。正常系パス判定式５１は、第３の実施形態では、テスト対象プログラムが実行された結果、message変数に“ＥＲＲＯＲ”等の所定の文字が含まれていないことを判定するために用いられる。
【０１２８】
なお、本実施形態では、正常系パス判定式５１を用いたが、ソースコードに特定の実行パスを通過したことを判別するチェックポイントを１以上挿入しておき、そのチェックポイントを判定することにより、特定の実行パスが実行されたことを検出してもよい。
【０１２９】
ドライバ変更部４２は、記憶部２２から正常系パス判定式５１とシンボリック実行用のドライバ５２を読み出す。ドライバ変更部４２は、ドライバ５２に対して、正常系パス判定式５１のコードと、正常系パス判定式５１による判定結果をパスコンディションに反映するコードとを組み込むことにより、ドライバ５２ａを生成する。
【０１３０】
図３５に示すドライバ５２ａは、ドライバ変更部４２により所定のコードが組み込まれたシンボリック実行用のドライバの一例である。ドライバ変更部４２は、シンボリック実行用のドライバ５２のmain関数の最後に、コード５３、及びコード５４を挿入する。
【０１３１】
コード５３は、message変数に“ＥＲＲＯＲ”という文字が含まれていなかったら、「SisNormal=true」（正常系）と判定し、message変数に“ＥＲＲＯＲ”という文字が含まれていたら、「SisNormal=false」（異常系）と判定することを示す。ここで、SisNormalは、シンボル変数である。
【０１３２】
コード５４は、シンボリック実行により得られた各パスコンディションに、SisNormalの条件を反映するコードである。これにより、図３６で説明するように、シンボリック実行により得られた各パスコンディションに、「SisNormal=true」または「SisNormal=false」を付加することができる。
【０１３３】
図３６は、第３の実施形態（実施例１）におけるシンボリック実行により得られるテストケース（パスコンディション）の一例を示す。テストケース生成部４３は、変更されたドライバ５２ａを用いて、ソースコード４０についてシンボリック実行を行う。これにより、テストケース（パスコンディション）５５が得られる。得られた、テストケース（パスコンディション）５５は、記憶部２２に格納される。各パスコンディション５５は、テスト対象プログラムのソースコード４０に含まれる条件に基づく実行パスに、コード５３，５４に基づいて付与された条件式（「SisNormal=true」または「SisNormal=false」）を含む。
【０１３４】
図３７は、第３の実施形態（実施例１）におけるテストケース調整部の処理を説明するための図である。まず、テストケース調整部４４は、ソースコード４０についてシンボリック実行を行うことにより得られたテストケース５５から、SisNormal=trueを含むテストケース（パスコンディション）を抽出する。テストケース調整部４４は、抽出したパスコンディションについて、順に、取得部１３、分解部１４、抽出部１５、選択部１６に、第１の実施形態の処理を実行させる。
【０１３５】
具体的には、取得部１３は、テストケース調整部４４によって抽出されたパスコンディション（SisNormal=trueを含むパスコンディション）をパスコンディションテーブル１８に格納する。分解部１４は、パスコンディションテーブル１８に格納された各パスコンディションを原子論理式に分解する。分解部１４は、その原子論理式を、パスコンディション毎に、原子論理式テーブル１９に格納する。
【０１３６】
抽出部１５は、原子論理式テーブル１９において、着目しているパスコンディションの原子論理式から、目標論理式テーブル２０にそれまでに保持した原子論理式以外の原子論理式を抽出する。抽出部１５は、その抽出した原子論理式を目標論理式テーブル２０に格納する。また、抽出部１５は、その抽出された原子論理式を含んでいたパスコンディションを特定するために、原子論理式テーブル１９において、そのパスコンディションにフラグを立てる。
【０１３７】
選択部１６は、原子論理式テーブル１９から、フラグの立っているパスコンディションを検出する。選択部１６は、パスコンディションテーブル１８から、その検出したパスコンディションに対応するパスコンディションを選択し、選択パスコンディションテーブル２１に格納する。
【０１３８】
図３６の場合、テストケース調整部４４は、SisNormal=trueを含むパスコンディションとして、No.4のパスコンディションを選択する。No.4のパスコンディションは、原子論理式「¬（Sa＜０）」「¬（Sb＜０）」を含むので、抽出部１５は、目標論理式テーブル２０に原子論理式「¬（Sa＜０）」「¬（Sb＜０）」を格納する（図３７（Ａ））。この場合、抽出部１５は、原子論理式テーブル１９において、No.4のパスコンディションにフラグを立てる。選択部１６は、原子論理式テーブル１９からそのフラグを有するNo.4のパスコンディションを検出し、そのパスコンディションを選択パスコンディションテーブル２１に格納する。
【０１３９】
次に、テストケース調整部４４は、ソースコード４０についてシンボリック実行を行うことにより得られたテストケース５５から、SisNormal=falseを含むテストケース（パスコンディション）を抽出する。テストケース調整部４４は、抽出したパスコンディションについて、順に、取得部１３、分解部１４、抽出部１５、選択部１６に、第１の実施形態の処理を実行させる。なお、パスコンディションテーブル１８、原子論理式テーブル１９の内容はテストケース調整部４４によりクリアされて、初期化されている。また、目標論理式テーブル２０には、上記で抽出した原子論理式が保持されている。また、選択パスコンディションテーブル２１には、上記で格納したパスコンディションが格納されている。
【０１４０】
具体的には、取得部１３は、テストケース調整部４４によって抽出されたパスコンディション（SisNormal=falseを含むパスコンディション）をパスコンディションテーブル１８に格納する。分解部１４は、パスコンディションテーブル１８に格納された各パスコンディションを原子論理式に分解する。分解部１４は、その原子論理式を、パスコンディション毎に、原子論理式テーブル１９に格納する。
【０１４１】
抽出部１５は、原子論理式テーブル１９において、着目しているパスコンディションの原子論理式から、目標論理式テーブル２０にそれまでに保持した原子論理式以外の原子論理式を抽出する。抽出部１５は、その抽出した原子論理式を目標論理式テーブル２０に格納する。また、抽出部１５は、その抽出された原子論理式を含んでいたパスコンディションを特定するために、原子論理式テーブル１９において、そのパスコンディションにフラグを立てる。
【０１４２】
選択部１６は、原子論理式テーブル１９から、フラグの立っているパスコンディションを検出する。選択部１６は、パスコンディションテーブル１８から、その検出したパスコンディションに対応するパスコンディションを選択し、選択パスコンディションテーブル２１に格納する。
【０１４３】
図３６の場合、テストケース調整部４４は、SisNormal=falseを含むパスコンディションとして、No.1〜No.3のパスコンディションを抽出する。抽出されたパスコンディションのうち、No.1のパスコンディションは、目標論理式テーブル２０にまだ格納されていない原子論理式「Sa＜０」「Sb＜０」を含む。この場合、抽出部１５は、目標論理式テーブル２０に原子論理式「Sa＜０」「Sb＜０」を格納する（図３７（Ｂ））。抽出部１５は、原子論理式テーブル１９において、No.1のパスコンディションにフラグを立てる。No.2〜No.3のパスコンディションに含まれる原子論理式は、目標論理式テーブル２０に既に格納されているから、No.2〜No.3のパスコンディションにはフラグは付与されない。選択部１６は、原子論理式テーブル１９からそのフラグを有するNo.1のパスコンディションを検出して、No.1のパスコンディションを選択パスコンディションテーブル２１に格納する。
【０１４４】
図３８は、第３の実施形態（実施例１）における選択パスコンディションテーブルの一例を示す。図３７（Ａ）（Ｂ）を用いて説明したように、選択パスコンディションテーブル２１には、No.1、No.4のパスコンディションが格納されている。
【０１４５】
図３９は、第３の実施形態（実施例１）におけるテストケース選択フローの一例を示す。ユーザは、テスト対象プログラムのソースコード４０を、入力装置を用いて、テストケース選択装置１１に入力する。ソースコード読取部４１は、その入力されたソースコード４０を読み込む（Ｓ５１）。
【０１４６】
ドライバ変更部４２は、シンボリック実行用ドライバ５２のmain関数の最後に、正常系パス判定式５１を含むコードを挿入する（Ｓ５２）。
テストケース生成部４３は、ソースコード４０について、ドライバ変更部４２により上記所定のコードが組み込まれたシンボリック実行用のドライバ５２ａを用いて、シンボリック実行を行う。これにより、ソースコード４０についての実行パスの組み合わせ、すなわちパスコンディションの組み合わせ（テストケース５５）が得られる（Ｓ５３）。ここで得られる各パスコンディションには、正常系パスであるか否かの情報（SisNormal=trueまたはSisNormal=false）が付与されている。
【０１４７】
テストケース調整部４４は、生成されたテストケース群５５を、パスコンディションにSisNormal=trueを含むテストケース群と、パスコンディションにSisNormal=falseを含むテストケース群とに分類する（Ｓ５４）。
【０１４８】
テストケース調整部４４は、初期化のために、パスコンディションテーブル１８、原子論理式テーブル１９、目標論理式テーブル２０、選択パスコンディションテーブル２１の内容をクリアする（Ｓ５５）。
【０１４９】
テストケース調整部４４は、まず、パスコンディションにSisNormal=trueを含むテストケース群について、取得部１３、分解部１４、抽出部１５、選択部１６に、図１２‐図１４の処理を実行させる（Ｓ５６）。その後、テストケース調整部４４は、初期化のために、パスコンディションテーブル１８、原子論理式テーブル１９の内容をクリアする（Ｓ５７）。
【０１５０】
次に、テストケース調整部４４は、パスコンディションにSisNormal=falseを含むテストケース群について、取得部１３、分解部１４、抽出部１５、選択部１６に、図１２‐図１４の処理を実行させる（Ｓ５８）。その後、選択部１６は、選択パスコンディションテーブル２１に格納された各パスコンディションから、条件式SisNormalを削除する（Ｓ５９）。
【０１５１】
これにより、シンボリック実行により生成されるテストケースから、所定のテストケースを優先的に選択しつつ、冗長なくテストケースを選択することができる。
【０１５２】
（実施例２）
次に、第３の実施形態の実施例２について説明する。第３の実施形態（実施例１）では、SisNormal=trueを含むテストケース群、SisNormal=falseを含むテストケース群それぞれについて第１の実施形態を適用した。これに対して、第３の実施形態（実施例２）では、第１の実施形態において、原子論理式テーブルに格納されているレコードを正常系パス、異常系パスの順にソートして、処理を行うことについて説明する。
【０１５３】
図４０は、第３の実施形態（実施例２）におけるテストケース選択装置の構成の一例を示す。図４０のテストケース選択装置１１では、図３４のテストケース選択装置１１の制御部１２からテストケース調整部４４が削除され、選択制御部４５にソート部６１が追加されている。ソースコード読取部４１、ドライバ変更部４２、テストケース生成部４３による処理は、上述した処理と同じである。
【０１５４】
取得部１３は、テストケース生成部４３により生成されたパスコンディション情報（テストケース）５５を取得し、パスコンディションテーブル１８に格納する。
分解部１４は、パスコンディションテーブル１８に格納した各パスコンディションを原子論理式に分解する。分解部１４は、その原子論理式を、パスコンディション毎に、原子論理式テーブル１９ａに格納する。
【０１５５】
ソート部６１は、原子論理式テーブル１９ａに格納されているパスコンディションを、正常系パスを示す条件式を有するか否かに応じて、ソートする。具体的には、ソート部６１は、原子論理式テーブル１９ａにおいて、正常系パスに関するパスコンディションがテーブルの先頭側にくるようにソートする。
【０１５６】
抽出部１５は、原子論理式テーブル１９において、着目しているパスコンディションの原子論理式から、目標論理式テーブル２０にそれまでに保持した原子論理式以外の原子論理式を抽出する。抽出部１５は、その抽出した原子論理式を目標論理式テーブル２０に格納する。また、抽出部１５は、その抽出された原子論理式を含んでいたパスコンディションを特定するために、原子論理式テーブル１９ａにおいて、そのパスコンディションにフラグを立てる。
【０１５７】
選択部１６は、原子論理式テーブル１９ａから、フラグの立っているパスコンディションを検出する。選択部１６は、パスコンディションテーブル１８から、その検出したパスコンディションに対応するパスコンディションを選択し、選択パスコンディションテーブル２１に格納する。
【０１５８】
出力部１７は、選択パスコンディションテーブル２１に格納したパスコンディション４０ａをディスプレイ、プリンタ等の出力装置に出力する。
図４１は、第３の実施形態（実施例２）における原子論理式テーブルの一例を示す。図４１（Ａ）は、ソート処理前の原子論理式テーブル１９ａを示す。図４１（Ｂ）は、ソート処理後の原子論理式テーブル１９ａを示す。
【０１５９】
分解部１４は、パスコンディションテーブル１８に格納した各パスコンディションを原子論理式に分解した後、図４１（Ａ）に示すように、その原子論理式を、パスコンディション毎に、原子論理式テーブル１９ａに格納する。このとき、条件式SisNormal（SisNormal=true/false）については、原子論理式テーブル１９ａの項目「SisNormal」に格納される。
【０１６０】
それから、ソート部６１は、図４１（Ｂ）に示すように、原子論理式テーブル１９ａにおいて、正常系パスに関するパスコンディションが先頭側にくるようにソートする。
これ以降は、第１の実施形態と同様に、抽出部１５、選択部１６、出力部１７による処理が行われる。
【０１６１】
図４２は、第３の実施形態（実施例２）におけるテストケース選択フローの一例を示す。第３の実施形態の変形例におけるテストケース選択フローは、第１の実施形態のフロー（図１２−図１４）の図１３に、Ｓ６１の処理を追加したフローである。Ｓ６１において、ソート部６１は、原子論理式テーブル１９ａに格納されているレコードを、項目「SisNormal」に基づいて、正常系パス、異常系パスの順にソートする。Ｓ６１以外の処理は、図１２−図１４と同様なので、その説明を省略する。
【０１６２】
これにより、シンボリック実行により生成されるテストケースを、抽出部１５において所定のテストケースが優先的に選択されるようにソートを行う。これにより、シンボリック実行により生成されるテストケースから、特定のテストケースを優先的に選択しつつ、冗長なくテストケースを選択する冗長なくテストケースを選択することができる。
【０１６３】
図４３は、第１〜第３の実施形態を適用したコンピュータのハードウェア環境の構成ブロック図である。コンピュータ７０は、第１〜第３の実施形態の処理（図１２〜図１４、図２６〜図３０）を行うプログラムを読み込むことにより、テストケース選択装置１１として機能する。
【０１６４】
コンピュータ７０は、出力Ｉ／Ｆ７１、ＣＰＵ７２、ＲＯＭ７３、通信Ｉ／Ｆ７４、入力Ｉ／Ｆ７５、ＲＡＭ７６、記憶装置７７、読み取り装置７８、バス７９を含む。コンピュータ７０は、出力機器８１、及び入力機器８２と接続可能である。
【０１６５】
ここで、ＣＰＵは、中央演算装置を示す。ＲＯＭは、リードオンリメモリを示す。ＲＡＭは、ランダムアクセスメモリを示す。Ｉ／Ｆは、インターフェースを示す。バス７９には、出力Ｉ／Ｆ７１、ＣＰＵ７２、ＲＯＭ７３、通信Ｉ／Ｆ７４、入力Ｉ／Ｆ７５、ＲＡＭ７６、記憶装置７７、読み取り装置７８が接続されている。読み取り装置７８は、可搬型記録媒体を読み出す装置である。出力機器８１は、出力Ｉ／Ｆ７１に接続されている。入力機器８２は、入力Ｉ／Ｆ７５に接続されている。
【０１６６】
記憶装置７７としては、ハードディスクドライブ、フラッシュメモリ装置、磁気ディスク装置など様々な形式の記憶装置を使用することができる。
記憶装置７７またはＲＯＭ７３には、例えば、第１〜第３の実施形態で説明した処理を実現するプログラムが格納されている。または、記憶装置７７またはＲＡＭ７６には、パスコンディションテーブル１８、原子論理式テーブル１９，１９ａ、目標論理式テーブル２０、選択パスコンディションテーブル２１が格納されている。または、記憶装置７７またはＲＡＭ７６には、パスコンディションテーブル３１、組み合わせテーブル３２、目標論理式テーブル３３、選択パスコンディションテーブル３４、行番号テーブル３５が格納されている。また、記憶装置７７またはＲＡＭ７６には、読み込まれたソースコード、正常系パス判定式５１のコード、シンボリック実行用のドライバ５２が格納されている。
【０１６７】
ＣＰＵ７２は、記憶装置７７等に格納した第１〜第３の実施形態で説明した処理を実現するプログラムを読み出し、当該プログラムを実行する。
具体的には、ＣＰＵ７２は、当該プログラムを実行することにより、制御部１２（取得部１３、分解部１４，１４ａ、抽出部１５，１５ａ、選択部１６、出力部１７）として機能する。さらに、ＣＰＵ７２は、制御部１２（ソースコード読取部４１、ドライバ変更部４２、テストケース生成部４３、テストケース調整部４４、ソート部６１）として機能する。
【０１６８】
第１〜第３の実施形態で説明した処理を実現するプログラムは、プログラム提供者側から通信ネットワーク８０、および通信Ｉ／Ｆ７４を介して、例えば記憶装置７７に格納してもよい。また、第１〜第３の実施形態で説明した処理を実現するプログラムは、市販され、流通している可搬型記憶媒体に格納されていてもよい。この場合、この可搬型記憶媒体は読み取り装置７８にセットされて、ＣＰＵ７２によってそのプログラムが読み出されて、実行されてもよい。可搬型記憶媒体としてはＣＤ−ＲＯＭ、フレキシブルディスク、光ディスク、光磁気ディスク、ＩＣ（integrated circuit）カード、ＵＳＢ（Universal Serial Bus）メモリ装置など様々な形式の記憶媒体を使用することができる。このような記憶媒体に格納されたプログラムが読み取り装置７８によって読み取られる。
【０１６９】
また、入力機器８２には、キーボード、マウス、電子カメラ、ウェブカメラ、マイク、スキャナ、センサ、タブレット、タッチパネルなどを用いることが可能である。また、出力機器８１には、ディスプレイ、プリンタ、スピーカなどを用いることが可能である。また、ネットワーク８０は、インターネット、ＬＡＮ、ＷＡＮ、専用線、有線、無線等の通信網であってよい。
【０１７０】
なお、第１〜第３の実施形態は、以上に述べた実施の形態に限定されるものではなく、本実施形態の要旨を逸脱しない範囲内で種々の構成または実施形態を取ることができる。
【符号の説明】
【０１７１】
１      経路条件選択装置
２      取得部
３      分解部
４      抽出部
５      選択部
６      分解格納部
７      目標論理式格納部
８      生成部
１０      パスコンディション情報
１１      テストケース選択装置
１２      制御部
１３      取得部
１４，１４ａ      分解部
１５，１５ａ      抽出部
１６      選択部
１７      出力部
１８      パスコンディションテーブル
１９，１９ａ  原子論理式テーブル
２０      目標論理式テーブル
２１      選択パスコンディションテーブル
２２      記憶部
３０      パスコンディション情報
３１      パスコンディションテーブル
３２      組み合わせテーブル
３３      目標論理式テーブル
３４      選択パスコンディションテーブル
３５      行番号テーブル
４１      ソースコード読取部
４２      ドライバ変更部
４３      テストケース生成部
４４      テストケース調整部
４５      選択制御部
６１      ソート部
【図２】
0005900197.tif 000002
【図３】
0005900197.tif 000003
【図５】
0005900197.tif 000004
【図６】
0005900197.tif 000005
【図７】
0005900197.tif 000006
【図８】
0005900197.tif 000007
【図９】
0005900197.tif 000008
【図３２】
0005900197.tif 000009
【図４２】
0005900197.tif 000010
【図４３】
0005900197.tif 000011
【図１】
0005900197.tif 000012
【図４】
0005900197.tif 000013
【図１０】
0005900197.tif 000014
【図１１】
0005900197.tif 000015
【図１２】
0005900197.tif 000016
【図１３】
0005900197.tif 000017
【図１４】
0005900197.tif 000018
【図１５】
0005900197.tif 000019
【図１６】
0005900197.tif 000020
【図１７】
0005900197.tif 000021
【図１８】
0005900197.tif 000022
【図１９】
0005900197.tif 000023
【図２０】
0005900197.tif 000024
【図２１】
0005900197.tif 000025
【図２２】
0005900197.tif 000026
【図２３】
0005900197.tif 000027
【図２４】
0005900197.tif 000028
【図２５】
0005900197.tif 000029
【図２６】
0005900197.tif 000030
【図２７】
0005900197.tif 000031
【図２８】
0005900197.tif 000032
【図２９】
0005900197.tif 000033
【図３０】
0005900197.tif 000034
【図３１】
0005900197.tif 000035
【図３３】
0005900197.tif 000036
【図３４】
0005900197.tif 000037
【図３５】
0005900197.tif 000038
【図３６】
0005900197.tif 000039
【図３７】
0005900197.tif 000040
【図３８】
0005900197.tif 000041
【図３９】
0005900197.tif 000042
【図４０】
0005900197.tif 000043
【図４１】
0005900197.tif 000044