(57)【要約】      （修正有）【課題】下位関数から順番に記号実行を実施することで自動的に下位関数の単体テストの結果相当のデータを生成する。【解決手段】プロセッサとメモリを有する計算機でソースコードのテストケースを生成するテストケース生成方法であって、計算機がソースコードを読み込み、ソースコード内の関数情報を解析して、呼出し側関数内の経路を網羅するために必要となる被呼出し側関数の戻り値を解析する。また、計算機は、被呼出し側関数の入力値と出力値を用いて、呼出し側関数内の被呼出し側関数の呼出し箇所に所定の簡略化処理を実施し、呼出し側関数と被呼出し側関数の全ての関数内の経路を網羅する入力値を所定の順序で生成する。【選択図】図２
2018147114.tif 000002
【特許請求の範囲】
【請求項１】
プロセッサとメモリを有する計算機でソースコードのテストケースを生成するテストケース生成方法であって、
前記計算機が、前記ソースコードを読み込む第１のステップと、
前記計算機が、前記ソースコード内の関数情報を解析して、呼出し側関数内の経路を網羅するために必要となる被呼出し側関数の戻り値を解析する第２のステップと、
前記計算機が、前記被呼出し側関数の入力値と出力値を用いて、呼出し側関数内の被呼出し側関数の呼出し箇所に所定の簡略化処理を実施する第３のステップと、
前記計算機が、前記呼出し側関数と被呼出し側関数の全ての関数内の経路を網羅する入力値を所定の順序で生成する第４のステップと、
を含むことを特徴とするテストケース生成方法。
【請求項２】
請求項１に記載のテストケース生成方法であって、
前記第４のステップは、
前記呼出し側関数と被呼出し側関数の呼出し関係に基づいて、前記入力値を生成する順序を決定するステップを含むことを特徴とするテストケース生成方法。
【請求項３】
請求項２に記載のテストケース生成方法であって、
前記第４のステップは、
前記入力値を生成する順序を、前記被呼出し側関数のうち最下位の関数から前記呼出し側関数へ向けて順次決定することを特徴とするテストケース生成方法。
【請求項４】
請求項１に記載のテストケース生成方法であって、
前記第２のステップは、
前記被呼出し側関数の呼出し箇所を仮変数に置き換えるステップと、
前記仮変数を記号値として記号実行し、前記被呼出し側関数の入力値を生成するステップと、
を含むことを特徴とするテストケース生成方法。
【請求項５】
請求項１に記載のテストケース生成方法であって、
前記第３のステップは、
前記簡略化処理として、前記被呼出し側関数の呼出し箇所を、当該被呼出し側関数の入力値と出力値に基づく条件分岐に置き換え、
前記第４のステップは、
前記条件分岐に対して記号実行を実施して入力値を生成することを特徴とするテストケース生成方法。
【請求項６】
プロセッサとメモリを有してソースコードのテストケースを生成する計算機であって、
前記ソースコードを読み込んで、前記ソースコード内の関数情報を解析して、呼出し側関数内の経路を網羅するために必要となる被呼出し側関数の戻り値を解析する関数情報解析部と、
前記被呼出し側関数の入力値と出力値を用いて、呼出し側関数内の被呼出し側関数の呼出し箇所に所定の簡略化処理を実施し、前記呼出し側関数と被呼出し側関数の全ての関数内の経路を網羅する入力値を所定の順序で生成するテストケース生成部と、
を有することを特徴とする計算機。
【請求項７】
請求項６に記載の計算機であって、
前記呼出し側関数と被呼出し側関数の呼出し関係に基づいて、前記入力値を生成する順序を決定する入力値生成順序決定部をさらに有することを特徴とする計算機。
【請求項８】
請求項７に記載の計算機であって、
前記入力値生成順序決定部は、
前記入力値を生成する順序を、前記被呼出し側関数のうち最下位の関数から前記呼出し側関数へ向けて順次決定することを特徴とする計算機。
【請求項９】
請求項６に記載の計算機であって、
前記関数情報解析部は、
前記被呼出し側関数の呼出し箇所を仮変数に置き換えるステップと、
前記仮変数を記号値として記号実行し、前記被呼出し側関数の入力値を生成するステップと、
を含むことを特徴とする計算機。
【請求項１０】
請求項６に記載の計算機であって、
前記テストケース生成部は、
前記簡略化処理として、前記被呼出し側関数の呼出し箇所を、当該被呼出し側関数の入力値と出力値に基づく条件分岐に置き換え、前記条件分岐に対して記号実行を実施して入力値を生成することを特徴とする計算機。
【請求項１１】
プロセッサとメモリを有する計算機を制御するためのプログラムであって、
ソースコードを読み込む第１のステップと、
前記ソースコード内の関数情報を解析して、呼出し側関数内の経路を網羅するために必要となる被呼出し側関数の戻り値を解析する第２のステップと、
前記被呼出し側関数の入力値と出力値を用いて、呼出し側関数内の被呼出し側関数の呼出し箇所に所定の簡略化処理を実施する第３のステップと、
前記呼出し側関数と被呼出し側関数の全ての関数内の経路を網羅する入力値を所定の順序で生成する第４のステップと、
を前記計算機に実行させるためのプログラム。
【請求項１２】
請求項１１に記載のプログラムであって、
前記第４のステップは、
前記呼出し側関数と被呼出し側関数の呼出し関係に基づいて、前記入力値を生成する順序を決定するステップを含むことを特徴とするプログラム。
【請求項１３】
請求項１２に記載のプログラムであって、
前記第４のステップは、
前記入力値を生成する順序を、前記被呼出し側関数のうち最下位の関数から前記呼出し側関数へ向けて順次決定することを特徴とするプログラム。
【請求項１４】
請求項１１に記載のプログラムであって、
前記第２のステップは、
前記被呼出し側関数の呼出し箇所を仮変数に置き換えるステップと、
前記仮変数を記号値として記号実行し、前記被呼出し側関数の入力値を生成するステップと、
を含むことを特徴とするプログラム。
【請求項１５】
請求項１１に記載のプログラムであって、
前記第３のステップは、
前記簡略化処理として、前記被呼出し側関数の呼出し箇所を、当該被呼出し側関数の入力値と出力値に基づく条件分岐に置き換え、
前記第４のステップは、
前記条件分岐に対して記号実行を実施して入力値を生成することを特徴とするプログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、ソフトウェアのテストにおいて記号実行技術を用いてテストケースを自動生成する技術に関する。
【背景技術】
【０００２】
ソフトウェアのテストを行う技術として、記号実行技術が知られている。記号実行とは関数の入力値を１、１０などの具体的な数値ではなく、ｘ、ｙなどの記号値として実行する技術である(例えば非特許文献１を参照)。
【０００３】
記号実行技術を用いてプログラムの経路を解析することができ、プログラムの経路を網羅するようなテストケースを得ることができる。
【先行技術文献】
【非特許文献】
【０００４】
【非特許文献１】吉原  慧、高田 眞吾、"記号的実行による統合テスト用テストデータ自動生成"、情報処理学会第72回全国大会講演論文集、2P-5、2010年3月8日、P1-467〜P1-468頁
【発明の概要】
【発明が解決しようとする課題】
【０００５】
記号実行技術の問題として、プログラムが大規模、複雑になると経路の組合せ爆発により計算時間が膨大になるということが知られている。これに対して、前記非特許文献１には、記号実行の際に下位関数の呼出し箇所を記号実行せずに、単体テスト結果に置き換えることにより、経路の組合せ爆発を抑制する方法が公開されている。
【０００６】
しかし、非特許文献１には、単体テストの結果を用意する方法について具体的に明示されていない。また、非特許文献１には、用意する単体テストの具体的な入力値によっては、呼出し側関数の経路を網羅するために必要な出力値が得られず、生成されるテストケースの網羅性が低下するという問題があった。
【０００７】
そこで、本発明では、下位関数から順番に記号実行を実施することで自動的に下位関数の単体テストの結果相当のデータを生成し、また、記号実行を用いて経路を網羅するために必要な出力値を準備することで生成されるテストケースの網羅性を確保する方法を提供する。
【課題を解決するための手段】
【０００８】
本発明は、プロセッサとメモリを有する計算機でソースコードのテストケースを生成するテストケース生成方法であって、前記計算機が、前記ソースコードを読み込む第１のステップと、前記計算機が、前記ソースコード内の関数情報を解析して、呼出し側関数内の経路を網羅するために必要となる被呼出し側関数の戻り値を解析する第２のステップと、前記計算機が、前記被呼出し側関数の入力値と出力値を用いて、呼出し側関数内の被呼出し側関数の呼出し箇所に所定の簡略化処理を実施する第３のステップと、前記計算機が、前記呼出し側関数と被呼出し側関数の全ての関数内の経路を網羅する入力値を所定の順序で生成する第４のステップと、を含む。
【発明の効果】
【０００９】
本発明によれば、記号実行技術を用いてテストケースを生成する際に、生成されるテストケースによるプログラムの実行経路の網羅性を低下させずに、計算量を削減する事ができる。
【図面の簡単な説明】
【００１０】
【図１】本発明の実施例を示し、テストケース生成システムのハードウェア構成を示すブロック図である。
【図２】本発明の実施例を示し、テストケース生成システムのソフトウェア部分の構成を示すブロック図である。
【図３】本発明の実施例を示し、テストケースの生成対象となるソースコードの一例を示す図である。
【図４】本発明の実施例を示し、関数情報記憶部のデータ構造を示す図である。
【図５】本発明の実施例を示し、テストケース情報記憶部のデータ構造を示す図である。
【図６】本発明の実施例を示し、コールグラフの一例を示す図である。
【図７】本発明の実施例を示し、必要戻り値解析処理の一例を示す図である。
【図８】本発明の実施例を示し、テストケース生成処理の一例を示す図である。
【図９】本発明の実施例を示し、テストケース生成処理の一例を示す図である。
【図１０】本発明の実施例を示し、全体の処理の一例を示すフローチャートである。
【図１１】本発明の実施例を示し、関数情報解析処理の一例を示すフローチャートである。
【図１２】本発明の実施例を示し、入力値生成順序決定処理の一例を示すフローチャートである。
【図１３】本発明の実施例を示し、必要戻り値解析処理の一例を示すフローチャートである。
【図１４】本発明の実施例を示し、入力値生成処理の一例を示すフローチャートである。
【図１５】従来の問題点の一例を示す図である。
【発明を実施するための形態】
【００１１】
以下、本発明に係るテストケース生成システムの一実施例について説明する。
【００１２】
図１は、本発明の実施例を示し、テストケース生成装置１のハードウェア構成を示すブロック図である。
【００１３】
図１に示すようにテストケース生成装置１は、例えば、パーソナルコンピュータやサーバや専用ハードウェアなどであり、ＣＰＵ（Central Processing Unit）４と、ＲＯＭ（Read Only Memory）５と、ＲＡＭ（Random Access Memory）６と、ＨＤＤ（Hard Disk Drive）７と、入力装置９と、表示装置１０と、通信Ｉ／Ｆ１１と、ＣＤＲＯＭドライブ１２が、ＢＵＳ８により接続された計算機である。
【００１４】
ＣＰＵ４は、コンピュータの主要な部分であって、演算処理および各部を制御するデバイスであり、ＨＤＤ７に格納されたプログラムを、ＲＡＭ６にロードして実行する。ＲＯＭ５は、起動プログラムであるＢＩＯＳやＵＥＦＩなどを記憶する読み出し専用の半導体記憶装置である。
【００１５】
ＲＡＭ６は、ＯＳ（Operating System）やアプリケーションソフトウェアなどの各種プログラムやワークデータ等を記憶する書き換え可能な半導体記憶装置であり、テストケース生成装置１の主記憶装置である。
ＨＤＤ７は、大容量の記憶装置であり、ＯＳやアプリケーションソフトウェアなどの各種プログラムや、プログラムに使用されるデータなどを格納する補助記憶装置である。ＣＤＲＯＭドライブ１２は、ＣＤＲＯＭ（Compact Disc Read Only Memory）１２Ａに記憶されたプログラムやデータを読み取る装置である。
【００１６】
通信Ｉ／Ｆ１１は、ネットワーク（図示省略）との通信を制御する装置である。入力装置９は、各種操作指示を行うキーボードやマウスなどのポインティングデバイスである。表示装置８は、各種情報を表示するＬＣＤ（Liquid Crystal Display）などの表示のための装置である。
【００１７】
なお、各種プログラムやデータ等を格納するのは、ＨＤＤ７に限らずＳＳＤ（Solid State Drive）などの半導体記憶装置なども用いることができ、記憶媒体としてはＣＤＲＯＭ１２Ａに限らずＤＶＤやその他の磁気、光学、半導体などを用いた媒体を用いることができる。また、通信Ｉ／Ｆ１１を介してネットワーク（図示省略）からプログラムやデータをダウンロードしてＨＤＤ７やＲＡＭ６に記憶してもよい。なお、プログラムやデータは、特定のＯＳ上で稼働するか、ＯＳを必要としないか、特定のＯＳやアプリケーション群を構成するファイルの一部であるかは問わない。
【００１８】
本実施形態のテストケース生成装置１は、図１に示したハードウェア構成で、ＨＤＤ７に格納されたアプリケーションソフトウェアが、ＲＡＭ６にロードされて、ＣＰＵ４がプログラムを解釈実行することにより、その機能が実行される。
【００１９】
図２は、テストケース生成装置１のソフトウェア部分の構成を示すブロック図である。
【００２０】
図２に示すように、テストケース生成装置１のソフトウェア部分は、テストケース生成プログラム１３と記憶部１４と記号実行部２２より構成される。
【００２１】
テストケース生成プログラム１３はテストケース生成装置１のアプリケーションソフトウェアであり、ソースコード内の関数定義を解析し関数情報を関数情報記憶部に格納する関数情報解析部１５と、関数間の呼出し関係に基づき関数のテスト入力値を生成する順序を決定する入力値生成順序決定部１６と、呼出し側関数内の経路を網羅するために必要となる被呼出し側関数の戻り値を解析する必要戻り値解析部１７と、呼出し側と被呼出し側全ての関数内の経路を網羅するためのテスト入力値を生成するテストケース生成部１８を有する。
【００２２】
なお、本実施例の経路とは、関数の出力値や条件分岐によって異なる処理を実行する手順の集合とする。
【００２３】
記憶部１４はテストケース生成装置１の記憶領域で、テストケース生成対象のソースコードが格納されているソースコード記憶部１９と、テストケース生成プログラム１３に使用されるデータベースでありテストケース生成対象となる関数の情報を記憶する関数情報記憶部２０と、テストケース生成プログラム１３に使用されるデータベースであり、生成されたテストケースの情報を記憶するテストケース情報記憶部２１を有する。記憶部１４は、例えば、ＨＤＤ７等の記憶領域に設定することができる。
【００２４】
記号実行部２２はテストケース生成プログラム１３に使用される外部モジュールであり、前記背景技術の非特許文献１で述べた記号実行技術を用いて経路を網羅するための関数の入力値及び出力値を生成する機能を有する。
【００２５】
関数情報解析部１５と、入力値生成順序決定部１６と、必要戻り値解析部１７と、テストケース生成部１８の各機能部はプログラムとしてＲＡＭ６にロードされる。
【００２６】
ＣＰＵ４は、各機能部のプログラムに従って処理することによって、所定の機能を提供する機能部として稼働する。例えば、ＣＰＵ４は、関数情報解析プログラムに従って処理することで関数情報解析部１５として機能する。他のプログラムについても同様である。さらに、ＣＰＵ４は、各プログラムが実行する複数の処理のそれぞれの機能を提供する機能部としても稼働する。計算機及び計算機システムは、これらの機能部を含む装置及びシステムである。
【００２７】
テストケース生成装置１の各機能を実現するプログラム、テーブル等の情報は、ＨＤＤ７や不揮発性半導体メモリ、ＳＳＤ等の記憶デバイス、または、ＩＣカード、ＳＤカード、ＤＶＤ等の計算機読み取り可能な非一時的データ記憶媒体に格納することができる。
【００２８】
図３は、ソースコード記憶部１９に格納されているテストケース生成対象のソースコードの一例を示す図である。
【００２９】
ソースコード３０は、関数ｆｕｎｃＡ（３１）と、関数ｆｕｎｃＢ（３２）と、関数ｆｕｎｃＣ（３３）と、関数ｆｕｎｃＤ（３４）を含み、関数ｆｕｎｃＢ（３２）には関数ｆｕｎｃＤ（３４）の演算結果が含まれている。
【００３０】
図４は、関数情報記憶部２０のデータ構造の一例を示す図である。関数情報記憶部２０は、関数ＩＤフィールド２０Ａと、関数名フィールド２０Ｂと、呼出し関数リストフィールド２０Ｃと、入力値生成順序フィールド２０Ｄと、必要戻り値リストフィールド２０Ｅとを一つのレコードに含む。
【００３１】
関数ＩＤフィールド２０Ａは、関数を一意に識別するための識別情報を格納する。関数名フィールド２０Ｂは、当該関数の名前を格納する。呼出し関数リストフィールド２０Ｃは、当該関数が関数の処理の中で呼出ししている他の関数全ての名前をリスト形式で格納する。
【００３２】
入力値生成順序フィールド２０Ｄは、入力値生成順序決定部１６によって決定された当該関数の入力値生成順序を格納する。必要戻り値リストフィールド２０Ｅは、必要戻り値解析部１７によって算出された当該関数を呼出す関数の経路を網羅するために必要となる当該関数の戻り値全てをリスト形式で格納する。
【００３３】
図５は、テストケース情報記憶部２１のデータ構造の一例を示す図である。
【００３４】
テストケース情報記憶部２１は、テストケースＩＤフィールド２１Ａと、関数ＩＤフィールド２１Ｂと、入力値リストフィールド２１Ｃと、出力値フィールド２１Ｄを一つのレコードに含む。
【００３５】
テストケースＩＤフィールド２１Ａは、テストケースを一意に識別するための識別情報を格納する。関数ＩＤフィールド２１Ｂは、当該テストケースが対象とする関数の識別情報を格納する。
【００３６】
入力値リストフィールド２１Ｃは、当該テストケースにおける関数の入力値全てを第一引数から順番にリスト形式で格納する。出力値フィールド２１Ｄは、当該テストケースを実行した際の関数の出力値を格納する。
【００３７】
図１０は、テストケース生成プログラム１３が実行する全体の処理の一例を示すフローチャートである。
【００３８】
まず、ステップＳ１０１の関数情報解析処理において、関数情報解析部１５がソースコード記憶部１９からソースコードを読み込み、ソースコード内の関数定義を解析し、関数の呼出し関係に関する情報を関数情報記憶部２０に格納する。
【００３９】
次に、ステップＳ１０２の入力値生成順序決定処理において、入力値生成順序決定部１６が上記ステップＳ１０１の解析で得られた関数間の呼出し関係に基づき、関数のテスト入力値を生成する順序を決定し、関数情報記憶部２０に格納する。
【００４０】
次に、ステップＳ１０３の必要戻り値解析処理において、必要戻り値解析部１７が呼出し側の関数内の経路を網羅するために必要となる被呼出し側関数の戻り値を解析し、得られた戻り値のリストを関数情報記憶部２０に格納する。
【００４１】
次に、ステップＳ１０４の入力値生成処理において、テストケース生成部１８が上記ステップＳ１０２で決定された入力値生成順序に従い、各関数について下位の関数から順番に、被呼出し関数を含む全ての関数内の経路を網羅するためのテスト入力値を生成する。
【００４２】
この際に、テストケース生成部１８は、上記ステップＳ１０３で得られた必要戻り値リストと、ステップＳ１０４の入力値生成の過程で得られる被呼出し関数の入力値及び出力値を用いて入力値生成対象関数の一部を書き換えた入力値生成用関数を生成して記号実行を行う。これにより、生成されるテストケースの網羅性を低下させずに、計算量を削減する効果を得る。
【００４３】
最後に、ステップＳ１０５において、テストケース生成部１８は、生成された各関数のテスト入力値をテストケースとしてファイルなどに出力し、テストケース生成プログラム１３の処理を終了する。
【００４４】
上記処理により、テストケース情報記憶部２１には、関数ＩＤ毎に処理の経路を網羅するのに必要な入力値リスト２１Ｃと、出力値フィールド２１Ｄが格納される。記号実行部２２は、ソースコードに対応する入力値リストフィールド２１Ｃを用いることで、ソースコードの処理の経路を全て網羅据えることが可能となる。
【００４５】
以下、各ステップで行われる処理の詳細について図１１、図１２、図１３、図１４のフローチャートを用いて説明する。
【００４６】
図１１は、ステップＳ１０１の関数情報解析処理の詳細を示すフローチャートである。
【００４７】
まず、ステップＳ１１１において、関数情報解析部１５が、ソースコード記憶部１９に格納されているソースコードを読み込む。
【００４８】
次に、ステップＳ１１２において、関数情報解析部１５が、ソースコード内のまだ解析していない一つの関数定義を解析し、関数名と関数の処理の中で呼出ししている他の関数全ての名前を取得する。
【００４９】
次に、ステップＳ１１３において、関数情報解析部１５が、ステップＳ１１２で取得した関数名について関数情報記憶部２０に新規のデータを登録し、一意に識別可能な関数ＩＤを関数ＩＤフィールド２０Ａに格納し、ステップＳ１１２で取得した関数名を関数名フィールド２０Ｂに格納し、当該関数の処理の中で呼出ししている他の関数全ての名前をリスト形式で呼出しし関数リストフィールド２０Ｃに格納する。
【００５０】
次に、ステップＳ１１４において、関数情報解析部１５が、ソースコード内の全ての関数定義を解析したか否かを判定し、全ての関数定義を解析していれば関数情報解析処理を終了する。全ての関数定義を解析していなければステップＳ１１２に戻り、上記処理を続けてソースコード内のまだ解析していない関数定義を解析する。
【００５１】
例えば、図３のソースコードの例の場合では、ソースコード内にｆｕｎｃＡ（３１），ｆｕｎｃＢ（３２）、ｆｕｎｃＣ（３３）、ｆｕｎｃＤ（３４）の４つの関数が定義されており、ｆｕｎｃＡ（３１）はｆｕｎｃＢ（３２）、ｆｕｎｃＣ（３３）を呼出ししており、ｆｕｎｃＢ（３２）はｆｕｎｃＤ（３４）を呼出ししており、ｆｕｎｃＣ（３３）、ｆｕｎｃＤ（３４）は他の関数を呼出ししていない。このため、ステップＳ１０１の関数情報解析処理終了後の関数名フィールド２０Ｂと、呼出し関数リストフィールド２０Ｃに格納される値は図４に示した関数情報記憶部２０のようになる。
【００５２】
上記処理により、ソースコードに含まれる関数のうち、関数内で呼出しされている関数名と、当該関数を呼出し関数の名称が関数情報記憶部２０に格納される。
【００５３】
図１２は、ステップＳ１０２の入力値生成順序決定処理の詳細を示すフローチャートである。
【００５４】
まず、ステップＳ１２１において、入力値生成順序決定部１６が、関数情報記憶部２０の呼出し関数リストフィールド２０Ｃのデータを元に、関数のコールグラフを生成する。
【００５５】
コールグラフとは関数間の呼出し関係を表す有向グラフとして知られているものであり、各関数は頂点として表され、関数Ａの頂点から関数Ｂの頂点へ矢印がある場合に、関数Ａが関数Ｂを呼出ししていることを表す。
【００５６】
例えば、関数情報記憶部２０の呼出し関数リストフィールド２０Ｃが図４のような場合、ｆｕｎｃＡ（３１）はｆｕｎｃＢ（３２）、ｆｕｎｃＣ（３３）を呼出ししており、さらにｆｕｎｃＢ（３２）はｆｕｎｃＤ（３４）を呼出ししているため、コールグラフは図６のようになる。図６は、コールグラフの一例を示す図である。
【００５７】
次に、ステップＳ１２２において、入力値生成順序決定部１６が、上記ステップＳ１２１で生成されたコールグラフの矢印の向きを逆にし、得られた有向グラフに対してトポロジカルソートを実施する。
【００５８】
ここで、トポロジカルソートとは有向グラフに対して、頂点の順番をどの頂点も矢印の先の頂点より前にくるように並べるアルゴリズムであり、依存関係のある作業の順番を決定するための方法として知られている。
【００５９】
最後に、ステップＳ１２３において、入力値生成順序決定部１６が、ステップＳ１２２のトポロジカルソートの結果を各関数の入力値生成順序とし、関数情報記憶部２０で対応する入力値生成順序フィールド２０Ｄに格納し、入力値生成順序決定処理を終了する。
【００６０】
図３のソースコードの例の場合では、ステップＳ１０２の入力値生成順序決定処理終了後の入力値生成順序フィールド２０Ｄに格納される値は、例えば図４のようになる。
【００６１】
本発明の実施例では、被呼出し関数の入力値と、出力値を用いて呼出しし関数の処理内容を置き換えるため、呼出し関係が下位の関数から先に入力値と、出力値を生成する必要があるが、上述した処理を行うことで、上記要求を満たすように入力値生成順序フィールド２０Ｄを決定することができる。
【００６２】
上記処理によって、被呼出し側関数のうち最下位の関数が入力値生成順序の先頭として設定され、最下位の被呼出し側関数から呼出し側関数へ向けて入力値生成順序が順次設定される。
【００６３】
図１３は、ステップＳ１０３の必要戻り値解析処理の詳細を示すフローチャートである。
【００６４】
まず、ステップＳ１３１において、必要戻り値解析部１７が、ソースコード記憶部１９に格納されているソースコードを読み込む。
【００６５】
次に、ステップＳ１３２において、必要戻り値解析部１７が、ソースコード内でまだ解析していない一つの関数ｆに対して、関数の処理内容にある関数呼出しをダミーの変数に書き換えた戻り値解析用の関数ｆ’を生成する。
【００６６】
例えば、図７は図３のソースコードのｆｕｎｃＢ（３２）に対して戻り値解析用の関数を生成する例である。ｆｕｎｃＢ（３２）の処理の中で、ｆｕｎｃＤ（３４）を呼出ししているため、ｆｕｎｃＤ（３４）の呼出し式をダミー変数ｖａｒ＿ｆｕｎｃＤ（３５）に置き換えている。
【００６７】
次に、ステップＳ１３３において、必要戻り値解析部１７が、記号実行部２２を用いて、上記ステップＳ１３２で置き換えたダミー変数を記号値として戻り値解析用の関数ｆ’を記号実行し、戻り値解析用の関数ｆ’の経路を網羅するためのダミー変数の入力値群を生成する。
【００６８】
ここで生成されたダミー変数の入力値群は、関数ｆの経路を網羅するために必要となる被呼出し関数の戻り値となっている。
【００６９】
例えば、図７の例では、記号実行によりｆｕｎｃＢ（３２）内の経路を網羅するために必要なｆｕｎｃＤ（３４）の戻り値として１、１２３が得られている。
【００７０】
次に、ステップＳ１３４において、必要戻り値解析部１７が、上記ステップＳ１３３で生成されたダミー変数の入力値の全てを、関数情報記憶部２０内でダミー変数に置き換えた関数呼出しに対応する関数の必要戻り値リストフィールド２０Ｅにリスト形式で格納する。
【００７１】
次に、ステップＳ１３５において、必要戻り値解析部１７が、ソースコード内の全ての関数定義を解析したか否かを判定し、全ての関数を解析していれば必要戻り値解析処理を終了する。全ての関数定義を解析していなければステップＳ１３２に戻り、上記処理を続けてソースコード内のまだ解析していない関数を解析する。
【００７２】
上記処理により、関数内で呼出しされている関数（または関数の呼出し箇所）がダミー変数に置き換えられ、当該ダミー変数を記号値として記号実行部２２によって記号実行されて当該ダミー変数の入力値が生成される。そして、ダミー変数の入力値は、関数内で呼出しされている関数の結果を用いる経路を網羅するための必要戻り値として関数情報記憶部２０の必要戻り値リストフィールド２０Ｅに格納される。
【００７３】
すなわち、上位関数（呼出し側関数）の下位関数（被呼出し側関数）呼出しで、下位関数の戻り値を算出するために、下位関数の出力値をダミー変数に置き換えてから記号実行部２２で記号実行することによって、出力値を得るための入力値を算出することができる。
【００７４】
図１４は、ステップＳ１０４の入力値生成処理の詳細を示すフローチャートである。
まず、ステップＳ１４１において、テストケース生成部１８が変数ｎ＝１と設定する。
次に、ステップＳ１４２において、テストケース生成部１８が、関数情報記憶部２０を検索し、入力値生成順序フィールド２０Ｄの値がｎである関数が存在するか否かを判定する。値がｎでの関数が存在する場合にはステップＳ１４３に進む（以下、この関数をｆ＿ｎと呼ぶ）。値がｎの関数が存在しない場合には入力値生成処理を終了する。
【００７５】
ステップＳ１４３においては、テストケース生成部１８が、ソースコード記憶部１９に格納されているソースコードを読み込み、ソースコード内の関数ｆ＿ｎを複製した入力値生成用関数ｆ＿ｎ’を生成する。
【００７６】
次に、ステップＳ１４４において、テストケース生成部１８が、関数情報記憶部２０の関数ｆ＿ｎに対応するデータの、必要戻り値リストフィールド２０Ｅの値の有無を判定し、もし値が存在すれば、入力値生成用関数ｆ＿ｎ’のｒｅｔｕｒｎ文の直前に（ｒｅｔｕｒｎの値＝＝必要戻り値１）、（ｒｅｔｕｒｎの値＝＝必要戻り値２）、・・・を分岐条件とするｉｆ文を挿入する。ただし、それぞれの分岐における処理内容は空文でよい。
【００７７】
例えば、図８は図３のソースコードのｆｕｎｃＤ（３４）に対して戻り値解析用の関数を生成する例である。関数情報記憶部２０のｆｕｎｃＤ（３４）の必要戻り値リストフィールド２０Ｅには１、１２３が格納されているため、ｒｅｔｕｒｎ  ｚ；の直前にｚ＝＝１、ｚ＝＝１２３を分岐条件とするｉｆ文（３６）が挿入される。
【００７８】
この処理を実施することにより、必要戻り値を得るための関数ｆ＿ｎの入力値を、入力値生成用関数ｆ＿ｎ’で記号実行を行うことで算出することができるようになる。
【００７９】
次に、ステップＳ１４５において、テストケース生成部１８が、入力値生成用関数ｆ＿ｎ’の処理内容から他の関数の呼出し命令を検索する。テストケース生成部１８は、他の関数の呼出し命令がある場合、その関数呼出し箇所を以下の手順でテストケース情報記憶部２１に格納されている該当関数の入力値と、出力値に基づいたｉｆ文に置き換える。なお、このｉｆ文への置き換えを簡略化処理とする。
【００８０】
（１）関数呼出し箇所の直前にダミー変数ｖを宣言する。
【００８１】
（２）関数呼出しの入力式のリストを抽出する。例えば、関数呼出しがｇ（ｘ，ｙ）となっている場合、入力式のリストは［ｘ、ｙ］となる。
【００８２】
（３）テストケース情報記憶部２１から該当関数のテストケースのデータを全て選択する。
【００８３】
（４）上記（３）で選択したテストケースデータを一つ取り出す。
【００８４】
入力値リストフィールド２１Ｃの値と（２）の引数式リストからｉｆ文の分岐条件（入力式１＝＝入力値１  ＆＆  入力式２＝＝入力値２  ＆＆  ・・・  ＆＆  入力式Ｎ＝＝入力値Ｎ）と、出力値フィールド２１Ｄの値から、ダミー変数への代入文ｖ＝出力値を生成し、これらを用いてｉｆ文を生成する。
【００８５】
例えば、入力式リストが［ｘ、ｙ］、入力値リストフィールド２１Ｃの値が［１０、２０］、出力値フィールド２１Ｄの値が１００の場合、分岐条件は（ｘ＝＝１０  ＆＆  ｙ＝＝２０）、代入文はｖ＝１００となる。また、ｉｆ文はｉｆ（ｘ＝＝１０  ＆＆  ｙ＝＝２０）  ｖ＝１００；となる。
【００８６】
（５）上記（３）で選択したテストケースデータ全てに対して上記（４）を繰り返す。ただし生成した２つ目以降のｉｆ文はｅｌｓｅ  ｉｆ句として追加していく。
【００８７】
（６）完成したｉｆ文を関数呼出し箇所の直前に追加する。
【００８８】
（７）関数呼出し箇所をダミー変数ｖに置き換える。
【００８９】
例えば、図９は図３のソースコードのｆｕｎｃＢ（３２）に対して上記の簡略化処理を実施する例である。
【００９０】
テストケース生成部１８は、簡略化処理を実施して、ｆｕｎｃＢ（３２）の処理の中のｆｕｎｃＤ（３４）の呼出し箇所をテストケース情報記憶部２１に格納されたｆｕｎｃＤ（３４）のテストケースデータ（１２３、−１０）に基づいてｉｆ文（３７）に置き換える。
【００９１】
次に、ステップＳ１４６において、テストケース生成部１８が、記号実行部２２を用いて、引数を記号値として入力値生成用関数ｆ＿ｎ’を記号実行し、入力値解析用関数ｆ’の経路を網羅するための入力値群を生成する。そして、テストケース生成部１８は、生成された入力値（関数の引数が複数ある場合、入力値は複数の引数値の組から成る）の全てを以下の手順でテストケース情報記憶部２１に格納する。
【００９２】
（１）テストケース情報記憶部２１に新規のレコードを追加し、一意に識別可能なテストケースＩＤをテストケースＩＤフィールド２１Ａに格納する。
【００９３】
（２）関数情報記憶部２０から関数ｆ＿ｎに対応するデータの関数ＩＤを取り出し、関数ＩＤフィールド２１Ｂに格納する。
【００９４】
（３）生成された入力値群から一組の入力値を取り出し、リスト形式で入力値リストフィールド２１Ｃに格納する。
【００９５】
（４）生成された入力値全てを格納するまで上記（１）−（３）を繰り返す。
【００９６】
このステップで生成された入力値群は、関数ｆ＿ｎと関数ｆ＿ｎ実行時に呼出しされる全ての関数の経路を網羅することができる入力値群となっている。
【００９７】
次に、ステップＳ１４７において、テストケース生成部１８が、ステップＳ１４６で生成された入力値を具体値として関数ｆ＿ｎを実行し、得られた出力値（関数ｆ＿ｎの戻り値）をテストケース情報記憶部２１の該当データの出力値フィールド２１Ｄに格納する。
【００９８】
次に、ステップＳ１４８において、ｎ＝ｎ＋１として、ステップＳ１４２に戻る。
【００９９】
以上、図１０に示したステップＳ１０４の入力値生成処理が終了すると、テストケース情報記憶部２１に各関数のテストケースとして、入力値と出力値が入力値リストフィールド２１Ｃと、出力値２１フィールドＤに格納される。
【０１００】
例えば、図３のソースコードの例の場合では、ステップＳ１０４の入力値生成処理終了後のテストケース情報記憶部２１に格納される値は、図５のようになる。
【０１０１】
上記に示した処理を実施することにより、呼出し下位の関数から順番に、経路を網羅するために必要な入力値と出力値の生成が行われ、生成された入力値と出力値を用いて呼出しし上位の関数内の関数呼出し部分をｉｆ文に置き換えてから記号実行が実施されるようになる。
【０１０２】
これにより、生成されるテストケースの網羅性を確保しつつ、多段の関数呼出しがある場合であっても記号実行を実施する関数の制御フロー（処理）が簡略化され、計算量を削減することができる。
【０１０３】
図１５は、前記従来例の課題の詳細を説明する図である。図示の例では、関数ｆｕｎｃＡ（３１）の中でｆｕｎｃＢ（３２）が呼出しされる例を示す。
【０１０４】
前記従来例では記号実行の際に下位関数（ｆｕｎｃＢ（３２））の呼出し箇所を記号実行せずに、単体テストの結果に置き換えることにより経路の組合せ爆発を抑制している。図示の例では、単体テストの結果として、ｆｕｎｃＢ（３２）の入力値と出力値はテストケース情報記憶部２１ｊのように２０、−１００、０が得られた場合を示す。
【０１０５】
下位関数の出力値で生成したｉｆ文（３９）によりｆｕｎｃ（Ｂ）を置き換えると、ｆｕｎｃ（Ｂ）の結果が１００となるｉｆ文（４０）が存在する場合、当該ｉｆ文（４０）の経路を網羅することができない、という問題が生じる。
【０１０６】
すなわち、前記従来例では、用意する単体テストの具体的な入力値によっては、呼出し側関数の経路を網羅するために必要な出力値が得られずに、生成されるテストケースの網羅性が低下するのである。
【０１０７】
そこで、本発明の実施例では、上位関数から呼出しされる下位関数をダミー変数に置き換えてから記号実行することで下位関数の入力値を算出し、当該関数の必要戻り値リストフィールド２０Ｅに格納する。
【０１０８】
そして、テストケース生成部１８は、下位関数の出力値（戻り値）を分岐条件とするｉｆ文を置き換え処理によって挿入してから記号実行部２２によって入力値を算出し、当該入力値を下位関数へ入力することで出力値を算出する。そして、ダミー変数によって算出した入力値と出力値を加えて、当該下位関数の入力値と出力値をテストケース情報記憶部２１に格納する。
【０１０９】
このように、呼出しされる関数の戻り値による経路の網羅を行ってから、経路の簡略化（置き換え処理）を行うことで上位関数の網羅性を確保することがきるのである。
【０１１０】
以上に説明したように、本発明の実施例では、記号実行の際の計算量を削減しつつ、呼出し側と、被呼出し側について全ての関数の経路を網羅するようなテストケースを生成することができる。
【０１１１】
なお、本発明は上記した実施例に限定されるものではなく、様々な変形例が含まれる。例えば、上記した実施例は本発明を分かりやすく説明するために詳細に記載したものであり、必ずしも説明した全ての構成を備えるものに限定されるものではない。また、ある実施例の構成の一部を他の実施例の構成に置き換えることが可能であり、また、ある実施例の構成に他の実施例の構成を加えることも可能である。また、各実施例の構成の一部について、他の構成の追加、削除、又は置換のいずれもが、単独で、又は組み合わせても適用可能である。
【０１１２】
また、上記の各構成、機能、処理部、及び処理手段等は、それらの一部又は全部を、例えば集積回路で設計する等によりハードウェアで実現してもよい。また、上記の各構成、及び機能等は、プロセッサがそれぞれの機能を実現するプログラムを解釈し、実行することによりソフトウェアで実現してもよい。各機能を実現するプログラム、テーブル、ファイル等の情報は、メモリや、ハードディスク、ＳＳＤ（Ｓｏｌｉｄ  Ｓｔａｔｅ  Ｄｒｉｖｅ）等の記録装置、または、ＩＣカード、ＳＤカード、ＤＶＤ等の記録媒体に置くことができる。
【０１１３】
また、制御線や情報線は説明上必要と考えられるものを示しており、製品上必ずしも全ての制御線や情報線を示しているとは限らない。実際には殆ど全ての構成が相互に接続されていると考えてもよい。
【符号の説明】
【０１１４】
１  テストケース生成装置
４  ＣＰＵ
５  ＲＯＭ
６  ＲＡＭ
７  ＨＤＤ
８  ＢＵＳ
９  入力装置
１０  表示装置
１１  通信Ｉ／Ｆ
１２  ＣＤＲＯＭドライブ
１２Ａ  ＣＤＲＯＭ
１３  テストケース生成プログラム
１４  記憶部
１５  関数情報解析部
１６  入力値生成順序決定部
１７  必要戻り値解析部
１８  テストケース生成部
１９  ソースコード記憶部
２０  関数情報記憶部
２１  テストケース情報記憶部
２２  記号実行部
２０Ａ  関数ＩＤフィールド
２０Ｂ  関数名フィールド
２０Ｃ  呼出し関数リストフィールド
２０Ｄ  入力値生成順序フィールド
２０Ｅ  必要戻り値リストフィールド
２１Ａ  テストケースＩＤフィールド
２１Ｂ  関数ＩＤフィールド
２１Ｃ  入力値リストフィールド
２１Ｄ  出力値フィールド
【図１】
2018147114.tif 000003
【図２】
2018147114.tif 000004
【図３】
2018147114.tif 000005
【図４】
2018147114.tif 000006
【図５】
2018147114.tif 000007
【図６】
2018147114.tif 000008
【図７】
2018147114.tif 000009
【図８】
2018147114.tif 000010
【図９】
2018147114.tif 000011
【図１０】
2018147114.tif 000012
【図１１】
2018147114.tif 000013
【図１２】
2018147114.tif 000014
【図１３】
2018147114.tif 000015
【図１４】
2018147114.tif 000016
【図１５】
2018147114.tif 000017