(57)【特許請求の範囲】
【請求項１】
値が入力される度に１ステップの処理を実行するプログラムに入力されるテストケースであって、順次実行されるｉ（ｉは２以上の整数）ステップの処理の各々に入力されるテストケース入力個の値から成るテストケースを生成するテストケース生成装置において、
データを記憶するメモリと、
前記メモリに１ステップから（ｉ−１）ステップまでのテストケースである第（ｉ−１）テストケースが記憶されている場合、前記第（ｉ−１）テストケースを使用して、１ステップからｉステップまでのテストケースである第ｉテストケースを生成する第１の生成方式を選択する生成制御部と、
前記第１の生成方式にしたがって、前記第（ｉ−１）テストケースの実行による（ｉ−１）ステップの終了時点における内部状態を保持した状態で、ｉステップ目を実行するテストケースを生成し、前記第（ｉ−１）テストケースと前記ｉステップ目のテストケースとを連結することにより前記第ｉテストケースを生成し、前記メモリに記憶するテスト生成部と
を備えたテストケース生成装置。
【請求項２】
前記テストケース生成装置は、
前記プログラムのソースコードからテストにより網羅する網羅箇所を抽出する網羅箇所抽出部と、
前記第ｉテストケースが、第（ｉ−１）テストケースにより網羅されていない網羅箇所である未網羅箇所を網羅するように、テストケース生成条件と前記プログラムの呼び出しとを含むテストケース生成用関数を生成する関数生成部と
を備え、
前記テスト生成部は、
前記テストケース生成用関数を用いて前記第ｉテストケースを生成する請求項１に記載のテストケース生成装置。
【請求項３】
前記生成制御部は、
前記メモリに前記第（ｉ−１）テストケースが記憶されていない場合、１ステップからｉステップまでの各々のテストケースを生成する第２の生成方式を選択し、
前記関数生成部は、
前記第２の生成方式にしたがって、前記第（ｉ−１）テストケースの実行による（ｉ−１）ステップの終了時点における内部状態を保持した状態で、１ステップ目からｉステップ目までのテストケースを各々生成するテストケース生成用関数を生成し、
前記テスト生成部は、
前記テストケース生成用関数を用いて１ステップ目からｉステップ目までのテストケースの各々を生成し、１ステップ目からｉステップ目までのテストケースを連結することにより前記第ｉテストケースを生成し、前記メモリに記憶する請求項２に記載のテストケース生成装置。
【請求項４】
前記テスト生成部は、
非記号実行によりテストケースを生成する非記号生成部と、記号実行によりテストケースを生成する記号生成部とを備え、前記第１の生成方式が選択されると、前記非記号生成部により前記第ｉテストケースを生成し、前記非記号生成部により生成された前記第ｉテストケースを用いたテストの実行により、前記未網羅箇所が存在するか否かを判定し、前記未網羅箇所が存在する場合は、前記未網羅箇所の少なくともいずれかを網羅するように前記記号生成部により前記第ｉテストケースを生成し、前記記号生成部により生成された前記第ｉテストケースを前記メモリに記憶する請求項３に記載のテストケース生成装置。
【請求項５】
前記テスト生成部は、
前記第１の生成方式にしたがって、前記第（ｉ−１）テストケースを利用して前記第ｉテストケースを生成した場合には、利用した前記第（ｉ−１）テストケースを破棄する請求項１から請求項４のいずれか１項に記載のテストケース生成装置。
【請求項６】
値が入力される度に１ステップの処理を実行するプログラムに入力されるテストケースであって、順次実行されるｉ（ｉは２以上の整数）ステップの処理の各々に入力されるテストケース入力個の値から成るテストケースを生成するテストケース生成装置のテストケース生成方法において、
前記テストケース生成装置は、データを記憶するメモリを備え、
生成制御部が、前記メモリに１ステップから（ｉ−１）ステップまでのテストケースである第（ｉ−１）テストケースが記憶されている場合、前記第（ｉ−１）テストケースを使用して、１ステップからｉステップまでのテストケースである第ｉテストケースを生成する第１の生成方式を選択し、
テスト生成部が、前記第１の生成方式にしたがって、前記第（ｉ−１）テストケースの実行による（ｉ−１）ステップの終了時点における内部状態を保持した状態で、ｉステップ目を実行するテストケースを生成し、前記第（ｉ−１）テストケースと前記ｉステップ目のテストケースとを連結することにより前記第ｉテストケースを生成し、前記メモリに記憶するテストケース生成方法。
【請求項７】
値が入力される度に１ステップの処理を実行するプログラムに入力されるテストケースであって、順次実行されるｉ（ｉは２以上の整数）ステップの処理の各々に入力されるテストケース入力個の値から成るテストケースを生成するテストケース生成装置のテストケース生成プログラムにおいて、
前記テストケース生成装置は、データを記憶するメモリを備え、
前記メモリに１ステップから（ｉ−１）ステップまでのテストケースである第（ｉ−１）テストケースが記憶されている場合、前記第（ｉ−１）テストケースを使用して、１ステップからｉステップまでのテストケースである第ｉテストケースを生成する第１の生成方式を選択する生成制御処理と、
前記第１の生成方式にしたがって、前記第（ｉ−１）テストケースの実行による（ｉ−１）ステップの終了時点における内部状態を保持した状態で、ｉステップ目を実行するテストケースを生成し、前記第（ｉ−１）テストケースと前記ｉステップ目のテストケースとを連結することにより前記第ｉテストケースを生成し、前記メモリに記憶するテスト生成処理と
をコンピュータであるテストケース生成装置に実行させるテストケース生成プログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、テストケース生成装置、テストケース生成方法、およびテストケース生成プログラムに関する。特に、組込みソフトウェアのテストケースを自動生成するテストケース生成装置、テストケース生成方法、およびテストケース生成プログラムに関する。
【背景技術】
【０００２】
自動車および産業用ロボットといった制御機器には、様々な制御を行うための組込みリアルタイムソフトウェアが搭載されている。このようなソフトウェアが誤動作すると人命に関わる事故につながる。そのため、出荷前に十分なテストを実施する必要がある。例えば、自動車向けの機能安全規格のＩＳＯ２６２６２、および、航空機向けの機能安全規格のＤＯ−１７８Ｃでは、テスト工程ごとに採用すべきテスト手法といったテスト要件を定め、これらのテスト要件に従ってテストを実施することを求めている。単体テストのテスト要件の例としては、同値分割または境界値分析に基づきテストケースを作成することで要求を網羅するようにテストを実行する。また、同時に、そのテストケースがテスト対象ソフトウェアのソースコードの構造を網羅することが求められる。ソースコードの構造としては、処理を記述した各命令行、または、ｉｆ文およびｆｏｒ文といった分岐箇所を基準とする。テスト対象ソフトウェアに応じて用いる基準は異なる。この基準のことを構造網羅基準と呼ぶ。命令行を構造網羅基準とした場合には、テストケースによってテスト対象ソフトウェアに含まれるコードをどれだけ実行したかを示す命令網羅率を測定する。ｉｆ文といった分岐を構造網羅基準とした場合には、コードに含まれる分岐先をすべて実行したかを示す分岐網羅率を測定する。命令網羅率または分岐網羅率が十分に高ければ、テストとして十分であると判断される。【０００３】
組込みリアルタイムソフトウェアでは、初期状態、実行状態および終了準備状態といった複数の状態を持つことが一般的である。そのようなソフトウェアでは、１回分のテストケースの入力だけではソースコードの構造を網羅することができない。複数回分のテストケースの入力が必要となる場合がある。ここではテスト対象ソフトウェアの実行単位をステップと呼ぶ。例えば、テストケースの入力１回が１ステップとなる。【０００４】
近年、組込みリアルタイムソフトウェアのソースコードは大規模複雑化している。そのため、ソフトウェアの要求仕様を満たしつつ、ソースコードの構造を網羅する、複数ステップにわたるテストケースを手動で作成する工数の増加が問題となっている。【０００５】
特許文献１では、工数増加に対応するため、有界モデル検査を用いて単体テスト用の複数ステップ分のテストケースを自動で生成する方法が開示されている。
特許文献２では、脆弱性分析のための入力値生成に、記号実行を用いる方法のほか、ホワイトボックスファジングといった非記号実行を用いる方法が開示されている。
特許文献３では、モジュール毎の記号実行によるパス解析を行った後、各モジュールの情報を用いて、複数モジュールの合成実行パス求める方法が開示されている。
【先行技術文献】
【特許文献】
【０００６】
【特許文献１】特開２０１４−０６３４１５号公報
【特許文献２】特開２０１６−１６７２６２号公報
【特許文献３】特開２０１７−２０４１６４号公報
【発明の概要】
【発明が解決しようとする課題】
【０００７】
特許文献１の方法では、あらかじめ設定した最大ステップ数に到達するまで、１回目から順にテスト要件を満たすテストケースを生成することが可能かについて有界モデル検査を用いて解析する。そして、未網羅の要求あるいは分岐がある場合にはステップ数をインクリメントしてテストケース生成用の解析を繰り返す。この方法では、ステップ数が増加すると有界モデル検査対象の状態数が増加するために、テストケース生成時間が実用時間に収まらない可能性があるという課題がある。【０００８】
特許文献２の方法では、有界モデル検査といった記号実行によるテストケース生成と、ホワイトボックスファジングといった非記号実行によるテストケース生成の両方を組み合わせている。これにより高速な非記号実行による生成方法を用いてできるだけ網羅対象を網羅したうえで、残った網羅対象を確実な記号実行による生成方法を用いて網羅し、全テストケース生成時間を削減することが可能である。しかしステップ数が増加した場合にはステップ数分の解析と生成を行うため、ステップ数の増加に伴ってテストケース生成時間が増加するという課題が残る。【０００９】
特許文献３の方法では、ステップ毎に実行パスを抽出した後、ステップを跨いで保存される変数の情報を結び付けることでテストケース生成時の全ステップにわたる実行パスの抽出時間を短縮する。しかし、テストケース生成のための解析対象となる実行パスのサイズはステップ数分増加するため、他の方法と同様、テストケース生成時間が実用時間に収まらない可能性がある。
このように、従来の方法は、組込みリアルタイムソフトウェアのように入力がステップ間で変化するソフトウェアを対象とする、複数ステップにわたるテストケースの生成には適用できない。【００１０】
本発明は、複数ステップにわたるテストケースの生成にかかる時間を削減することを目的とする。
【課題を解決するための手段】
【００１１】
本発明に係るテストケース生成装置は、値が入力される度に１ステップの処理を実行するプログラムに入力されるテストケースであって、順次実行されるｉ（ｉは２以上の整数）ステップの処理の各々に入力されるテストケース入力個の値から成るテストケースを生成するテストケース生成装置において、
データを記憶するメモリと、
前記メモリに１ステップから（ｉ−１）ステップまでのテストケースである第（ｉ−１）テストケースが記憶されている場合、前記第（ｉ−１）テストケースを使用して、１ステップからｉステップまでのテストケースである第ｉテストケースを生成する第１の生成方式を選択する生成制御部と、
前記第１の生成方式にしたがって、前記第（ｉ−１）テストケースの実行による（ｉ−１）ステップの終了時点における内部状態を保持した状態で、ｉステップ目を実行するテストケースを生成し、前記第（ｉ−１）テストケースと前記ｉステップ目のテストケースとを連結することにより前記第ｉテストケースを生成し、前記メモリに記憶するテスト生成部とを備えた。
【発明の効果】
【００１２】
本発明に係るテストケース生成装置では、ステップ数がインクリメントされた場合においても、まず１ステップ分だけの非記号実行あるいは記号実行によるテストケース生成のみを実行する。そのため、複数ステップにわたる非記号実行あるいは記号実行によるテストケースの生成にかかる時間を削減することができる。
【図面の簡単な説明】
【００１３】
【図１】実施の形態１に係るテストケース生成装置の構成を示すブロック図。
【図２】実施の形態１に係るテストケース生成装置の動作を示すフローチャート。
【図３】実施の形態１に係るテストケース生成装置の動作を示すフローチャート。
【図４】実施の形態１に係るテストケース生成装置の動作を示すフローチャート。
【図５】実施の形態１に係るテスト対象ソフトウェアのプログラムを示す図。
【図６】実施の形態１に係るテスト対象ソフトウェアのプログラムに含まれる網羅箇所を示す図。
【図７】実施の形態１に係るテストケース生成装置の関数生成部が生成する１ステップのテストケースを生成するためのテストケース生成用関数を示す図。
【図８】実施の形態１に係るテストケース生成装置の関数生成部が生成する１ステップのテストケースを使用して２ステップ目のテストケースを生成するためのテストケース生成用関数を示す図。
【図９】実施の形態１に係るテストケース生成装置の関数生成部が生成する２ステップのテストケースを生成するためのテストケース生成用関数を示す図。
【図１０】実施の形態１に係るテストケース生成装置の関数生成部が生成する２ステップのテストケースを使用して３ステップ目のテストケースを生成するためのテストケース生成用関数を示す図。
【図１１】実施の形態１の変形例に係るテストケース生成装置の構成を示すブロック図。
【発明を実施するための形態】
【００１４】
以下、本発明の実施の形態について、図を用いて説明する。なお、各図中、同一または相当する部分には、同一符号を付している。実施の形態の説明において、同一または相当する部分については、説明を適宜省略または簡略化する。
【００１５】
実施の形態１．
＊＊＊構成の説明＊＊＊
図１を参照して、本実施の形態に係るテストケース生成装置１００の構成を説明する。
テストケース生成装置１００は、コンピュータである。テストケース生成装置１００は、プロセッサ９１０を備えるとともに、メモリ９２０および入出力装置９３０といった他のハードウェアを備える。プロセッサ９１０は、信号線を介して他のハードウェアと接続され、これら他のハードウェアを制御する。
【００１６】
テストケース生成装置１００は、機能要素として、プログラム取得部１１０、網羅箇所抽出部１２０、生成制御部１３０、関数生成部１４０、非記号生成部１５０、および記号生成部１６０を備える。なお、非記号生成部１５０と記号生成部１６０とをテスト生成部１７０ともいう。各機能要素は、ソフトウェアにより実現される。
【００１７】
プロセッサ９１０は、テストケース生成プログラムを実行する装置である。テストケース生成プログラムは、プログラム取得部１１０、網羅箇所抽出部１２０、生成制御部１３０、関数生成部１４０、非記号生成部１５０、および記号生成部１６０の機能を実現するプログラムである。プロセッサ９１０は、例えば、ＣＰＵである。「ＣＰＵ」は、Ｃｅｎｔｒａｌ  Ｐｒｏｃｅｓｓｉｎｇ  Ｕｎｉｔの略語である。
【００１８】
メモリ９２０は、テストケース生成プログラムを記憶する装置である。メモリ９２０は、例えば、ＲＡＭ、フラッシュメモリまたはこれらの組み合わせである。「ＲＡＭ」は、Ｒａｎｄｏｍ  Ａｃｃｅｓｓ  Ｍｅｍｏｒｙの略語である。メモリ９２０には、テスト対象ソフトウェアのプログラム、テスト対象ソフトウェアの仕様情報、および、生成したテストケースといった情報も記憶される。
【００１９】
入出力装置９３０は、テストケース生成プログラムへのデータの入力のためにユーザにより操作される入力機器と、テストケース生成プログラムから出力されるデータを画面に表示するディスプレイとに接続される。入力機器は、例えば、マウス、キーボード、タッチパネル、または、これらのうちいくつか、もしくは、すべての組み合わせである。ディスプレイは、例えば、ＬＣＤである。「ＬＣＤ」は、Ｌｉｑｕｉｄ  Ｃｒｙｓｔａｌ  Ｄｉｓｐｌａｙの略語である。ディスプレイは、特に、テスト生成部１７０が生成したテストケースを表示するために用いられる。
【００２０】
テストケース生成プログラムは、メモリ９２０からプロセッサ９１０に読み込まれ、プロセッサ９１０によって実行される。メモリ９２０には、テストケース生成プログラムだけでなく、ＯＳも記憶されている。「ＯＳ」は、Ｏｐｅｒａｔｉｎｇ  Ｓｙｓｔｅｍの略語である。プロセッサ９１０は、ＯＳを実行しながら、テストケース生成プログラムを実行する。なお、テストケース生成プログラムの一部または全部がＯＳに組み込まれていてもよい。
【００２１】
テストケース生成プログラムおよびＯＳは、補助記憶装置に記憶されていてもよい。補助記憶装置は、例えば、ＨＤＤ、フラッシュメモリまたはこれらの組み合わせである。「ＨＤＤ」は、Ｈａｒｄ  Ｄｉｓｋ  Ｄｒｉｖｅの略語である。テストケース生成プログラムおよびＯＳは、補助記憶装置に記憶されている場合、メモリ９２０にロードされ、プロセッサ９１０によって実行される。
【００２２】
テストケース生成装置１００は、プロセッサ９１０を代替する複数のプロセッサ９１０を備えていてもよい。これら複数のプロセッサ９１０は、テストケース生成プログラムの実行を分担する。それぞれのプロセッサ９１０は、例えば、ＣＰＵである。
【００２３】
テストケース生成プログラムにより利用、処理または出力されるデータ、情報、信号値および変数値は、メモリ９２０、補助記憶装置、または、プロセッサ９１０内のレジスタまたはキャッシュメモリに記憶される。
【００２４】
プログラム取得部１１０、網羅箇所抽出部１２０、生成制御部１３０、関数生成部１４０、非記号生成部１５０、記号生成部１６０、およびテスト生成部１７０の各部の「部」を「処理」、「手順」あるいは「工程」に読み替えてもよい。またプログラム取得処理、網羅対象抽出処理、生成制御処理、関数生成処理、非記号生成処理、記号生成処理、およびテスト生成処理の「処理」を「プログラム」、「プログラムプロダクト」または「プログラムを記録したコンピュータ読取可能な記録媒体」に読み替えてもよい。
テストケース生成プログラムは、上記の各部の「部」を「処理」、「手順」あるいは「工程」に読み替えた各処理、各手順あるいは各工程を、コンピュータに実行させる。また、テストケース生成方法は、テストケース生成装置１００がテストケース生成プログラムを実行することにより行われる方法である。
テストケース生成プログラムは、コンピュータ読取可能な記録媒体に格納されて提供されてもよい。また、テストケース生成プログラムは、プログラムプロダクトとして提供されてもよい。
【００２５】
テストケース生成装置１００は、１台のコンピュータで構成されていてもよいし、複数台のコンピュータで構成されていてもよい。テストケース生成装置１００が複数台のコンピュータで構成されている場合は、プログラム取得部１１０、網羅箇所抽出部１２０、生成制御部１３０、関数生成部１４０、非記号生成部１５０、および記号生成部１６０の機能が、各コンピュータに分散されて実現されてもよい。
【００２６】
＊＊＊機能の説明＊＊＊
ここで、図１を参照して、本実施の形態に係るテストケース生成装置１００の動作の概要を説明する。テストケース生成装置１００の動作は、本実施の形態に係るテストケース生成方法に相当する。
【００２７】
テストケース生成装置１００は、値が入力される度に１ステップの処理を実行するプログラム２０に入力されるテストケース２３を生成する。テストケース２３は、順次実行されるｉ（ｉは２以上の整数）ステップの処理の各々に入力されるテストケース入力個の値から成る。なお、テストケースは１ステップのみ（すなわち、ｉ＝１）であっても本実施の形態は適用可能である。
【００２８】
プログラム取得部１１０は、テスト対象ソフトウェアのプログラム２０、仕様情報および最大ステップ数の情報を、メモリ９２０もしくは入出力装置９３０を介して外部から読み込む。
【００２９】
網羅箇所抽出部１２０は、プログラム２０のソースコードからテストにより網羅する網羅箇所２１を抽出する。
【００３０】
生成制御部１３０は、メモリ９２０に、１ステップから（ｉ−１）ステップまでのテストケースである第（ｉ−１）テストケースが記憶されているかを判定する。第（ｉ−１）テストケースが記憶されている場合、生成制御部１３０は、第（ｉ−１）テストケースを使用して、１ステップからｉステップまでのテストケースである第ｉテストケースを生成する第１の生成方式Ｍ１を選択する。また、メモリ９２０に第（ｉ−１）テストケースが記憶されていない場合、生成制御部１３０は、１ステップからｉステップまでの各々のテストケースを生成する第２の生成方式Ｍ２を選択する。
このように、生成制御部１３０は、テストケース生成対象ステップを判定し、そのステップにおけるテストケース生成方式を選択するといったテストケース生成手順を制御する。
【００３１】
関数生成部１４０は、生成制御部１３０が決定したテストケースの生成方式に応じて、ステップ間での状態を保持しながらテスト対象ソフトウェアのプログラムを呼び出すテストケース生成用関数２２を生成する。関数生成部１４０は、テストケース生成用関数生成部ともいう。関数生成部１４０は、第ｉテストケースが、第１から第（ｉ−１）テストケースにより網羅されていない網羅箇所である未網羅箇所を網羅するように、テストケース生成条件とプログラムの呼び出しとを含むテストケース生成用関数２２を生成する。
関数生成部１４０は、第１の生成方式Ｍ１にしたがって、第（ｉ−１）テストケースを使用して、１ステップからｉステップまでのテストケースである第ｉテストケースを生成するテストケース生成用関数２２を生成する。
また、関数生成部１４０は、第２の生成方式Ｍ２にしたがって、第（ｉ−１）テストケースの実行による（ｉ−１）ステップの終了時点における内部状態を保持した状態で、１ステップ目からｉステップ目までのテストケースを各々生成するテストケース生成用関数２２を生成する。
【００３２】
ここでの説明において、「ｉステップのテストケース」あるいは「ｉステップで生成されたテストケース」は、１からｉステップまでのｉステップ分のテストケース入力値を指す。また、１からｉステップまでのｉステップ分のテストケース入力値を、第ｉテストケースともいう。同様に、１ステップから（ｉ−１）ステップまでのテストケース入力値は、第（ｉ−１）テストケースともいう。
また、「ｉステップ目のテストケース」は、ｉステップを対象とする１ステップ分のテストケース入力値を指す。
【００３３】
テスト生成部１７０は、第１の生成方式Ｍ１にしたがって、第（ｉ−１）テストケースの実行による（ｉ−１）ステップの終了時点における内部状態を保持した状態で、ｉステップ目を実行するテストケースを生成する。そして、テスト生成部１７０は、第（ｉ−１）テストケースとｉステップ目のテストケースとを連結することにより第ｉテストケースを生成し、メモリ９２０に記憶する。あるいは、テスト生成部１７０は、第２の生成方式Ｍ２にしたがって、テストケース生成用関数を用いて１ステップ目からｉステップ目までのテストケースの各々を生成する。そして、テスト生成部１７０は、１ステップ目からｉステップ目までのテストケースを連結することにより第ｉテストケースを生成し、メモリ９２０に記憶する。このように、テスト生成部１７０は、テストケース生成用関数２１を用いて第ｉテストケースを生成する。
【００３４】
また、テスト生成部１７０は、非記号実行によりテストケースを生成する非記号生成部１５０と、記号実行によりテストケースを生成する記号生成部とを備える。テスト生成部１７０は、第１の生成方式Ｍ１が選択されると、非記号生成部１５０により第ｉテストケースを生成する。そして、テスト生成部１７０は、非記号生成部１５０により生成された第ｉテストケースを用いたテストの実行により、未網羅箇所が存在するか否かを判定する。未網羅箇所が存在する場合、テスト生成部１７０は、未網羅箇所の少なくともいずれかを網羅するように記号生成部１６０により第ｉテストケースを生成する。そして、テスト生成部１７０は、記号生成部１６０により生成された第ｉテストケースをメモリ９２０に記憶する。また、テスト生成部１７０は、第１の生成方式Ｍ１にしたがって、第（ｉ−１）テストケースを利用して第ｉテストケースを生成した場合には、利用した第（ｉ−１）テストケースを破棄する。
【００３５】
非記号生成部１５０は、プログラム取得部１１０が読み込んだ仕様情報に応じて、テストケース候補となる入力値をランダムに生成する。そして、関数生成部１４０は、生成した関数を用いてステップ間での状態を保持しながら、網羅対象を網羅する入力を抽出し、テストケースとして決定する。非記号生成部１５０は、非記号実行によるテスト生成部ともいう。
また、記号生成部１６０は、プログラム取得部１１０が読み込んだ仕様情報に応じて、関数生成部１４０が生成した関数を用いてステップ間での状態を保持しながら、有界モデル検査手法によりテストケースを生成する。記号生成部１６０は、記号実行によるテスト生成部ともいう。
【００３６】
＊＊＊動作の説明＊＊＊
次に、図２から図４を参照して、本実施の形態に係るテストケース生成装置１００の動作の詳細を説明する。
【００３７】
ステップＳ１において、プログラム取得部１１０は、テスト対象ソフトウェアのプログラム２０、仕様情報および最大ステップ数の情報を読み込む。そして、ステップＳ２へ進む。仕様情報および最大ステップ数は、ソフトウェア仕様に基づき使用者が手動で設定可能である。また、仕様情報および最大ステップ数は、定められた形式で記述された仕様から自動で設定可能である。仕様情報には、テスト対象ソフトウェアのプログラム２０の入力変数の情報が含まれる。
【００３８】
ステップＳ２において、網羅箇所抽出部１２０は、使用する網羅基準に従ってテスト対象ソフトウェアのプログラムに含まれる網羅箇所を抽出し、それらが未網羅であるとしてステップＳ３へ進む。テスト実行時に網羅基準として分岐を用い分岐網羅率を測定する場合には、網羅箇所抽出部１２０は分岐箇所を抽出する。例えば、ｉｆ文であれば、ＴＲＵＥと判定された場合とＦＡＬＳＥと判定された場合との２箇所が網羅対象として抽出される。なお、ステップＳ２は、ステップＳ３と依存関係がないため、実行順序を入れ替えたり並行して実行したりすることができる。
【００３９】
ステップＳ３において、生成制御部１３０は、変数ｉを１に設定し、ステップＳ４へ進む。
【００４０】
ステップＳ４において、生成制御部１３０は、変数ｉの値が最大ステップ数より大きいか、または、網羅箇所が存在するかを判定する。変数ｉの値が最大ステップ数より大きい場合には、テストケース生成対象のステップは終了しているため、生成制御部１３０は、処理を終了する。変数ｉの値が最大ステップ数以下であっても未網羅の網羅箇所がなければ、生成制御部１３０は、テストケース生成は不要と判断して処理を終了する。それ以外の場合は、ステップＳ５へ進む。
【００４１】
ステップＳ５において、生成制御部１３０は、（ｉ−１）ステップで生成されたテストケースが存在するか確認する。存在する場合には、ステップＳ６へ進む。存在しない場合には、ステップＳ１７へ進む。
【００４２】
ステップＳ６において、非記号生成部１５０は、（ｉ−１）ステップで生成されたテストケースと、ステップＳ１で読み込んだ仕様情報に基づきランダムに生成したｉステップ目のテストケース候補を連結する。そして、非記号生成部１５０は、連結されたテストケースをｉステップのテストケース候補として、ステップＳ７へ進む。
【００４３】
ステップＳ７において、関数生成部１４０は、非記号生成部１５０が生成したｉステップのテストケース候補を入力とし、ｉステップ分実行するテストケース生成用関数を生成する。この関数は、テスト対象ソフトウェアのプログラムをｉステップ分、各ステップ終了時の内部状態を保持しながら次のステップを実行するための関数である。
【００４４】
ステップＳ８において、非記号生成部１５０は、ステップＳ６で生成したｉステップのテストケース候補を入力として、ステップ間での状態を保持しながらテスト対象ソフトウェアのプログラムをｉステップ分実行する。そして、非記号生成部１５０は、未網羅の網羅箇所を網羅するか確認する。未網羅の網羅箇所を網羅した場合には、非記号生成部１５０は、そのｉステップのテストケース候補をｉステップのテストケースとしてメモリ９２０へ格納し、ステップＳ９へ進む。
【００４５】
ステップＳ９において、非記号生成部１５０は、ステップＳ８で決定したｉステップのテストケースが網羅した箇所を、網羅箇所から除外し、ステップＳ１０へ進む。
ステップＳ１０において、生成制御部１３０は、未網羅の網羅箇所が存在するかを判定する。未網羅の網羅箇所がなければ、生成制御部１３０は、テストケース生成は不要と判断して処理を終了する。それ以外の場合は、ステップＳ１１へ進む。
【００４６】
ステップＳ１１において、関数生成部１４０は、テスト対象ソフトウェアのプログラムの１から（ｉ−１）ステップの入力として（ｉ−１）ステップで生成されたテストケースを取得する。そして、関数生成部１４０は、（ｉ−１）ステップで生成されたテストケースを用いて、未網羅の網羅箇所を網羅するｉステップ目のテストケースを有界モデル検査で求めるためのテストケース生成用関数を生成し、ステップＳ１２へ進む。
【００４７】
ステップＳ１２において、記号生成部１６０は、ステップＳ１１で生成したテストケース生成用関数を用いてステップ間での状態を保持しながら有界モデル検査を実行し、ｉステップ目のテストケース生成を試行し、ステップＳ１３へ進む。
【００４８】
ステップＳ１３において、記号生成部１６０は、ステップＳ１２でテストケースが生成された場合に、ステップＳ１１で使用した（ｉ−１）ステップで生成されたテストケースと、ステップＳ１２で生成されたｉステップ目のテストケースを連結する。そして、記号生成部１６０は、連結したテストケースを、ｉステップのテストケースとしてメモリ９２０へ格納し、ステップＳ１４へ進む。
【００４９】
ステップＳ１４において、記号生成部１６０は、ステップＳ１２で生成されたテストケースによって網羅した箇所を、網羅箇所から除外し、ステップＳ１５へ進む。
ステップＳ１５において、生成制御部１３０は、ステップＳ８またはステップＳ１３において、ｉステップのテストケースがメモリ９２０へ格納された場合には、そのテストケースの生成に用いた（ｉ−１）ステップのテストケースをメモリ９２０から除外する。
【００５０】
ステップＳ１６において、生成制御部１３０は、網羅箇所が存在するかを判定する。未網羅の網羅箇所がなければ、生成制御部１３０は、テストケース生成は不要と判断して処理を終了する。それ以外の場合は、ステップＳ１７へ進む。
【００５１】
ステップＳ１７において、非記号生成部１５０は、ステップＳ１で読み込んだ仕様情報に基づき、ｉステップのテストケース候補をランダムに生成し、ステップＳ１８へ進む。
【００５２】
ステップＳ１８において、関数生成部１４０は、非記号生成部１５０が生成したｉステップのテストケース候補を取得する。そして、関数生成部１４０は、テスト対象ソフトウェアのプログラムをｉステップ分、各ステップ終了時の内部状態を保持しながら次のステップを実行するためのテストケース生成用関数を生成する。
【００５３】
ステップＳ１９において、非記号生成部１５０は、ステップＳ１７で生成したｉステップのテストケース候補を取得する。非記号生成部１５０は、ｉステップのテストケース候補を入力として、ステップ間での状態を保持しながらテスト対象ソフトウェアのプログラムをｉステップ分実行し、未網羅の網羅箇所を網羅するか確認する。未網羅の網羅箇所を網羅した場合には、そのｉステップのテストケース候補をｉステップのテストケースとしてメモリ９２０へ格納し、ステップＳ２０へ進む。
【００５４】
ステップＳ２０において、非記号生成部１５０は、ステップＳ１９で決定したｉステップのテストケースが網羅した箇所を、網羅箇所から除外し、ステップＳ２１へ進む。
【００５５】
ステップＳ２１において、生成制御部１３０は、網羅箇所が存在するかを判定する。未網羅の網羅箇所がなければ、生成制御部１３０は、テストケース生成は不要と判断して処理を終了する。それ以外の場合は、ステップＳ２２へ進む。
【００５６】
ステップＳ２２において、関数生成部１４０は、テスト対象ソフトウェアのプログラムの未網羅の網羅対象を網羅するｉステップのテストケースを有界モデル検査で求めるための、テストケース生成用関数を生成し、ステップＳ２３へ進む。
【００５７】
ステップＳ２３において、記号生成部１６０は、ステップＳ２２で生成したテストケース生成用関数を用いて、ステップ間での状態を保持しながら有界モデル検査を実行し、ｉステップのテストケース生成を試行し、ステップＳ２４へ進む。
【００５８】
ステップＳ２４において、記号生成部１６０は、ステップＳ２３でテストケースが生成された場合に、それをｉステップのテストケースとしてメモリ９２０へ格納し、ステップＳ２５へ進む。
【００５９】
ステップＳ２５において、記号生成部１６０は、ステップＳ２３で生成されたテストケースによって網羅した箇所を網羅箇所から除外し、ステップＳ２６へ進む。
【００６０】
ステップＳ２６において、生成制御部１３０は、変数ｉを１だけインクリメントし、ステップＳ４へ進む。
【００６１】
以上のテストケース生成処理において、ステップＳ６からステップＳ１５までの処理は、第（ｉ−１）テストケースが存在する場合に、第（ｉ−１）テストケースを使用して、第ｉテストケースを生成する第１の生成方式Ｍ１の例である。
ステップＳ６からステップＳ９までの処理は、非記号実行により第ｉテストケースを生成する処理である。ステップＳ１１からステップＳ１５までの処理は、ステップＳ６からステップＳ９までの処理でも、未網羅箇所がある場合に実行される記号実行により第ｉテストケースを生成する処理である。
【００６２】
また、ステップＳ１７からステップＳ２５までの処理は、第（ｉ−１）テストケースが存在しない場合に、１ステップからｉステップまでの各々のテストケースを生成することにより、第ｉテストケースを生成する第２の生成方式Ｍ２の例である。
ステップＳ１７からステップＳ２０までの処理は、非記号実行により第ｉテストケースを生成する処理である。ステップＳ２２からステップＳ２５までの処理は、ステップＳ１７からステップＳ２０までの処理でも、未網羅箇所がある場合に実行される記号実行により第ｉテストケースを生成する処理である。
【００６３】
また、ステップＳ６からステップＳ２６までの一連の処理は、第１の生成方式で、第（ｉ−１）テストケースを用いて生成される第ｉテストケースでも未網羅箇所がある場合の処理となる。このとき、ステップＳ１７から、第２の生成方式で全てのステップのテストケースを生成して、再度第ｉテストケースを生成する処理となる。
【００６４】
（ｉ−１）ステップで生成されたテストケースが複数ある場合には、ステップＳ７からからステップＳ１５を、（ｉ−１）ステップで生成されたテストケースそれぞれについて行う。これらは順番に行ったり並列に行ったりしてもよい。また、（ｉ−１）ステップで生成された複数のテストケースを用いて生成した複数のｉステップのテストケースが、同じ網羅箇所のみを網羅する場合には、そのいずれか一つをｉステップのテストケースとしてメモリ９２０に格納してもよい。
【００６５】
非記号生成部１５０は、１つの（ｉ−１）ステップのテストケースに対して、複数のｉステップ目のテストケース候補を生成し、複数のｉステップのテストケース候補としてもよい。
【００６６】
生成制御部１３０は、網羅箇所をどのステップで網羅可能かを予め判断してから、ステップＳ５からステップＳ２５を実行してもよい。例えば、ステップＳ４とステップＳ５の間において、ステップＳ２で抽出した網羅箇所のうち、ｉステップで網羅可能な網羅箇所を他の手法を用いて抽出する。そして、ステップＳ１０、ステップＳ１６、およびステップＳ２１においては、そのｉステップで網羅可能な網羅箇所のうち、未網羅な箇所が無いかを判断するものであってもよい。
【００６７】
本実施の形態では、記号生成部１６０は、有界モデル検査を用いてテストケース生成を試行する。しかし、記号生成部１６０は、コンコリックテスティングといった他の記号実行によるテストケース生成手法を用いてもよい。
【００６８】
本実施の形態では、非記号生成部１５０は、テストケース候補として値をランダムに生成する。しかし、非記号生成部１５０は、遺伝的アルゴリズム、あるいはその他の機械学習といった記号実行以外のテストケース生成手法であってもよい。また、その生成手法は（ｉ−１）ステップのテストケースの値を用いるものであっても良い。
【００６９】
次に、具体例を用いてテストケース生成装置１００の動作を説明する。
【００７０】
図５は、本実施の形態１のテスト対象ソフトウェアのプログラム２０の一部を示す図である。以下の例では、図５に示すテスト対象ソフトウェアのプログラムの一部を用いる。そしてテスト実行時の構造網羅基準として分岐網羅を用いるものとする。また、以下の説明において、カッコ内のステップは、図２から図４のステップに対応する。
【００７１】
プログラム取得部１１０は、テスト対象ソフトウェアのプログラム、仕様情報、および最大ステップ数を読み込む（ステップＳ１）。本例では、１つの関数ｆｕｎｃのみ読み込むが、複数の関数または複数ファイルの集合であってもよい。仕様情報には、テスト対象ソフトウェアのプログラムの入力変数ｓｉｇＡの情報が含まれている。最大ステップ数は４に設定されている。入力変数の数はテスト対象ソフトウェアのプログラムに依存し、複数あってもよい。
【００７２】
これらの情報が読み込まれると網羅箇所抽出部１２０は、テスト対象ソフトウェアのプログラムから網羅すべき分岐箇所として各ｉｆ文のＴＲＵＥおよびＦＡＬＳＥの分岐を探索して計７か所を抽出する（ステップＳ２）。そして、網羅箇所抽出部１２０は、抽出した箇所を未網羅であるとする。図６は、図５に示したプログラムに対し網羅すべき分岐箇所をＰ１からＰ７で示している。
【００７３】
生成制御部１３０は、変数ｉを１に設定する（ステップＳ３）。そして変数ｉの値が最大ステップ数４よりも小さい１であり、かつ、網羅箇所Ｐ１からＰ７が未網羅であることからテストケース生成が必要と判断する（ステップＳ４）。次に、生成制御部１３０は、前のステップで生成されたテストケースが存在するか確認する。１ステップ目では前のステップがないため、テストケースなしとして判断する（ステップＳ５）。
【００７４】
非記号生成部１５０は、仕様情報から入力変数ｓｉｇＡに対し、１ステップのテストケース候補としてランダムな値５０を生成する（ステップＳ１７）。
【００７５】
関数生成部１４０は、テストケース候補である値５０をｓｉｇＡの入力としてテスト対象ソフトウェアのプログラムを１ステップ分実行するテストケース生成用関数を生成する（ステップＳ１８）。
【００７６】
非記号生成部１５０は、テストケース生成用関数を実行して未網羅の網羅箇所を網羅するか確認する（ステップＳ１９）。その結果、Ｐ１、Ｐ７を網羅するため、５０を１ステップのテストケースとしてメモリ９２０へ格納する。そして網羅した網羅箇所Ｐ１とＰ７を網羅箇所から除外する（ステップＳ２０）。
【００７７】
生成制御部１３０は、網羅箇所としてＰ２からＰ６が存在するため次の処理へ進む（ステップＳ２１）。
【００７８】
関数生成部１４０は、テスト対象ソフトウェアのプログラムの未網羅の網羅箇所２１を網羅する１ステップのテストケースを有界モデル検査で求めるための、テストケース生成用関数を生成する（ステップＳ２２）。
図７は、生成されたテストケース生成用関数２２の例である。
【００７９】
記号生成部１６０は、図７の関数を用いて有界モデル検査を実行し、１ステップのテストケース生成を試行する（ステップＳ２３）。ここでは、１ステップ目に網羅できる網羅箇所は存在しないため、新たな１ステップのテストケースは生成されない（ステップＳ２４，Ｓ２５）。
【００８０】
次に、生成制御部１３０は、次のステップｉ＝２へ進む（ステップＳ２６）。そして依然として最大ステップ数に到達せず、また未網羅の分岐Ｐ２からＰ６が存在することを確認する。そこで、生成制御部１３０は、１ステップで生成されたテストケースが存在するか確認する。ここで、１ステップで生成されたテストケースとして５０が存在していることから、これを活用したテストケース生成へ進む（ステップＳ５）。
【００８１】
非記号生成部１５０は、２ステップ目のテストケース候補を非記号実行によりランダムに値５０と生成する（ステップＳ６）。非記号生成部１５０は、１ステップのテストケース５０を使用し、入力変数ｓｉｇＡの１ステップ目の値を５０とし、２ステップ目のテストケース候補である値５０を連結して２ステップのテストケース候補（５０、５０）とする。
【００８２】
関数生成部１４０は、テストケース候補（５０、５０）をｓｉｇＡの入力としてテスト対象ソフトウェアのプログラムを２ステップ分実行するテストケース生成用関数を生成する（ステップＳ７）。
【００８３】
非記号生成部１５０は、テストケース生成用関数を用いて１ステップ実行完了時に状態を保持しながら２ステップ目を実行する、というようにステップ間での状態を保持しながら実行する。そして、非記号生成部１５０は、未網羅の網羅箇所Ｐ２からＰ６を網羅するか確認する（ステップＳ８）。その結果、２ステップ目において、値５０であり網羅箇所Ｐ２を網羅することから、２ステップのテストケースとして（５０、５０）をメモリ９２０へ格納し、またＰ２を網羅箇所から除外する（ステップＳ９）。
【００８４】
生成制御部１３０は、網羅箇所としてＰ３からＰ６が存在するため次の処理へ進む（ステップＳ１０）。
【００８５】
関数生成部１４０は、１ステップのテストケースの値５０を１ステップ目のテストケースとして用い、未網羅の網羅箇所を網羅する２ステップ目のテストケースを有界モデル検査で求めるための、テストケース生成用関数を生成する（ステップＳ１１）。
図８は、生成されたテストケース生成用関数２２の例である。
【００８６】
記号生成部１６０は、図８の関数を用いて有界モデル検査を１ステップ目の状態を保持しながら２ステップ分検査するように実行し、２ステップ目のテストケース生成を試行する（ステップＳ１２）。その結果、２ステップ目のテストケース、すなわち２ステップ目の入力変数ｓｉｇＡの値として、網羅箇所Ｐ３を網羅するような１０未満の値、例えば０が生成される。従って、記号生成部１６０は、２ステップのテストケースとして（５０、０）をメモリ９２０へ格納し、またＰ３を網羅箇所から除外する（ステップＳ１３，Ｓ１４）。
【００８７】
生成制御部１３０は、２ステップのテストケースの生成に用いた１ステップのテストケース５０をメモリから除外する（ステップＳ１５）。その結果、メモリ９２０上にはテストケースとして２ステップのテストケース（５０、５０）と（５０、０）のみが存在することになる。次に生成制御部１３０は、網羅箇所Ｐ４からＰ６が存在するため次の処理へ進む（ステップＳ１６）。
【００８８】
非記号生成部１５０は、２ステップのテストケース候補としてランダムな値（０、０）を生成したとする（ステップＳ１７）。
【００８９】
関数生成部１４０は、テストケース候補（０、０）をｓｉｇＡの入力としてテスト対象ソフトウェアのプログラムを２ステップ分実行するテストケース生成用関数を生成する（ステップＳ１８）。
【００９０】
非記号生成部１５０は、テストケース生成用関数を用いて１ステップ実行完了時に状態を保持しながら２ステップ目を実行する、というようにステップ間での状態を保持しながら実行する（ステップＳ１９）。非記号生成部１５０は、未網羅の網羅箇所を網羅するか確認する。しかしこの場合未網羅の網羅箇所を網羅することはないため、このテストケース候補（０、０）は廃棄される（ステップＳ２０，Ｓ２１）。
【００９１】
生成制御部１３０は、依然として網羅箇所Ｐ４からＰ６が存在するため次の処理へ進む。
【００９２】
関数生成部１４０は、未網羅の網羅箇所を網羅する２ステップのテストケースを有界モデル検査で求めるためのテストケース生成用関数を生成する（ステップＳ２２）。
図９は、生成されたテストケース生成用関数２２の例である。
【００９３】
記号生成部１６０は、図９の関数を用いて有界モデル検査を１ステップ目の状態を保持しながら２ステップ分検査するように実行し、２ステップのテストケース生成を試行する（ステップＳ２３）。その結果、網羅箇所Ｐ６を網羅するような２ステップのテストケースとして、例えば（１５０、０）が生成される。従って、記号生成部１６０は、これをメモリ９２０へ格納するとともに、Ｐ６を網羅箇所から除外する（ステップＳ２４）。
【００９４】
次に生成制御部１３０は、次のステップｉ＝３へ進む（ステップＳ２６）。そして依然として最大ステップ数に到達せず、また未網羅の分岐Ｐ４とＰ５が存在することを確認する。そこで２ステップで生成されたテストケースが存在するか確認する。ここで、２ステップで生成されたテストケースとして（５０、５０）、（５０、０）、（１５０、０）が存在することから、これを活用したテストケース生成へ進む（ステップＳ４，Ｓ５）。
【００９５】
非記号生成部１５０は、２ステップのテストケース（５０、５０）、（５０、０）、（１５０、０）を使用し、２ステップ目の場合と同様に３ステップ目のテストケース候補をランダムに生成する。そして、非記号生成部１５０は、３ステップ目のテストケース候補を用いて、３ステップのテストケース候補を生成する（ステップＳ６）。これを例えば（５０、５０、５０）、（５０、０、５０）、（１５０、０、５０）であったとする。
【００９６】
関数生成部１４０は、テストケース候補（５０、５０、５０）、（５０、０、５０）、（１５０、０、５０）をｓｉｇＡの入力としてテスト対象ソフトウェアのプログラムを３ステップ分実行するテストケース生成用関数を生成する（ステップＳ７）。
【００９７】
非記号生成部１５０は、テストケース生成用関数を用いて、ステップ間での状態を保持しながら実行する（ステップＳ８）。つまり、非記号生成部１５０は、１ステップ実行完了時に状態を保持しながら２ステップ目を実行し、２ステップ実行完了時に状態を保持しながら３ステップ目を実行する、というようにステップ間での状態を保持しながら実行する。そして、非記号生成部１５０は、未網羅の網羅箇所Ｐ４とＰ５を網羅するか確認する。その結果、これらいずれにおいても網羅箇所Ｐ４を網羅できるが、ここではそのうち１つ（５０、５０、５０）を３ステップのテストケースとして格納する。そして、非記号生成部１５０は、Ｐ４を網羅対象から除外する（ステップＳ８，Ｓ９）。
【００９８】
生成制御部１３０は、網羅箇所としてＰ５が存在するため次の処理へ進む（ステップＳ１０）。
【００９９】
関数生成部１４０は、２ステップのテストケースを１ステップ目と２ステップ目のテストケースとして用いて、テストケース生成用関数を生成する（ステップＳ１１）。関数生成部１４０は、未網羅の網羅箇所Ｐ５を網羅する３ステップ目のテストケースを有界モデル検査で求めるための、テストケース生成用関数を生成する。ここでは、２ステップのテストケースは、（５０、５０）、（５０、０）、（１５０、０）である。
図１０は、２ステップのテストケース（５０、５０）を用いたテストケース生成用関数２２の例である。
【０１００】
例えば、図１０で示したテストケース生成用関数では、１ステップ目実行後に初期化をせずに、続けて２ステップ目を呼び出している。このため、２ステップ目実行完了後のテスト対象関数ｆｕｎｃが使用する大域変数あるいは静的変数の値は変更されないまま、２ステップ目の関数ｆｕｎｃの処理が進むことになる。したがって、例えば記号実行を行うテスト生成部１７０は、１ステップ目の関数ｆｕｎｃの解析に続いて、２ステップ目の初期化されていない関数ｆｕｎｃの解析を行う。このような動作が、内部状態を保持したうえでテストケースを生成する動作となる。
【０１０１】
記号生成部１６０は、図１０の関数を用いて有界モデル検査を１ステップ目と２ステップ目の状態を保持しながら３ステップ分検査するように実行し、３ステップ目のテストケース生成を試行する（ステップＳ１１）。その結果、３ステップ目の入力変数ｓｉｇＡの値として、網羅箇所Ｐ５を網羅するような３０未満の値、例えば０が生成される。従ってテスト生成部は、３ステップのテストケースとして（５０、５０、０）をメモリ９２０へ格納し、またＰ５を網羅箇所から除外する（ステップＳ１３，Ｓ１４，Ｓ１５）。
【０１０２】
続いて生成制御部１３０は、３ステップのテストケースの生成に用いた２ステップのテストケース（５０、５０）をメモリ９２０から除外する。その結果、メモリ９２０上にはテストケースとして（５０、０）、（１５０、０）、（５０、５０、５０）、（５０、５０、０）が存在することになる。そして生成制御部１３０は、網羅箇所がこれ以上存在しないため、テストケース生成は不要と判断して処理を終了する（ステップＳ１６）。
【０１０３】
以上のように、本実施の形態に係るテストケース生成装置１００は、値が入力される度に１ステップの処理を実行するソフトウェアを解析して、ソフトウェアのテストのために入力される値の系列をテストケースとして生成する。
【０１０４】
生成制御部１３０は、（ｉ−１）ステップのテストケースが存在する場合には、（ｉ−１）ステップのテストケースを使用して、テストケースを生成する方法を選択する。その際、生成制御部は、そのテストケース実行による（ｉ−１）ステップ終了時点での内部状態を保持した上でｉステップ目のテストケースを生成する方法を選択する。生成制御部は、（ｉ−１）ステップのテストケースが、存在しない場合には、１からｉステップまでのテストケースを生成するためのテストケースの生成方法を選択する。
関数生成部１４０は、生成制御部の選択したテストケースの生成方法に応じて、テストケース生成条件およびテスト対象ソフトウェアのプログラムの呼び出しを含むテストケース生成用関数を生成する。
テスト生成部１７０は、生成制御部１３０の選択したテストケース生成方法に応じて、記号実行あるいは記号実行と非記号実行を組み合わせて、テストケース生成用関数を用いてステップ間での状態を保持しながらテストケースを生成する。（ｉ−１）ステップのテストケースを利用してｉステップ目のテストケースを生成した場合には、利用した（ｉ−１）ステップのテストケースを破棄する。
【０１０５】
＊＊＊本実施の形態の効果の説明＊＊＊
本実施の形態に係るテストケース生成装置では、複数ステップにわたるテストケース生成が必要な場合に、まず前回ステップのテストケース生成結果を用いて非記号実行によるテストケース生成と記号実行によるテストケース生成を試行する。これにより、本実施の形態に係るテストケース生成装置では、３ステップ目においては、２ステップで生成されたテストケースを用いて２ステップ目終了時点の内部状態を保持した状態で１ステップ分の解析を行うだけで、次の効果がある。つまり、非記号実行によるテストケース生成と、記号実行によるテストケース生成でそれぞれ１つの網羅箇所を網羅し、テストケース生成を終了することができる。上述の具体例では、２ステップ目終了時点の内部状態は、ｍｏｄｅ＝１およびｓｕｂ＿ｍｏｄｅ＝２である。つまり、ｍｏｄｅ＝１およびｓｕｂ＿ｍｏｄｅ＝２を保持した状態で１ステップ分の解析を行うだけで、非記号実行によるテストケース生成と、記号実行によるテストケース生成でそれぞれ１つの網羅箇所を網羅し、テストケース生成を終了することができる。
なお、本実施の形態の手法を用いない場合には、３ステップ分全てのパスを対象としてテストケース生成を試行する必要がある。そのため、非記号実行によるテストケース生成ではそのテストケース候補が膨大になり生成に時間がかかり、また記号実行によるテストケース生成では３ステップ分のパス解析とそれを満たす値の抽出に時間がかかってしまう。
【０１０６】
また、本実施の形態に係るテストケース生成装置では、ｉ＝２においては、１ステップのテストケース生成結果を用いてテストケース生成を行った後、実際には２ステップ目に網羅可能であるにも関わらず未網羅な網羅箇所Ｐ６が残った。本実施の形態に係るテストケース生成装置では、これに対して１から２ステップにわたる記号実行によるテストケース生成を行うことで、Ｐ６を網羅可能なテストケースを生成できた。このように（ｉ−１）ステップのテストケースを用いてｉステップのテストケースを生成する手法と、全ｉステップにわたるテストケースを生成する手法を組み合わせることで、ｉステップで網羅可能な箇所を網羅するテストケースを確実に生成することができる。
【０１０７】
また、本実施の形態に係るテストケース生成装置では、ｉ＝２において、１ステップのテストケースを用いてテストケースを生成し、網羅対象を網羅することを確認して２ステップのテストケースとしてメモリ９２０に格納する。また、テストケースとしてメモリ９２０に格納するとともに、使用した１ステップのテストケースを削除する。これにより、網羅対象を包含する冗長なテストケースを削除し、テストケース総数を削減することができ、出力期待値の検討およびテスト実行時間といったテスト工数を削減することができる。
【０１０８】
＊＊＊他の構成＊＊＊
＜変形例１＞
本実施の形態では、プログラム取得部１１０、網羅箇所抽出部１２０、生成制御部１３０、関数生成部１４０、非記号生成部１５０、および記号生成部１６０の機能がソフトウェアで実現される。変形例として、プログラム取得部１１０、網羅箇所抽出部１２０、生成制御部１３０、関数生成部１４０、非記号生成部１５０、および記号生成部１６０の機能がハードウェアで実現されてもよい。
【０１０９】
図１１は、本実施の形態の変形例に係るテストケース生成装置１００の構成図である。
テストケース生成装置１００は、電子回路９０９、メモリ９２０、および入出力装置９３０といったハードウェアを備える。
【０１１０】
電子回路９０９は、プログラム取得部１１０、網羅箇所抽出部１２０、生成制御部１３０、関数生成部１４０、非記号生成部１５０、および記号生成部１６０の機能を実現する専用の電子回路である。
電子回路９０９は、具体的には、単一回路、複合回路、プログラム化したプロセッサ、並列プログラム化したプロセッサ、ロジックＩＣ、ＧＡ、ＡＳＩＣ、または、ＦＰＧＡである。ＧＡは、Ｇａｔｅ  Ａｒｒａｙの略語である。ＡＳＩＣは、Ａｐｐｌｉｃａｔｉｏｎ  Ｓｐｅｃｉｆｉｃ  Ｉｎｔｅｇｒａｔｅｄ  Ｃｉｒｃｕｉｔの略語である。ＦＰＧＡは、Ｆｉｅｌｄ−Ｐｒｏｇｒａｍｍａｂｌｅ  Ｇａｔｅ  Ａｒｒａｙの略語である。
【０１１１】
プログラム取得部１１０、網羅箇所抽出部１２０、生成制御部１３０、関数生成部１４０、非記号生成部１５０、および記号生成部１６０の機能は、１つの電子回路で実現されてもよいし、複数の電子回路に分散して実現されてもよい。
別の変形例として、プログラム取得部１１０、網羅箇所抽出部１２０、生成制御部１３０、関数生成部１４０、非記号生成部１５０、および記号生成部１６０の一部の機能が電子回路で実現され、残りの機能がソフトウェアで実現されてもよい。
また、別の変形例として、プログラム取得部１１０、網羅箇所抽出部１２０、生成制御部１３０、関数生成部１４０、非記号生成部１５０、および記号生成部１６０の一部あるいはすべての機能が、ファームウェアで実現されていてもよい。
【０１１２】
プロセッサと電子回路の各々は、プロセッシングサーキットリとも呼ばれる。つまり、テストケース生成装置１００において、プログラム取得部１１０、網羅箇所抽出部１２０、生成制御部１３０、関数生成部１４０、非記号生成部１５０、および記号生成部１６０の機能は、プロセッシングサーキットリにより実現される。
【０１１３】
以上の実施の形態１では、テストケース生成装置の各部を独立した機能ブロックとして説明した。しかし、テストケース生成装置の構成は、上述した実施の形態のような構成でなくてもよい。テストケース生成装置の機能ブロックは、上述した実施の形態で説明した機能を実現することができれば、どのような構成でもよい。また、テストケース生成装置は、１つの装置でなく、複数の装置から構成されたシステムでもよい。
また、実施の形態１のうち、複数の部分を組み合わせて実施しても構わない。あるいは、この実施の形態のうち、１つの部分を実施しても構わない。その他、この実施の形態を、全体としてあるいは部分的に、どのように組み合わせて実施しても構わない。
すなわち、実施の形態１では、各実施の形態の自由な組み合わせ、あるいは各実施の形態の任意の構成要素の変形、もしくは各実施の形態において任意の構成要素の省略が可能である。
【０１１４】
なお、上述した実施の形態は、本質的に好ましい例示であって、本発明の範囲、本発明の適用物の範囲、および本発明の用途の範囲を制限することを意図するものではない。上述した実施の形態は、必要に応じて種々の変更が可能である。
【符号の説明】
【０１１５】
２０  プログラム、２１  網羅箇所、２２  テストケース生成用関数、２３  テストケース、１００  テストケース生成装置、１１０  プログラム取得部、１２０  網羅箇所抽出部、１３０  生成制御部、１４０  関数生成部、１５０  非記号生成部、１６０  記号生成部、１７０  テスト生成部、９０９  電子回路、９１０  プロセッサ、９２０  メモリ、９３０  入出力装置、Ｍ１  第１の生成方式、Ｍ２  第２の生成方式。
【図１】
0006903249.tif 000002
【図２】
0006903249.tif 000003
【図３】
0006903249.tif 000004
【図４】
0006903249.tif 000005
【図５】
0006903249.tif 000006
【図６】
0006903249.tif 000007
【図７】
0006903249.tif 000008
【図８】
0006903249.tif 000009
【図９】
0006903249.tif 000010
【図１０】
0006903249.tif 000011
【図１１】
0006903249.tif 000012