(57)【要約】【課題】プログラムのループ構造の条件式に数値を代表するシンボルが用いられている場合に、無駄な実行パスの生成を抑制する。【解決手段】テスト支援装置１は、テスト対象のプログラムから、ループ制御変数とシンボル変数とを用いたループの継続条件を示す第１の条件式に合致する場合に特定の処理を実行し、合致しない場合にループを終了するループ構造を検出する。テスト支援装置１は、テスト対象のプログラムを、検出したループ構造の第１の条件式にループカウント変数と所定のループの終了回数とを用いた第２の条件式を加えた条件式を含むプログラムに変換する。テスト支援装置１は、変換したプログラムをシンボリック実行する際に、ループカウント変数がループの終了回数に至るまで、ループカウント変数が示すループの実行回数に応じたシンボル変数を用いたパス条件を生成し、パス条件を満たすシンボル変数のテストデータを生成する。【選択図】図１
2018136704.tif 000002
【特許請求の範囲】
【請求項１】
コンピュータに、
テスト対象のプログラムから、ループ制御変数を変化させてループ制御変数とシンボル変数とを用いたループの継続条件を示す第１の条件式に合致する場合に特定の処理を実行し、合致しない場合にループを終了することを示すループ構造を検出し、
前記テスト対象のプログラムを、検出したループ構造の前記第１の条件式にループの実行回数をカウントするループカウント変数と予め定められたループの終了回数とを用いた第２の条件式を加えた条件式を含むプログラムに変換し、
変換したプログラムをシンボリック実行する際に、前記ループカウント変数が前記ループの終了回数に至るまで、前記ループカウント変数が示すループの実行回数に応じた前記シンボル変数を用いたパス条件を生成し、生成したパス条件を満たす前記シンボル変数のテストデータを生成する
処理を実行させることを特徴とするテスト支援プログラム。
【請求項２】
該生成した前記シンボル変数のテストデータを用いて、前記ループ構造が網羅されているか否かを判定し、前記ループ構造が網羅されない場合には、前記ループの終了回数を調整する
処理を実行させることを特徴とする請求項１に記載のテスト支援プログラム。
【請求項３】
該調整する処理は、予め定められたループの終了回数に関する２分探索により、前記ループの終了回数を調整する
処理を実行させることを特徴とする請求項２に記載のテスト支援プログラム。
【請求項４】
該生成する処理は、前記ループカウント変数が該調整された前記ループの終了回数に至るまで、前記ループカウント変数が示すループの実行回数に応じた前記シンボル変数を用いたパス条件を生成し、生成したパス条件を満たす前記シンボル変数のテストデータを生成し、
該調整する処理は、前記ループ構造が網羅されない場合には、前記ループの終了回数を、網羅率が最も高い前記ループの終了回数に調整する
処理を実行させることを特徴とする請求項２に記載のテスト支援プログラム。
【請求項５】
テスト対象のプログラムから、ループ制御変数を変化させてループ制御変数とシンボル変数とを用いたループの継続条件を示す第１の条件式に合致する場合に特定の処理を実行し、合致しない場合にループを終了することを示すループ構造を検出する検出部と、
前記テスト対象のプログラムを、前記検出部によって検出されたループ構造の前記第１の条件式にループの実行回数をカウントするループカウント変数と予め定められたループの終了回数とを用いた第２の条件式を加えた条件式を含むプログラムに変換する変換部と、
前記変換部によって変換されたプログラムをシンボリック実行する際に、前記ループカウント変数が前記ループの終了回数に至るまで、前記ループカウント変数が示すループの実行回数に応じた前記シンボル変数を用いたパス条件を生成し、生成したパス条件を満たす前記シンボル変数のテストデータを生成する生成部と、
を有することを特徴とするテスト支援装置。
【請求項６】
コンピュータが、
テスト対象のプログラムから、ループ制御変数を変化させてループ制御変数とシンボル変数とを用いたループの継続条件を示す第１の条件式に合致する場合に特定の処理を実行し、合致しない場合にループを終了することを示すループ構造を検出し、
前記テスト対象のプログラムを、検出したループ構造の前記第１の条件式にループの実行回数をカウントするループカウント変数と予め定められたループの終了回数とを用いた第２の条件式を加えた条件式を含むプログラムに変換し、
変換したプログラムをシンボリック実行する際に、前記ループカウント変数が前記ループの終了回数に至るまで、前記ループカウント変数が示すループの実行回数に応じた前記シンボル変数を用いたパス条件を生成し、生成したパス条件を満たす前記シンボル変数のテストデータを生成する
各処理を実行することを特徴とするテスト支援方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、テスト支援プログラムなどに関する。
【背景技術】
【０００２】
シンボリック実行（Symbolic  execution）を用いてプログラムのテストを行う技術が知られている（例えば、特許文献１参照）。かかるシンボリック実行は、プログラムを、そのプログラムに含まれる変数に具体的な数値を入力する代わりに、数値を代表するシンボルでプログラムを模擬的に実行し、その結果を評価する技術である。シンボリック実行では、プログラムの条件分岐においてその充足可能な全ての実行パス（パスコンディション）を自動的に発生させて、プログラムの網羅的な実行を可能としている。
【先行技術文献】
【特許文献】
【０００３】
【特許文献１】特開２０１１−１９１９８５号公報
【特許文献２】国際公開第２０１６／００１９８２号
【発明の概要】
【発明が解決しようとする課題】
【０００４】
ところで、プログラムには、ループ構造を含むプログラムがある。かかるプログラムのループ構造の条件式に数値を代表するシンボルが用いられている場合には、シンボルに制約を付けない限り、際限なく実行パスが生成されてしまうという問題がある。
【０００５】
本発明は、１つの側面では、プログラムのループ構造の条件式に数値を代表するシンボルが用いられている場合に、無駄な実行パスの生成を抑制することを目的とする。
【課題を解決するための手段】
【０００６】
１つの態様では、テスト支援プログラムは、コンピュータに、テスト対象のプログラムから、ループ制御変数を変化させてループ制御変数とシンボル変数との関係を含む条件文の条件に合致する場合に特定の処理を実行することを示すループ構造を検出し、検出したループ構造に含まれる条件文に、ループ実行回数をカウントするループカウント変数と予め定められたループ終了回数とを用いた条件式を加えて、前記プログラムを変換し、変換したプログラムをシンボリック実行する際に、前記ループカウント変数が前記ループ終了回数に至るまで、前記ループカウント変数が示すループ実行回数に応じた前記シンボル変数を用いた実行パス条件を生成し、生成した実行パス条件を満たす前記シンボル変数のデータ値を生成する、処理を実行させる。
【発明の効果】
【０００７】
１実施態様によれば、プログラムのループ構造の条件式に数値を代表するシンボルが用いられている場合に、無駄な実行パスの生成を抑制することができる。
【図面の簡単な説明】
【０００８】
【図１】図１は、実施例に係るテスト支援装置の構成を示す機能ブロック図である。
【図２】図２は、追加変数と追加変数条件式を導入したプログラムの一例を示す図である。
【図３】図３は、シンボリック実行で生成されるテストデータの一例を示す図である。
【図４】図４は、追加変数と追加変数条件式を導入した別のプログラムの一例を示す図である。
【図５】図５は、シンボリック実行で生成されるテストデータの一例を示す図である。
【図６】図６は、実施例に係るテスト支援処理のフローチャートの一例を示す図である。
【図７】図７は、最大ループ実行回数の２分探索処理のフローチャートの一例を示す図である。
【図８】図８は、テスト支援プログラムを実行するコンピュータの一例を示す図である。
【図９】図９は、シンボリック実行の参考例を示す図（１）である。
【図１０】図１０は、シンボリック実行の参考例を示す図（２）である。
【図１１】図１１は、ループ構造を含むプログラムの内部表現の参考例を示す図である。
【図１２】図１２は、ループ構造を含むプログラムに対してシンボリック実行で生成されるテストデータの参考例を示す図である。
【発明を実施するための形態】
【０００９】
以下に、本願の開示するテスト支援プログラム、テスト支援装置およびテスト支援方法の実施例を図面に基づいて詳細に説明する。なお、本発明は、実施例により限定されるものではない。
【実施例】
【００１０】
［シンボリック実行の参考例］
まず、シンボリック実行について説明する。シンボリック実行は、プログラムを、そのプログラムに含まれる変数に具体的な数値を入力する代わりに、数値を代表する記号（シンボル値）のままプログラムを模擬的に実行し、その結果を評価する技術である。
【００１１】
ここで、シンボリック実行の参考例を、図９および図１０を参照して説明する。図９および図１０は、シンボリック実行の参考例を示す図である。図９左図に示すようなテスト対象のプログラムをシンボリック実行する場合を考える。このテスト対象のプログラムでは、ｚ１，ｚ２，ｚ３，ｚ４にｉｆ文が記述されている。また、変数ａおよびｂがシンボリック実行におけるシンボル変数として指定されているものとする。
【００１２】
このようなテスト対象のプログラムをシンボリック実行すると、図９右図に模式的に示すような制御構造が得られる。なお、制御構造内の「ｂｌｏｃｋ１」は、「ｐｕｔｓ（“ｂｌｏｃｋ１”）」処理を略記したものである。制御構造内の「ｂｌｏｃｋ２」は、「ｐｕｔｓ（“ｂｌｏｃｋ２”）」処理を略記したものである。制御構造内の「ｂｌｏｃｋ３」は、「ｐｕｔｓ（“ｂｌｏｃｋ３”）」処理を略記したものである。制御構造内の「ｂｌｏｃｋ４」は、「ｐｕｔｓ（“ｂｌｏｃｋ４”）」処理を略記したものである。制御構造内の「ｂｌｏｃｋＡ」は、「ｐｕｔｓ（“ｂｌｏｃｋＡ”）」処理を略記したものである。制御構造内の「ｂｌｏｃｋＢ」は、「ｐｕｔｓ（“ｂｌｏｃｋＢ”）」処理を略記したものである。
【００１３】
そして、得られた制御構造から、図１０右図に模式的に示すようなテストケースが生成される。図１０右図におけるパス条件（パスコンディション）は、シンボリック実行で代入文や条件文などを通過したときに満たすべき論理的な制約を表している。シンボリック実行では、このようなパス条件を代入文や条件文などを通過する毎に積み上げる。図１０右図のＮｏ１の例では、条件文が「ａ＝＝０」であるところで、（ａ＝＝０）というパス条件が積まれ、条件文が「ｂ＞０」であるところで、（ｂ＞０）というパス条件が積まれる。Ｎｏ３の例では、条件文が「ａ！＝０」であるところで、（ａ！＝０）というパス条件が積まれ、条件文が「ａ＞５」であるところで、（ａ＞５）というパス条件が積まれ、条件文が「ｂ＜＝０」であるところで、（ｂ＜＝０）というパス条件が積まれる。Ｎｏ５の例では、条件文が「ａ！＝０」であるところで、（ａ！＝０）というパス条件が積まれ、条件文が「ａ＜＝５」であるところで、（ａ＜＝５）というパス条件が積まれ、条件文が「ｂ＜＝０」であるところで、（ｂ＋１＜＝０）というパス条件が積まれる。Ｎｏ６の例では、条件文が「ａ！＝０」であるところで、（ａ！＝０）というパス条件が積まれ、条件文が「ａ＜＝５」であるところで、（ａ＜＝５）というパス条件が積まれ、条件文が「ｂ＞０」であるところで、（ｂ＋１＞０）というパス条件が積まれる。
【００１４】
そして、シンボリック実行によって得られたパス条件の充足値がテストデータとして用いられる。図１０右図のＮｏ１の例では、シンボル変数ａを「０」、シンボル変数ｂを「１」としたテストデータが示される。Ｎｏ３の例では、シンボル変数ａを「６」、シンボル変数ｂを「０」としたテストデータが示される。Ｎｏ５の例では、シンボル変数ａを「１」、シンボル変数ｂを「−１」としたテストデータが示される。Ｎｏ６の例では、シンボル変数ａを「１」、シンボル変数ｂを「０」としたテストデータが示される。
【００１５】
このようなシンボリック実行の後に、パス条件が充足可能か否かの判定を、例えばＳＡＴ（satisfiability）またはＳＭＴ（satisfiability  modulo  theory）ソルバ等を利用して行う。例えば、図１０右図のＮｏ１の例では、「ａ＝０  ｂ＝１」のテストデータは、対応するｂｌｏｃｋＢの処理に含まれる「ａ＝ｂ／ａ」の処理で０除算となり、エラーが発生するが、パス条件は充足可能と判定される。
【００１６】
ところで、テスト対象のプログラムには、ループ構造を含むプログラムがある。かかるループ構造を含むプログラムには、プログラム言語で記述したソースコードの他に、プログラム言語を展開したバイトコード表現と同等のコードに書き換えたコードがある。バイトコード表現と同等のコードに書き換えたコードは、例えば、ソースコードとアセンブラコードの中間的な性質を持つコードであり、ソースコードとアセンブラコードとの橋渡しに用いられるコードともいえる。
【００１７】
図１１は、ループ構造を含むプログラムの内部表現の参考例を示す図である。図１１左図に示すようなプログラムは、ループ構造を含むソースコードであってＣ言語で記述したソースコードである。図１１右図で示すようなプログラムは、図１１左図で示すようなＣ言語を展開したバイトコード表現と同等のコードに書き換えたプログラムである。バイトコード表現と同等のコードでは、ループ構造は、条件分岐と特定行へのジャンプ（ｇｏｔｏ文）とで表される。また、これらのプログラム内の変数ｖがシンボル変数であり、テストデータとして生成される対象の変数である。なお、シンボリック実行は、プログラムをバイトコード表現に変換して扱う場合が多い。
【００１８】
そして、図１１で示したループ構造を含むプログラムに対してシンボリック実行で生成されるテストデータについて、図１２を参照して説明する。図１２は、ループ構造を含むプログラムに対してシンボリック実行で生成されるテストデータの参考例を示す図である。
【００１９】
図１１で示したループ構造を含むプログラムのシンボリック実行は、図１２右図に示す流れを辿る。
【００２０】
そして、シンボリック実行が辿る流れから、図１２左図に模式的に示すようなテストケースが生成される。図１２左図における実行パス条件（パスコンディション）は、シンボリック実行で代入文や条件文などを通過したときに満たすべき論理的な制約を表している。シンボリック実行では、このようなパス条件を代入文や条件文などを通過する毎に積み上げる。
【００２１】
ループ実行回数が０でループ実行終了するテストケースでは、ｉに初期値０を代入したところ０＜ｖの条件式がＦａｌｓｅである場合の「！（０＜ｖ）」というパス条件が積まれる。
【００２２】
ループ実行回数が１でループ実行終了するテストケースでは、０＜ｖの条件式がＴｒｕｅである場合の「（０＜ｖ）」というパス条件が積まれる。加えて、ｉに１を加算したところ１＜ｖの条件式がＦａｌｓｅである場合の「！（１＜ｖ）」というパス条件が積まれる。
【００２３】
ループ実行回数が２でループ実行終了するテストケースでは、０＜ｖの条件式がＴｒｕｅである場合の「（０＜ｖ）」というパス条件が積まれる。加えて、ｉに１を加算したところ１＜ｖの条件式がＴｒｕｅである場合の「（１＜ｖ）」というパス条件が積まれる。加えて、ｉに１を加算したところ２＜ｖの条件式がＦａｌｓｅである場合の「！（２＜ｖ）」というパス条件が積まれる。
【００２４】
さらに、ループ実行回数に応じたテストケースが繰り返し生成される。
【００２５】
そして、シンボリック実行によって得られたパス条件の充足値がテストデータとして用いられる。図１２左図のループ実行回数が０の場合には、シンボル変数ｖを「０」としたテストデータが示される。ループ実行回数が１の場合には、シンボル変数ｖを「１」としたテストデータが示される。ループ実行回数が２の場合には、シンボル変数ｖを「２」としたテストデータが示される。さらに、繰り返し、ループ実行回数に応じたテストケースのテストデータが示されることになる。
【００２６】
これにより、ループ構造を含むプログラムのシンボリック実行において、プログラムのループ構造の条件式にシンボル変数が用いられている場合、シンボル変数に制約を付けない限り、際限なくパス条件およびテストデータが生成されてしまう。すなわち、プログラムのループ構造の条件式にシンボル変数が用いられている場合、無駄なテストデータが生成されてしまう。
【００２７】
［実施例に係るテスト支援装置の構成］
図１は、実施例に係るテスト支援装置の構成を示す機能ブロック図である。図１に示すテスト支援装置１は、ループ構造を含むプログラムのシンボリック実行において、ループ構造内部の命令文および分岐を網羅するようなパス条件およびテストデータを無駄なく生成する。
【００２８】
テスト支援装置１は、制御部１０と、記憶部２０とを有する。
【００２９】
制御部１０は、ＣＰＵ（Central  Processing  Unit）などの電子回路に対応する。そして、制御部１０は、各種の処理手順を規定したプログラムや制御データを格納するための内部メモリを有し、これらによって種々の処理を実行する。制御部１０は、ループ構造検出部１１、追加変数導入部１２、追加変数初期化文導入部１３、追加変数加算文導入部１４、追加変数条件式導入部１５、ループ構造網羅率評価部１６および最大ループ実行回数調整部１７を有する。なお、ループ構造検出部１１は、検出部の一例である。追加変数導入部１２、追加変数初期化文導入部１３、追加変数加算文導入部１４および追加変数条件式導入部１５は、変換部の一例である。ループ構造網羅率評価部１６は、生成部の一例である。
【００３０】
記憶部２０は、例えば、ＲＡＭ（Random  Access  Memory）、フラッシュメモリ（Flash  Memory）などの半導体メモリ素子、または、ハードディスク、光ディスクなどの記憶装置である。記憶部２０は、変換後プログラム２１およびパス条件テーブル２２を有する。
【００３１】
変換後プログラム２１は、ループ構造を含むテスト対象のプログラムに追加変数と追加変数条件式を導入して得られた変換後のプログラムである。ここでいう追加変数とは、ループの実行回数（「ループ実行回数」という）を数える変数のことをいい、ループの条件節に追加する変数である。ここでいう追加変数条件式とは、追加変数および最大ループ実行回数を用いる条件式であってループの継続に用いられる条件式のことをいい、ループの条件節に追加する条件式である。最大ループ実行回数は、あらかじめ実験等で調べられ、その情報は記憶部２０に記憶される。なお、条件節とは、例えば、Ｃ言語の場合、ｆｏｒ文の継続条件式のことをいう。一例として、「ｆｏｒ  （ｉ＝０；ｉ＜ｖ：ｉ＋＋）」の中の「ｉ＜ｖ」のことをいう。ｉは、ループ制御変数であり、ｖは、シンボル変数である。
【００３２】
パス条件テーブル２２は、ループ実行回数に応じたパス条件およびテストデータを記憶するテーブルである。テストデータは、シンボリック実行によって得られるパス条件の充足値であり、パス条件内のシンボル変数の値である。
【００３３】
ループ構造検出部１１は、テスト対象のプログラムからループ構造を検出する。例えば、ループ構造検出部１１は、テスト対象のプログラムがＣ言語で記述したソースコードである場合には、ｆｏｒ文やｗｈｉｌｅ文などで表わされるループ構造を検出する。また、ループ構造検出部１１は、テスト対象のプログラムがＣ言語を展開したバイトコード表現と同等のコードに書き換えたコードである場合には、条件分岐と特定行へのジャンプ（例えばｇｏｔｏ文）で表わされるループ構造を検出する。
【００３４】
追加変数導入部１２は、テスト対象のプログラムからループ構造が検出された場合には、テスト対象のプログラムにループ実行回数を数える追加変数を導入する。例えば、追加変数導入部１２は、ループ実行回数を数える追加変数を導入するために用いられる変数宣言文をテスト対象のプログラムに挿入する。一例として、Ｃ言語において変数を宣言するために用いられるキーワードには、「ｉｎｔ」が挙げられる。
【００３５】
追加変数初期化文導入部１３は、テスト対象のプログラムに追加変数を初期化する初期化文を導入する。
【００３６】
追加変数加算文導入部１４は、テスト対象のプログラムに追加変数を加算する加算文を導入する。
【００３７】
追加変数条件式導入部１５は、テスト対象のプログラムに、ループ実行回数を数える追加変数の値が最大ループ実行回数になったか否かを判定する追加変数条件式を挿入する。
【００３８】
ループ構造網羅率評価部１６は、テスト対象のプログラムを変換して得られた変換後プログラム２１に対してシンボリック実行を行い、テストデータを生成する。そして、ループ構造網羅率評価部１６は、生成されたテストデータを用いて、対象のループ構造が網羅されたか否かを評価する。かかるループ構造が網羅されたか否かの評価は、一例として、ループ構造内の全てのステートメントを少なくとも１回実行されるという命令網羅の評価であっても良いし、別の例として、判定による真偽を少なくとも１回実行されるという分岐網羅の評価であっても良い。すなわち、かかるループ構造が網羅されたか否かの評価は、予め定められた論理網羅テストに基づく評価であれば良い。そして、かかる評価は、カバレッジ（網羅率）で表わされる。網羅率とは、所定網羅の評価において、網羅条件がどれだけ実行されたかを割合で表わしたものである。なお、ループ構造が網羅されたか否かの評価は、既存のカバレッジ測定ツールを利用して行えば良い。
【００３９】
最大ループ実行回数調整部１７は、対象のループ構造の網羅率に応じて最大ループ実行回数を調整する。例えば、最大ループ実行回数調整部１７は、最大ループ実行回数で対象のループ構造が網羅されない場合、最大ループ実行回数に関する２分探索を行うことで、最大ループ実行回数を調整する。なお、最大ループ実行回数調整部１７は、対象のループ構造の網羅率だけではなく、シンボリック実行の開始から終了（テストデータの生成）までの時間を考慮して最大ループ実行回数を調整することが望ましい。
【００４０】
一例として、最大ループ実行回数調整部１７は、対象のループ構造が網羅されなかった場合には、最大ループ実行回数を増加させる。また、最大ループ実行回数調整部１７は、シンボリック実行の開始から終了（テストデータの生成）までの時間が予め定められた時間内に終了しなかった場合には、最大ループ実行回数を減少させる。また、最大ループ実行回数調整部１７は、対象のループ構造を網羅する最大ループ実行回数が確認できなかった場合には、網羅率が最も高くなったループ実行回数を最大ループ実行回数として決定する。
【００４１】
［追加変数と追加変数条件式を導入したプログラム］
図２は、追加変数と追加変数条件式を導入したプログラムの一例を示す図である。符号Ｐ０で表わされたプログラムは、テスト対象のプログラムであり、ループ構造を含むプログラムのループ構造部分のソースコードである。テスト対象のプログラムＰ０は、Ｃ言語で記述したソースコードである。テスト対象のプログラムＰ０内の変数ｖは、シンボル変数である。
【００４２】
テスト支援装置１は、テスト対象のプログラムＰ０に追加変数と追加変数条件式を導入して得られる変換後プログラム２１を生成する。
【００４３】
例えば、ループ構造検出部１１が、テスト対象のプログラムＰ０からループ構造を検出したとする。すると、追加変数導入部１２は、テスト対象のプログラムＰ０にループ実行回数を数える追加変数であるｃｏｕｎｔを宣言する。ここでは、「ｉｎｔ」というキーワードを用いて追加変数ｃｏｕｎｔが宣言される（ａ１）。
【００４４】
そして、追加変数初期化文導入部１３は、テスト対象のプログラムＰ０に追加変数ｃｏｕｎｔを初期化する初期化文を導入する。ここでは、追加変数であるｃｏｕｎｔに初期値「０」を設定する初期化文「ｃｏｕｎｔ＝０」が導入される（ａ２）。
【００４５】
そして、追加変数加算文導入部１４は、テスト対象のプログラムＰ０に追加変数を加算する加算文を導入する。ここでは、追加変数であるｃｏｕｎｔを１ずつ加算する加算文「ｃｏｕｎｔ＋＋」が導入される（ａ３）。
【００４６】
そして、追加変数条件式導入部１５は、テスト対象のプログラムＰ０に、追加変数の値が最大ループ実行回数になったか否かを判定する追加変数条件式を挿入する。ここでは、最大ループ実行回数をｃｏｕｎｔ＿ｍａｘとする。すると、追加変数であるｃｏｕｎｔに設定される値が最大ループ実行回数ｃｏｕｎｔ＿ｍａｘになったか否かを判定する追加変数条件式「ｃｏｕｎｔ＜ｃｏｕｎｔ＿ｍａｘ」が挿入される（ａ４）。
【００４７】
この結果、テスト対象のプログラムＰ０に追加変数と追加変数条件式を導入したプログラムＰ１が生成される。そして、符号Ｐ２で表わされたプログラムが、符号Ｐ１で表わされたプログラムのループ構造をバイトコード表現と同等のコードに書き換えたプログラムである。プログラムＰ２の符号ａ１´がプログラムＰ１の符号ａ１に対応する。プログラムＰ２の符号ａ２´がプログラムＰ１の符号ａ２に対応する。プログラムＰ２の符号ａ３´がプログラムＰ１の符号ａ３に対応する。プログラムＰ２の符号ａ４´がプログラムＰ１の符号ａ４に対応する。
【００４８】
図２で示したループ構造を含むプログラムＰ１に対してシンボリック実行で生成されるテストデータについて、図３を参照して説明する。図３は、シンボリック実行で生成されるテストデータの一例を示す図である。なお、最大ループ実行回数であるｃｏｕｎｔ＿ｍａｘは「１」であるとする。
【００４９】
ループ構造網羅率評価部１６は、プログラムＰ１に対してシンボリック実行を行い、テストデータを生成する。ここでは、プログラムＰ１に対するシンボリック実行は、図３右図に示す流れを辿る。そして、シンボリック実行が辿る流れから、図３左図のパス条件テーブル２２が生成される。すなわち、パス条件およびテストデータを含むテストケースが生成される。
【００５０】
ループ実行回数が０でループ実行終了するテストケースでは、ｉに初期値０を代入し、追加変数ｃｏｕｎｔに初期値０を代入したところ「！（０＜ｖ）」というパス条件が積まれる。なお、パス条件には、自明な定数同士の比較は省略される。すなわち、追加変数ｃｏｕｎｔの値「０」と最大ループ実行回数ｃｏｕｎｔ＿ｍａｘの値「１」との比較「０＜１」は省略される。
【００５１】
ループ実行回数が１でループ実行終了するテストケースでは、０＜ｖの条件式がＴｒｕｅである場合の「（０＜ｖ）」というパス条件が積まれる。加えて、ｉに１を加算し、追加変数ｃｏｕｎｔに１を加算したところ「！（１＜ｖ）」というパス条件が積まれる可能性がある。ところが、追加変数ｃｏｕｎｔの値「１」と最大ループ実行回数ｃｏｕｎｔ＿ｍａｘの値「１」との比較「１＜１」は成立しないため、常にＦａｌｓｅとなる。したがって、パス条件には、「！（１＜ｖ）」が積まれず、「（０＜ｖ）」のままとなる。
【００５２】
そして、シンボリック実行によって得られたパス条件の充足値がテストデータとして用いられる。図３左図のループ実行回数が０の場合には、シンボル変数ｖを０としたテストデータが示される。ループ実行回数が１の場合には、シンボル変数ｖを１としたテストデータが示される。
【００５３】
これにより、ループ構造網羅率評価部１６は、ループ構造を含むプログラムＰ１のシンボリック実行において、プログラムＰ１のループ構造の条件式にシンボル変数ｖが用いられている場合に、無駄なパス条件およびテストデータの生成を抑制できる。
【００５４】
ところで、図２で示すプログラムＰ１の場合には、シンボル変数ｖのテストデータが０，１であるが、ループ構造内部の処理によっては、シンボル変数ｖのテストデータが０，１以外の値でないとループ構造が網羅されない場合がある。かかる場合には、最大ループ実行回数ｃｏｕｎｔ＿ｍａｘの値を調整し、シンボル変数ｖが０，１以外の値となるテストデータを生成する必要がある。
【００５５】
［追加変数と追加変数条件式を導入した別のプログラム］
そこで、シンボル変数ｖのテストデータが０，１以外の値でないとループ構造が網羅されない場合のプログラムの一例を、図４を参照して説明する。図４は、追加変数と追加変数条件式を導入した別のプログラムの一例を示す図である。符号Ｐ１０で表わされたプログラムは、テスト対象のプログラムであり、ループ構造を含むプログラムのループ構造部分のソースコードである。テスト対象のプログラムＰ１０は、Ｃ言語で記述したソースコードである。テスト対象のプログラムＰ１０内の変数ｖは、シンボル変数である。そして、プログラムＰ１０のループ構造では、ｉｆ文で（ｉ＞＝１０）の条件が満たされたとき、ループ内部処理ｌｏｏｐ＿ｂｏｄｙ（）が実行される。したがって、ループ実行回数が１１以上でループ内部処理ｌｏｏｐ＿ｂｏｄｙ（）が実行される。そうすると、かかるプログラムＰ１０は、シンボル変数ｖが０，１以外の値でないとループ構造が網羅されない場合のプログラムの一例である。
【００５６】
テスト支援装置１は、テスト対象のプログラムＰ１０に追加変数と追加変数条件式を導入して得られる変換後プログラム２１を生成する。
【００５７】
例えば、ループ構造検出部１１が、テスト対象のプログラムＰ１０からループ構造を検出したとする。すると、追加変数導入部１２は、テスト対象のプログラムＰ１０にループ実行回数を数える追加変数であるｃｏｕｎｔを宣言する。ここでは、「ｉｎｔ」というキーワードを用いて追加変数ｃｏｕｎｔが宣言される（ｂ１）。
【００５８】
そして、追加変数初期化文導入部１３は、テスト対象のプログラムＰ１０に追加変数ｃｏｕｎｔを初期化する初期化文を導入する。ここでは、追加変数であるｃｏｕｎｔに初期値「０」を設定する初期化文「ｃｏｕｎｔ＝０」が導入される（ｂ２）。
【００５９】
そして、追加変数加算文導入部１４は、テスト対象のプログラムＰ１０に追加変数を加算する加算文を導入する。ここでは、追加変数であるｃｏｕｎｔを１ずつ加算する加算文「ｃｏｕｎｔ＋＋」が導入される（ｂ３）。
【００６０】
そして、追加変数条件式導入部１５は、テスト対象のプログラムＰ１０に、追加変数の値が最大ループ実行回数になったか否かを判定する追加変数条件式を挿入する。ここでは、最大ループ実行回数をｃｏｕｎｔ＿ｍａｘとする。すると、追加変数であるｃｏｕｎｔに設定される値が最大ループ実行回数ｃｏｕｎｔ＿ｍａｘになったか否かを判定する追加変数条件式「ｃｏｕｎｔ＜ｃｏｕｎｔ＿ｍａｘ」が挿入される（ｂ４）。
【００６１】
この結果、テスト対象のプログラムＰ１０に追加変数と追加変数条件式を導入したプログラムＰ１１が生成される。そして、符号Ｐ１２で表わされたプログラムが、符号Ｐ１１で表わされたプログラムのループ構造をバイトコード表現と同等のコードに書き換えたプログラムである。プログラムＰ１２の符号ｂ１´がプログラムＰ１１の符号ｂ１に対応する。プログラムＰ１２の符号ｂ２´がプログラムＰ１１の符号ｂ２に対応する。プログラムＰ１２の符号ｂ３´がプログラムＰ１１の符号ｂ３に対応する。プログラムＰ１２の符号ｂ４´がプログラムＰ１１の符号ｂ４に対応する。
【００６２】
図４で示したループ構造を含むプログラムＰ１１に対してシンボリック実行で生成されるテストデータについて、図５を参照して説明する。図５は、シンボリック実行で生成されるテストデータの一例を示す図である。なお、最大ループ実行回数であるｃｏｕｎｔ＿ｍａｘは「１２」であるとする。
【００６３】
ループ構造網羅率評価部１６は、プログラムＰ１１に対してシンボリック実行を行い、テストデータを生成する。ここでは、プログラムＰ１１に対するシンボリック実行は、図５右図に示す流れを辿る。そして、シンボリック実行が辿る流れから、図５左図のパス条件テーブル２２が生成される。すなわち、パス条件およびテストデータを含むテストケースが生成される。
【００６４】
ループ実行回数が０でループ実行終了するテストケースでは、ｉに初期値０を代入し、追加変数ｃｏｕｎｔに初期値０を代入したところ「！（０＜ｖ）」というパス条件が積まれる。なお、パス条件には、自明な定数同士の比較は省略される。すなわち、追加変数ｃｏｕｎｔの値「０」と最大ループ実行回数ｃｏｕｎｔ＿ｍａｘの値「１」との比較「０＜１」は省略される。
【００６５】
ループ実行回数が１でループ実行終了するテストケースでは、０＜ｖの条件式がＴｒｕｅである場合の「（０＜ｖ）」というパス条件が積まれる。加えて、ｉに１を加算し、追加変数ｃｏｕｎｔに１を加算したところ「！（１＜ｖ）」というパス条件が積まれる。
【００６６】
さらに、ループ実行回数に応じたテストケースが繰り返し生成される。
【００６７】
ループ実行回数が１２でループ実行終了するテストケースでは、０＜ｖの条件式がＴｒｕｅである場合の「（０＜ｖ）」というパス条件が積まれる。加えて、ｉに１を加算し、追加変数ｃｏｕｎｔに１を加算したところ「（１＜ｖ）」というパス条件が積まれる。加えて、ｉに１を加算し、追加変数ｃｏｕｎｔに１を加算したところ「（２＜ｖ）」というパス条件が積まれる。同様に、「（３＜ｖ）」，「（４＜ｖ）」，「（５＜ｖ）」，「（６＜ｖ）」，「（７＜ｖ）」，「（８＜ｖ）」，「（９＜ｖ）」，「（１０＜ｖ）」および「（１１＜ｖ）」という各パス条件が積まれる。加えて、ｉに１を加算し、追加変数ｃｏｕｎｔに１を加算したところ「！（１２＜ｖ）」というパス条件が積まれる可能性がある。ところが、追加変数ｃｏｕｎｔの値「１２」と最大ループ実行回数ｃｏｕｎｔ＿ｍａｘの値「１２」との比較「１２＜１２」は成立しないため、常にＦａｌｓｅとなる。したがって、パス条件には、「！（１２＜ｖ）」が積まれず、「（１１＜ｖ）」までの積み上げのままとなる。
【００６８】
そして、シンボリック実行によって得られたパス条件の充足値がテストデータとして用いられる。図５左図のループ実行回数が０の場合には、シンボル変数ｖを「０」としたテストデータが示される。ループ実行回数が１の場合には、シンボル変数ｖを「１」としたテストデータが示される。そして、ループ実行回数が１２の場合には、シンボル変数ｖを「１２」としたテストデータが示される。
【００６９】
そして、ループ構造網羅率評価部１６は、生成されたテストデータを用いて、プログラムＰ１１のループ構造が網羅されたか否かを評価する。ここでは、シンボル変数ｖが１１以上である場合に、ｉｆ文の（ｉ＞＝１０）を満たすため、ループ構造が網羅されたと評価される。つまり、ｉが１０以上のとき、すなわちループ実行回数が１１以上のときに、ｉｆ文の（ｉ＞＝１０）を満たすため、ループ構造が網羅されたと評価される。
【００７０】
これにより、ループ構造網羅率評価部１６は、ループ構造を含むプログラムＰ１１のシンボリック実行において、プログラムＰ１１のループ構造の条件式にシンボル変数ｖが用いられている場合に、無駄なパス条件およびテストデータの生成を抑制できる。
【００７１】
なお、図５では、最大ループ実行回数であるｃｏｕｎｔ＿ｍａｘを「１２」としたが、ｃｏｕｎｔ＿ｍａｘの初期値を「１」としても良い。そして、ループ構造が網羅されない場合やテストデータの生成時間が一定時間を超えた場合に、ｃｏｕｎｔ＿ｍａｘを変更するようにしても良い。例えば、最大ループ実行回数であるｃｏｕｎｔ＿ｍａｘが「２０」以下である場合に予め指定された時間内でテストデータの生成が終了するとする。また、最大ループ実行回数であるｃｏｕｎｔ＿ｍａｘの最大値が「１００」であるとする。
【００７２】
かかる例では、ループ構造網羅率評価部１６は、プログラムＰ１１に対してシンボリック実行を行い、ｃｏｕｎｔ＿ｍａｘを初期値「１」としてテストデータを生成する。かかる場合には、ループ実行回数が０，１のテストデータが生成される。そして、ループ構造網羅率評価部１６は、生成されたテストデータを用いて、対象のループ構造が網羅されたか否かを評価する。ここでは、ループ実行回数（ｃｏｕｎｔ）が１１未満であるため、ループ構造が網羅されないと評価される。
【００７３】
そして、最大ループ実行回数調整部１７は、ｃｏｕｎｔ＿ｍａｘを最大ループ実行回数の最大値「１００」に調整する。そして、ループ構造網羅率評価部１６は、調整したｃｏｕｎｔ＿ｍａｘを用いてテストデータを生成する。ところが、ループ構造網羅率評価部１６は、テストデータの生成時間が一定時間内に終了しないと判定する。
【００７４】
そして、最大ループ実行回数調整部１７は、最大ループ実行回数の最大値「１００」と最大ループ実行回数の初期値「１」との間の２分探索によりｃｏｕｎｔ＿ｍａｘを「５０」に調整する。そして、ループ構造網羅率評価部１６は、調整したｃｏｕｎｔ＿ｍａｘを用いてテストデータを生成する。ところが、ループ構造網羅率評価部１６は、テストデータの生成時間が一定時間内に終了しないと判定する。
【００７５】
そして、最大ループ実行回数調整部１７は、最大ループ実行回数の最大値「５０」と最大ループ実行回数の初期値「１」との間の２分探索によりｃｏｕｎｔ＿ｍａｘを「２５」に調整する。そして、ループ構造網羅率評価部１６は、調整したｃｏｕｎｔ＿ｍａｘを用いてテストデータを生成する。ところが、ループ構造網羅率評価部１６は、テストデータの生成時間が一定時間内に終了しないと判定する。
【００７６】
そして、最大ループ実行回数調整部１７は、最大ループ実行回数の最大値「２５」と最大ループ実行回数の初期値「１」との間の２分探索によりｃｏｕｎｔ＿ｍａｘを「１２」に調整する。そして、ループ構造網羅率評価部１６は、調整したｃｏｕｎｔ＿ｍａｘを用いてテストデータを生成する。かかる場合には、ループ実行回数が０〜１２のテストデータが生成される。ここでは、ループ構造網羅率評価部１６は、テストデータの生成時間が一定時間内に終了すると判定する。そして、ループ構造網羅率評価部１６は、生成されたテストデータを用いて、対象のループ構造が網羅されたか否かを評価する。ここでは、ループ実行回数（ｃｏｕｎｔ）が１１以上であるため、ループ構造が網羅されると評価される。
【００７７】
そして、最大ループ実行回数調整部１７は、テストデータの生成が一定時間内に終了し、且つ、ループ構造が網羅されたので、ループ構造の最大ループ実行回数を「１２」に決定する。
【００７８】
これにより、ループ構造網羅率評価部１６は、調整された最大ループ実行回数を用いることで、ループ構造を含むプログラムＰ１１のシンボリック実行において、無駄なパス条件およびテストデータの生成を抑制することができる。
【００７９】
［テスト支援処理のフローチャート］
図６は、実施例に係るテスト支援処理のフローチャートの一例を示す図である。なお、ループ構造検出部１１は、テスト対象のプログラムｐを受け取ったものとする。
【００８０】
図６に示すように、ループ構造検出部１１は、最大ループ実行回数（ｃｏｕｎｔ＿ｍａｘ）を「１」に設定する（ステップＳ１１）。そして、ループ構造検出部１１は、受け取ったプログラムｐに、追加変数（ｃｏｕｎｔ）および追加変数条件式が導入されていないループ構造があるか否かを判定する（ステップＳ１２）。追加変数は、ループ実行回数を数える変数である。追加変数条件式は、追加変数および最大ループ実行回数を用いる条件式であってループの継続および終了に用いられる条件式である。
【００８１】
追加変数および追加変数条件式が導入されていないループ構造がないと判定した場合には（ステップＳ１２；Ｎｏ）、ループ構造検出部１１は、テスト支援処理を終了する。
【００８２】
一方、追加変数および追加変数条件式が導入されていないループ構造があると判定した場合には（ステップＳ１２；Ｙｅｓ）、追加変数導入部１２は、プログラムｐに追加変数を導入する（ステップＳ１３）。加えて、追加変数初期化文導入部１３は、プログラムｐに追加変数の初期化文を導入する（ステップＳ１４）。加えて、追加変数加算文導入部１３は、プログラムｐに追加変数の加算文を導入する（ステップＳ１５）。加えて、追加変数条件式導入部１５は、プログラムｐに追加変数条件式を導入する（ステップＳ１６）。
【００８３】
そして、ループ構造網羅率評価部１６は、プログラムｐを変換して得られた変換後プログラム２１に対してシンボリック実行を行い、テストデータを生成する（ステップＳ１７）。そして、ループ構造網羅率評価部１６は、ループ内部の網羅率を算出する（ステップＳ１８）。
【００８４】
そして、最大ループ実行回数調整部１７は、一定時間内にテスト生成を完了し、且つ、ループ内部を網羅しているか否かを判定する（ステップＳ１９）。一定時間内にテスト生成を完了し、且つ、ループ内部を網羅していると判定した場合には（ステップＳ１９；Ｙｅｓ）、最大ループ実行回数調整部１７は、最大ループ実行回数を現に設定されている値に決定する。そして、最大ループ実行回数調整部１７は、次のループ構造を検出させるべく、ステップＳ１２に移行する。
【００８５】
一方、一定時間内にテスト生成を完了していない、または、ループ内部を網羅していないと判定した場合には（ステップＳ１９；Ｎｏ）、最大ループ実行回数調整部１７は、最大ループ実行回数の２分探索を完了したか否かを判定する（ステップＳ２０）。最大ループ実行回数の２分探索を完了したと判定した場合には（ステップＳ２０；Ｙｅｓ）、最大ループ実行回数調整部１７は、最大ループ実行回数を、網羅率が最も高いループ実行回数に決定する。そして、最大ループ実行回数調整部１７は、次のループ構造を検出させるべく、ステップＳ１２に移行する。
【００８６】
一方、最大ループ実行回数の２分探索を完了していないと判定した場合には（ステップＳ２０；Ｎｏ）、最大ループ実行回数調整部１７は、最大ループ実行回数の２分探索処理を実行する（ステップＳ２１）。なお、最大ループ実行回数の２分探索処理のフローチャートは、後述する。
【００８７】
そして、最大ループ実行回数調整部１７は、最大ループ実行回数の２分探索処理によって設定された値に最大ループ実行回数を更新する（ステップＳ２２）。そして、最大ループ実行回数調整部１７は、更新した最大ループ実行回数を用いてテストデータを生成させるべく、ステップＳ１７に移行する。
【００８８】
［最大ループ実行回数の２分探索処理のフローチャート］
図７は、最大ループ実行回数の２分探索処理のフローチャートの一例を示す図である。
【００８９】
図７に示すように、最大ループ実行回数調整部１７は、２分探索処理の初回であるか否かを判定する（ステップＳ３１）。２分探索処理の初回であると判定した場合には（ステップＳ３１；Ｙｅｓ）、最大ループ実行回数調整部１７は、最大ループ実行回数を予め定められた値に設定する（ステップＳ３２）。予め定められた値は、例えば、最大ループ実行回数の最大値である。そして、最大ループ実行回数調整部１７は、最大ループ実行回数の２分探索処理を終了する。
【００９０】
一方、２分探索処理の初回でないと判定した場合には（ステップＳ３１；Ｎｏ）、最大ループ実行回数調整部１７は、最大ループ実行回数を、現在の最大ループ実行回数を２で除算して得られた商の値に設定する（ステップＳ３３）。そして、最大ループ実行回数調整部１７は、最大ループ実行回数の２分探索処理を終了する。
【００９１】
［実施例の効果］
上記実施例によれば、テスト支援装置１は、テスト対象のプログラムから、ループ構造を検出する。ループ構造は、ループ制御変数を変化させてループ制御変数とシンボル変数とを用いたループの継続条件を示す第１の条件式に合致する場合に特定の処理を実行し、合致しない場合にループを終了することを示す。テスト支援装置１は、テスト対象のプログラムを、検出したループ構造の第１の条件式にループの実行回数をカウントするループカウント変数と予め定められたループの終了回数とを用いた第２の条件式を加えた条件式を含むプログラムに変換する。そして、テスト支援装置１は、変換したプログラムをシンボリック実行する際に、ループカウント変数がループの終了回数に至るまで、以下の処理を行う。テスト支援装置１は、ループカウント変数が示すループの実行回数に応じたシンボル変数を用いたパス条件を生成し、生成したパス条件を満たすシンボル変数のテストデータを生成する。かかる構成によれば、テスト支援装置１は、テスト対象のプログラムのループ構造の条件式に数値を代表するシンボル変数が用いられている場合であっても、無駄なパス条件およびテストデータの生成を抑制することができる。
【００９２】
また、上記実施例によれば、テスト支援装置１は、生成したシンボル変数のテストデータを用いて、ループ構造が網羅されているか否かを判定し、ループ構造が網羅されない場合には、ループの終了回数を調整する。かかる構成によれば、テスト支援装置１は、ループ構造が網羅されるように、ループの終了回数を調整することで、最適な数のテストケースを生成することができる。
【００９３】
また、上記実施例によれば、テスト支援装置１は、予め定められたループの終了回数に関する２分探索により、前記ループの終了回数を調整する。かかる構成によれば、テスト支援装置１は、ループの終了回数の最適な数を高速に探索することができる。
【００９４】
また、上記実施例によれば、テスト支援装置１は、ループカウント変数が該調整されたループの終了回数に至るまで、ループカウント変数が示すループの実行回数に応じたシンボル変数を用いたパス条件を生成する。テスト支援装置１は、生成したパス条件を満たすシンボル変数のテストデータを生成する。そして、テスト支援装置１は、ループ構造が網羅されない場合には、ループの終了回数を、網羅率が最も高いループの終了回数に調整する。かかる構成によれば、テスト支援装置１は、ループの終了回数によってループ構造が網羅されない場合であっても、ループ構造の網羅率が最も高いループの終了回数を探索することができる。
【００９５】
［その他］
なお、上記実施例では、ループ構造を含むテスト対象のプログラムをＣ言語として説明した。しかしながら、ループ構造を含むテスト対象のプログラムは、Ｃ言語に限定されず、ＪａｖａＳｃｒｉｐｔ（登録商標）であっても良いし、ループ構造を含むプログラムであれば、いかなる言語であっても良い。
【００９６】
また、図示したテスト支援装置１の各構成要素は、必ずしも物理的に図示の如く構成されていることを要しない。すなわち、テスト支援装置１の分散・統合の具体的態様は図示のものに限られず、その全部または一部を、各種の負荷や使用状況などに応じて、任意の単位で機能的または物理的に分散・統合して構成することができる。例えば、追加変数導入部１２、追加変数初期化文導入部１３、追加変数加算文導入部１４および追加変数条件式導入部１５を１つの部として統合しても良い。また、ループ構造網羅率評価部１６を、変換後プログラム２１に対してシンボリック実行を行う実行部と、変換後プログラム２１のループ構造の網羅率を算出する算出部と、網羅率からループ構造が網羅されたか否か評価する評価部とに分散しても良い。また、記憶部２０をテスト支援装置１の外部装置としてネットワーク経由で接続するようにしても良い。
【００９７】
また、上記実施例で説明した各種の処理は、予め用意されたプログラムをパーソナルコンピュータやワークステーションなどのコンピュータで実行することによって実現することができる。そこで、以下では、図１に示したテスト支援装置１と同様の機能を実現するテスト支援プログラムを実行するコンピュータの一例を説明する。図８は、テスト支援プログラムを実行するコンピュータの一例を示す図である。
【００９８】
図８に示すように、コンピュータ２００は、各種演算処理を実行するＣＰＵ２０３と、ユーザからのデータの入力を受け付ける入力装置２１５と、表示装置２０９を制御する表示制御部２０７とを有する。また、コンピュータ２００は、記憶媒体からプログラムなどを読取るドライブ装置２１３と、ネットワークを介して他のコンピュータとの間でデータの授受を行う通信制御部２１７とを有する。また、コンピュータ２００は、各種情報を一時記憶するメモリ２０１と、ＨＤＤ２０５を有する。そして、メモリ２０１、ＣＰＵ２０３、ＨＤＤ２０５、表示制御部２０７、ドライブ装置２１３、入力装置２１５、通信制御部２１７は、バス２１９で接続されている。
【００９９】
ドライブ装置２１３は、例えばリムーバブルディスク２１１用の装置である。ＨＤＤ２０５は、テスト支援プログラム２０５ａおよびテスト支援関連情報２０５ｂを記憶する。
【０１００】
ＣＰＵ２０３は、テスト支援プログラム２０５ａを読み出して、メモリ２０１に展開し、プロセスとして実行する。かかるプロセスは、テスト支援装置１の各機能部に対応する。テスト支援関連情報２０５ｂは、変換後プログラム２１およびパス条件テーブル２２に対応する。そして、例えばリムーバブルディスク２１１が、テスト支援プログラム２０５ａなどの各情報を記憶する。
【０１０１】
なお、テスト支援プログラム２０５ａについては、必ずしも最初からＨＤＤ２０５に記憶させておかなくても良い。例えば、コンピュータ２００に挿入されるフレキシブルディスク（ＦＤ）、ＣＤ−ＲＯＭ、ＤＶＤディスク、光磁気ディスク、ＩＣカードなどの「可搬用の物理媒体」に当該プログラムを記憶させておく。そして、コンピュータ２００がこれらからテスト支援プログラム２０５ａを読み出して実行するようにしても良い。
【符号の説明】
【０１０２】
１  テスト支援装置
１０  制御部
１１  ループ構造検出部
１２  追加変数導入部
１３  追加変数初期化文導入部
１４  追加変数加算文導入部
１５  追加変数条件式導入部
１６  ループ構造網羅率評価部
１７  最大ループ実行回数調整部
２０  記憶部
２１  変換後プログラム
２２  パス条件テーブル
【図１】
2018136704.tif 000003
【図２】
2018136704.tif 000004
【図３】
2018136704.tif 000005
【図４】
2018136704.tif 000006
【図５】
2018136704.tif 000007
【図６】
2018136704.tif 000008
【図７】
2018136704.tif 000009
【図８】
2018136704.tif 000010
【図９】
2018136704.tif 000011
【図１０】
2018136704.tif 000012
【図１１】
2018136704.tif 000013
【図１２】
2018136704.tif 000014