(57)【要約】      （修正有）【課題】テストケースセットにエラーケースを含めることができるテストドライバ生成装置を提供する。【解決手段】ドライバ生成装置１は、中間ドライバ生成部２と、ドライバ更新部３とを有し、テスト対象プログラム４を呼び出すドライバ５を生成する。中間ドライバ生成部は、テスト対象プログラムを解析し、ＤＡＲＴ（Ｄｉｒｅｃｔｅｄ  Ａｕｔｏｍａｔｅｄ  Ｒａｎｄｏｍ  Ｔｅｓｔｉｎｇ）ツールがテスト対象プログラムを呼び出すために用いる中間ドライバ２ａを生成する。ドライバ更新部は、ＤＡＲＴツールがテスト対象プログラムを実行する際にエラーが発生するように中間ドライバを更新する。【選択図】図６
2018084973.tif 000002
【特許請求の範囲】
【請求項１】
テスト対象プログラムをシンボリック実行することによりテストケースを生成するテストケース生成プログラムが前記テスト対象プログラムを呼び出すために用いるドライバの基となる中間ドライバを生成する中間ドライバ生成部と、
前記テスト対象プログラムにエラーを発生させるエラーケースを含めて前記テストケース生成プログラムがテストケースを生成できるように前記中間ドライバ生成部により生成された中間ドライバを更新して前記ドライバを出力するドライバ更新部と
を有することを特徴とするテストドライバ生成装置。
【請求項２】
前記ドライバ更新部は、前記中間ドライバが前記テスト対象プログラムを呼び出す際に引数として渡すシンボル変数の値を更新して前記ドライバを出力することを特徴とする請求項１に記載のテストドライバ生成装置。
【請求項３】
前記ドライバ更新部は、
前記テスト対象プログラムを解析してコレクションタイプの変数を抽出する解析部と、
前記解析部により抽出された変数にアクセスする際の整数型の引数の値を生成する値生成部と、
前記値生成部により生成された値を用いて前記テスト対象プログラムを実行する実行部と、
前記実行部による前記テスト対象プログラムの実行によりエラーが発生した場合の前記シンボル変数の値で前記中間ドライバを更新する更新部と
を有することを特徴とする請求項２に記載のテストドライバ生成装置。
【請求項４】
前記値生成部は、前記引数の値を０から１ずつ増加させながら所定の上限値までの値を順番に生成し、
前記実行部は、前記値生成部により生成された値を順番に用いて前記テスト対象プログラムを実行することを特徴とする請求項３に記載のテストドライバ生成装置。
【請求項５】
コンピュータが、
テスト対象プログラムをシンボリック実行することによりテストケースを生成するテストケース生成プログラムが前記テスト対象プログラムを呼び出すために用いるドライバの基となる中間ドライバを生成し、
前記テスト対象プログラムにエラーを発生させるエラーケースを含めて前記テストケース生成プログラムがテストケースを生成できるように前記中間ドライバを更新して前記ドライバを出力する
処理を実行することを特徴とするテストドライバ生成方法。
【請求項６】
コンピュータに、
テスト対象プログラムをシンボリック実行することによりテストケースを生成するテストケース生成プログラムが前記テスト対象プログラムを呼び出すために用いるドライバの基となる中間ドライバを生成し、
前記テスト対象プログラムにエラーを発生させるエラーケースを含めて前記テストケース生成プログラムがテストケースを生成できるように前記中間ドライバを更新して前記ドライバを出力する
処理を実行させることを特徴とするテストドライバ生成プログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、テストドライバ生成装置、テストドライバ生成方法及びテストドライバ生成プログラムに関する。
【背景技術】
【０００２】
プログラムをテストする場合のテストケースを生成するツールとしてＤＡＲＴ（Directed  Automated  Random  Testing）がある。ＤＡＲＴは、シンボリック実行の１つであるコンコリック実行によりテストケースを生成する。
【０００３】
図９は、シンボリック実行を説明するための図である。シンボリック実行は、プログラム中の変数の値を具体化せず、記号（シンボル値）のままプログラムを実行する。シンボル値を持つ変数はシンボル変数と呼ばれる。図９において、プログラム９１をシンボリック実行の対象とすると、引数ｘはシンボル変数である。
【０００４】
図９に示すように、シンボル変数ｘにシンボル値αが与えられてプログラム９１がシンボリック実行されると、シンボル値が満たすべき条件であるパス条件がパス毎に保持される。例えば、α＝＝１２３がｔｒｕｅであり、α＋１＜０がｆａｌｓｅであるパスに対するパス条件は、（α＝＝１２３）＆¬（α＋１＜０）である。そして、パス条件を満たすシンボル値がパスに対応するテストデータとなる。パス条件（α＝＝１２３）＆¬（α＋１＜０）に対応するテストデータはｘ＝１２３である。
【０００５】
図１０は、コンコリック実行を説明するための図である。コンコリック実行は、シンボル変数に具体値を与えてプログラムを実行し、パス条件を収集する。コンコリック（Concolic）＝Concrete＋Symbolicである。図１０では、シンボル変数ｘに具体値１が与えられている。αが１である場合、α＝＝１２３はｆａｌｓｅであり、α＜０もｆａｌｓｅであるため、実行経路に対応するパス条件は、¬（α＝＝１２３）＆¬（α＜０）である。このように、コンコリック実行では、プログラムに具体値を与えて実行することにより、実行経路に対するパス条件が得られる。
【０００６】
シンボリック実行には、容易に探索範囲が爆発してしまうという欠点がある。図１１は、シンボリック実行の欠点を説明するための図である。図１１は、容易に探索範囲が爆発してしまう例として、ｎ個の独立な分岐があるプログラムを示す。この例では、２n通りのパスが存在するため、ｎが大きくなると探索範囲が爆発してしまう。
【０００７】
ＤＡＲＴは、このようなシンボリック実行の欠点に対する対策として開発されたツールである。以下、図１２〜図１３Ｂを用いてＤＡＲＴについて説明する。図１２は、テスト対象メソッドを説明するための図である。図１２は、テスト対象メソッド９２とテスト対象メソッド９２に対応する論理上のＣＦＧ（Control  Flow  Graph）とを示す。
【０００８】
図１２のＣＦＧに示すように、ｘ＝０の場合、（ｘ≠０）＆（ｘ＝１）＆（ｙ≠２）の場合には、Ｂ（ＢＬＯＣＫ−Ｂ）が実行され、（ｘ≠０）＆（ｘ＝１）＆（ｙ＝２）の場合にはＡが実行され、（ｘ≠０）＆（ｘ≠１）の場合にはエラー（Ｅｒｒｏｒ）が発生する。（ｘ≠０）＆（ｘ≠１）の場合には、ｍａｐにはキーが０及び１の場合しか値が定義されていないので、テスト対象メソッド９２の６行目のｍａｐ．ｇｅｔ（ｘ）でNullPointerExceptionが発生する。
【０００９】
図１３Ａ及び図１３Ｂは、ＤＡＲＴを説明するための図である。図１３Ａにおいて、αはシンボルｘのシンボル値であり、βはシンボル変数ｙのシンボル値である。図１３Ａに示すように、ＤＡＲＴは、まず、シンボル変数ｘ及びｙに適当な初期値を与えてテスト対象メソッド９２をコンコリック実行し、パス条件を計算する（１）。図１３Ａでは、ｘ＝５，ｙ＝３が初期値である。
【００１０】
ｘ＝５，ｙ＝３としてテスト対象メソッド９２をコンコリック実行すると、ｘ≠０かつｘ≠１であるため、エラーが発生する経路が実行経路となり、対応するパス条件はα≠０＆α≠１である（１）。そして、ＤＡＲＴは、得られたパス条件の一部を否定した派生パス条件を生成する（２）。図１３Ａでは、分岐Ｂ＃１でｔｒｕｅの場合として、派生パス条件α＝０が生成され、分岐Ｂ＃２でｔｒｕｅの場合として、派生パス条件α≠０＆α＝１が生成される。
【００１１】
そして、ＤＡＲＴは、派生パス条件を満たす派生テスト入力を生成する（３）。図１３Ａでは、ｘ＝０，ｙ＝０とｘ＝１，ｙ＝０が派生テスト入力として生成される。なお、派生テスト入力を囲う四角の左の数字は、各派生テスト入力を識別する番号である。そして、ＤＡＲＴは、派生テスト入力を用いてテスト対象メソッド９２を実行し、カバレッジを測定する（４）。ここで、カバレッジとは、全ソースコードの中で実行されたソースコードの割合である。
【００１２】
そして、ＤＡＲＴは、複数の派生テスト入力でカバレッジが同じ場合には、派生テスト入力の中からどれか１つだけ残し、他の派生テスト入力よりカバレッジが低い派生テスト入力は削除する（５）。また、ＤＡＲＴは、初期値を必ず最初のテスト入力として残す。図１３Ａでは、ｘ＝０，ｙ＝０とｘ＝１，ｙ＝０は、どちらもＢを実行するため、カバレッジは同じであるので、ここでは、ｘ＝０，ｙ＝０が削除される。
【００１３】
そして、ＤＡＲＴは、図１３Ｂに示すように、派生テスト入力を用いてテスト対象メソッド９２をコンコリック実行し、パス条件を計算する（１）。図１３Ｂでは、派生テスト入力＃２、すなわち、ｘ＝１，ｙ＝０が用いられる。
【００１４】
ｘ＝１，ｙ＝０としてテスト対象メソッド９２をコンコリック実行すると、ｘ≠０かつｘ＝１かつｙ≠２であるため、Ｂを実行する経路が実行経路となり、対応するパス条件はα≠０＆α＝１＆β≠２である。そして、ＤＡＲＴは、得られたパス条件の一部を否定した派生パス条件を生成する（２）。図１３Ｂでは、分岐Ｂ＃１でｔｒｕｅの場合として、派生パス条件α＝０が生成されるが、派生パス条件α＝０は、図１３Ａに示したように生成済みであるので、無視される。また、分岐Ｂ＃２でｆａｌｓｅの場合として、派生パス条件α≠０＆α≠１が生成されるが、初期値と一致するので無視される。また、分岐Ｂ＃３でｔｒｕｅの場合として、派生パス条件α≠０＆α＝１＆β＝２が生成される。
【００１５】
そして、ＤＡＲＴは、派生パス条件を満たす派生テスト入力を生成する（３）。図１３Ｂでは、派生パス条件α≠０＆α＝１＆β＝２を満たすｘ＝１，ｙ＝２が派生テスト入力として生成される。そして、ＤＡＲＴは、派生テスト入力を用いてテスト対象メソッド９２を実行し、カバレッジを測定する（４）。この実行により全ソースコードを通過したので、ＤＡＲＴは、テストケースセットを出力する（５）。テストケースセットには、初期値であるｘ＝５，ｙ＝３、最初の派生テスト入力であるｘ＝１，ｙ＝０、次の派生テスト入力であるｘ＝１，ｙ＝２が含まれる。このうち、ｘ＝５，ｙ＝３がエラーケースである。
【００１６】
このように、ＤＡＲＴは、パス条件計算、派生パス条件生成、派生テスト入力生成、カバレッジ測定を、カバレッジが一定基準を超えるか、又は、一定回数実行するまで繰り返し、最後にテストケースセットを出力する。
【００１７】
ＤＡＲＴを用いるためには、テスト対象メソッド９２を呼び出すドライバが必要であるが、ドライバの作成には時間を要する。そこで、ドライバを自動生成するドライバ生成装置が開発されている。
【００１８】
図１４は、ドライバ生成装置により生成されるドライバの例を示す図である。図１４に示すように、ドライバ９３は、シンボル変数宣言と、テスト対象オブジェクトの生成と、テスト対象メソッド９２の呼び出しを行う。
【００１９】
具体的には、ドライバ９３は、＠Ｓｙｍｂｏｌｉｃアノテーションでシンボル化したい変数を宣言する。図１４では、ｓｙｍ＿ｓｔｒとｓｙｍ＿ｉがシンボル変数として宣言されている。また、ドライバ９３は、シンボル変数をデフォルト値で初期化する。図１４では、ｓｙｍ＿ｓｔｒは空に初期化され、ｓｙｍ＿ｉは０に初期化される。
【００２０】
また、ドライバ９３は、テスト対象クラスをインスタンス化することでテスト対象オブジェクトを生成する。図１４では、テスト対象クラスであるＴａｒｇｅｔＣｌａｓｓ０１のインスタンスとしてｔが生成されている。また、ドライバ９３は、シンボル変数を引数で渡してテスト対象メソッドを実行する。図１４では、ｓｙｍ＿ｓｔｒとｓｙｍ＿ｉを引数で渡してｍｅｔｈｏｄ１を呼び出している。
【００２１】
なお、テストケースを生成する技術として以下のような技術がある。第１の技術は、プログラムの実行に於いて生じ得る演算経路について、入力値の生成と指定現象の発生の有無の探索のための最適化処理を１つの経路で指定現象が検出されるまで反復実行することで、指定現象を与える入力テストパターンを検出する。
【００２２】
第２の技術は、被検査プログラムに含まれる複数の条件分岐の各々に対応した条件式により被検査プログラムの経路が表されたパス条件から抽出された複数の条件式を、予め定めた規則に基づいて複数の集約条件式に集約する。そして、第２の技術は、集約条件式の真偽値の組み合わせから、パス条件を表す真偽値の組み合わせと異なる真偽値の組み合わせで、かつ、集約条件式の真偽値の組み合わせとして矛盾のない真偽値の組み合わせを選択して新たなパス条件を取得する。そして、第２の技術は、新たなパス条件及び被検査プログラムから抽出されたパス条件に基づいて、被検査プログラムの動作を検証するテストケースを生成する。第２の技術によれば、被検査プログラムの検証品質を向上させることができる。
【００２３】
第３の技術は、シンボリック実行を繰り返し行うことにより得られる複数のパス条件の各々について、当該パス条件に含まれるシンボル変数の一部に固定値を代入することにより当該パス条件を簡約化した簡約化パス条件を生成する。そして、第３の技術は、生成された複数の簡約化パス条件の各々について、当該簡約化パス条件を満たすシンボル変数の値を算出すると共に、算出された当該値と固定値と簡約化する前のパス条件とを含むテストデータを生成する。そして、第３の技術は、生成されたテストデータの一部において同じパス条件を含むテストデータが重複しないように削除する。第３の技術によれば、余分なテストケースを除去することができる。
【先行技術文献】
【特許文献】
【００２４】
【特許文献１】特開２０１４−０２１９８２号公報
【特許文献２】特開２０１５−１９７８６８号公報
【特許文献３】特開２０１５−１８７７５６号公報
【特許文献４】特開２０１４−１５３９０８号公報
【発明の概要】
【発明が解決しようとする課題】
【００２５】
図１４に示したようにドライバ９３がシンボル変数をデフォルト値で初期化すると、ＤＡＲＴが生成するテストケースセットにエラーケースが含まれない場合があるという問題がある。図１５Ａ及び図１５Ｂは、テストケースセットにエラーケースが含まれない場合を説明するための図である。
【００２６】
図１５Ａに示すように、ＤＡＲＴは、整数型のシンボル変数ｘ及びｙについて、デフォルト値である０を初期値としてテスト対象メソッド９２をコンコリック実行してパス条件を計算する（１）。すると、ｘ＝０であるため、Ｂを実行する経路が実行経路となり、対応するパス条件はα＝０となる。そして、ＤＡＲＴは、得られたパス条件の一部を否定した派生パス条件を生成する（２）。図１５Ａでは、分岐Ｂ＃１でｆａｌｓｅの場合として、派生パス条件α≠０が生成される。
【００２７】
そして、ＤＡＲＴは、派生パス条件を満たす派生テスト入力を生成する（３）。図１５Ａでは、派生パス条件α≠０を満たすｘ＝１，ｙ＝０が派生テスト入力として生成される。そして、ＤＡＲＴは、派生テスト入力を用いてテスト対象メソッド９２を実行し、カバレッジを測定する（４）。ｘ＝１，ｙ＝０の場合の実行経路はＢであるため、カバレッジは初期値のカバレッジと同じになる。したがって、ＤＡＲＴは、ｘ＝１，ｙ＝０を削除する（５）。また、通過していない箇所Ａがあるため、ＤＡＲＴは処理を継続する。
【００２８】
そして、図１５Ｂに示すように、ＤＡＲＴは、次のステップを実行するため、削除した派生テスト入力ｘ＝１，ｙ＝０を用いてテスト対象メソッド９２をコンコリック実行し、パス条件を計算する（１）。すると、ｘ＝１，ｙ＝０であるため、分岐Ｂ＃１、Ｂ＃２，Ｂ＃３を経由してＢを実行する経路が実行経路となり、対応するパス条件はα≠０＆α＝１＆β≠２となる。
【００２９】
そして、ＤＡＲＴは、得られたパス条件の一部を否定した派生パス条件を生成する（２）。図１５Ｂでは、分岐Ｂ＃１でｔｒｕｅの場合として、派生パス条件α＝０が生成されるが、派生パス条件α＝０は、図１５Ａに示したように生成済みであるので、無視される。また、分岐Ｂ＃１及び分岐Ｂ＃２でｆａｌｓｅの場合として、派生パス条件α≠０＆α≠１が生成される。また、分岐Ｂ＃３でｔｒｕｅの場合として、派生パス条件α≠０＆α＝１＆β＝２が生成される。
【００３０】
そして、ＤＡＲＴは、派生パス条件を満たす派生テスト入力を生成する（３）。図１５Ｂでは、派生パス条件α≠０＆α≠１を満たすｘ＝２，ｙ＝０が派生テスト入力として生成され、派生パス条件α≠０＆α＝１＆β＝２を満たすｘ＝１，ｙ＝２が派生テスト入力として生成される。
【００３１】
そして、ＤＡＲＴは、派生テスト入力を用いてテスト対象メソッド９２を実行し、カバレッジを測定する（４）。すると、派生テスト入力ｘ＝２，ｙ＝０は、テスト対象メソッド９２の６行目まで通過してエラーとなるため、他の派生テスト入力よりカバレッジが悪く、派生テスト入力から削除される（５）。また、派生テスト入力ｘ＝１，ｙ＝２によりＡが実行され、全ソースコードが実行されたため、ＤＡＲＴは、テストケースセットを出力する（６）。
【００３２】
出力されたテストケースセットには、ｘ＝０，ｙ＝０とｘ＝１，ｙ＝２が含まれるが、エラーケースは含まれない。すなわち、ドライバ生成装置により生成されたドライバ９３がシンボル変数をデフォルト値で初期化すると、ＤＡＲＴが生成するテストケースセットにエラーケースが含まれない場合がある。
【００３３】
本発明は、１つの側面では、テストケースセットにエラーケースを含めることを目的とする。
【課題を解決するための手段】
【００３４】
１つの態様では、テストドライバ生成装置は、中間ドライバ生成部とドライバ更新部とを有する。中間ドライバ生成部は、テスト対象プログラムをシンボリック実行することによりテストケースを生成するテストケース生成プログラムがテスト対象プログラムを呼び出すために用いるドライバの基となる中間ドライバを生成する。ドライバ更新部は、テスト対象プログラムにエラーを発生させるエラーケースを含めてテストケース生成プログラムがテストケースを生成できるように中間ドライバ生成部により生成された中間ドライバを更新してドライバを出力する。
【発明の効果】
【００３５】
１つの側面では、本発明は、テストケースセットにエラーケースを含めることができる。
【図面の簡単な説明】
【００３６】
【図１】図１は、テスト対象プログラムとドライバとの関係を説明するための図である。
【図２】図２は、実施例に係るドライバ生成装置を説明するための図である。
【図３】図３は、テスト対象プログラムの前提を説明するための図である。
【図４Ａ】図４Ａは、ドライバ更新部が初期値を算出する手順を説明するための第１の図である。
【図４Ｂ】図４Ｂは、ドライバ更新部が初期値を算出する手順を説明するための第２の図である。
【図４Ｃ】図４Ｃは、ドライバ更新部が初期値を算出する手順を説明するための第３の図である。
【図４Ｄ】図４Ｄは、ドライバ更新部が初期値を算出する手順を説明するための第４の図である。
【図５Ａ】図５Ａは、ドライバ生成装置の効果を説明するための第１の図である。
【図５Ｂ】図５Ｂは、ドライバ生成装置の効果を説明するための第２の図である。
【図６】図６は、ドライバ生成装置の機能構成を示す図である。
【図７Ａ】図７Ａは、ドライバ更新部による処理のフローを示す第１のフローチャートである。
【図７Ｂ】図７Ｂは、ドライバ更新部による処理のフローを示す第２のフローチャートである。
【図７Ｃ】図７Ｃは、ドライバ更新部による処理のフローを示す第３のフローチャートである。
【図８】図８は、実施例に係るドライバ生成プログラムを実行するコンピュータのハードウェア構成を示す図である。
【図９】図９は、シンボリック実行を説明するための図である。
【図１０】図１０は、コンコリック実行を説明するための図である。
【図１１】図１１は、シンボリック実行の欠点を説明するための図である。
【図１２】図１２は、テスト対象メソッドを説明するための図である。
【図１３Ａ】図１３Ａは、ＤＡＲＴを説明するための第１の図である。
【図１３Ｂ】図１３Ｂは、ＤＡＲＴを説明するための第２の図である。
【図１４】図１４は、ドライバ生成装置により生成されるドライバの例を示す図である。
【図１５Ａ】図１５Ａは、テストケースセットにエラーケースが含まれない場合を説明するための第１の図である。
【図１５Ｂ】図１５Ｂは、テストケースセットにエラーケースが含まれない場合を説明するための第２の図である。
【発明を実施するための形態】
【００３７】
以下に、本願の開示するテストドライバ生成装置、テストドライバ生成方法及びテストドライバ生成プログラムの実施例を図面に基づいて詳細に説明する。なお、この実施例は開示の技術を限定するものではない。
【実施例】
【００３８】
まず、テスト対象プログラムとドライバとの関係について説明する。図１は、テスト対象プログラムとドライバとの関係を説明するための図である。図１に示すように、テスト対象プログラム１２を実行するためには、テスト対象プログラム１２を呼び出すドライバ１１が必要である。図１では、テスト対象プログラム１２は、関数ｆｕｎｃ１であるため、ドライバ１１は、ｆｕｎｃ１を呼び出す。
【００３９】
また、ｆｕｎｃ１は、ｆｕｎｃ２及びｆｕｎｃ３を呼び出し、ｆｕｎｃ２はｆｕｎｃ４を呼び出す。図１は、ｆｕｎｃ２及びｆｕｎｃ４は作成済みであるが、ｆｕｎｃ３は未作成である場合を示す。テスト対象プログラム１２を実行するためには、ｆｕｎｃ３も必要であるため、ｆｕｎｃ３のスタブ１３が必要になる。スタブ１３は、ｆｕｎｃ１から呼び出されると、何も処理を行うことなく制御をｆｕｎｃ１に戻すためのダミープログラムである。
【００４０】
次に、実施例に係るドライバ生成装置について説明する。図２は、実施例に係るドライバ生成装置を説明するための図である。図２に示すように、実施例に係るドライバ生成装置１は、テスト対象プログラム４を入力してドライバ５を生成し、生成したドライバ５をＤＡＲＴ実行エンジン６に渡す。ＤＡＲＴ実行エンジン６は、テスト対象プログラム４とドライバ５を入力して、シンボリック実行エンジン７を用いてテストケース８を出力する。
【００４１】
ドライバ生成装置１は、中間ドライバ生成部２とドライバ更新部３とを有する。中間ドライバ生成部２は、テスト対象プログラム４を呼び出すドライバの基となる中間ドライバを生成する。中間ドライバ生成部２は、図１４に例を示したドライバを中間ドライバとして生成する。
【００４２】
ドライバ更新部３は、中間ドライバを更新して、ＤＡＲＴが生成するテストケースセットにエラーケースが必ず含まれるようにする。具体的には、ドライバ更新部３は、エラーが起こり得るテスト対象プログラム４に対し、エラーケースを事前に検出して、中間ドライバのシンボル変数の初期値をそのエラーケースに更新する。初期値は最初のテストケースとして残るため、初期値はＤＡＲＴにより出力されるテストケースセットに必ず含まれる。
【００４３】
このように、ドライバ生成装置１は、中間ドライバのシンボル変数の初期値をエラーケースの場合のシンボル値とすることで、ＤＡＲＴにより出力されるテストケースセットにエラーケースを含めることができる。
【００４４】
次に、ドライバ更新部３がエラーケースを見つけるためのテスト対象プログラム４の前提について説明する。図３は、テスト対象プログラム４の前提を説明するための図である。テスト対象プログラム４にコレクションタイプの変数があり、その変数へアクセスするステートメントがあることが、ドライバ更新部３がエラーケースを見つけるための前提となる。
【００４５】
ここで、コレクションタイプには、Ｌｉｓｔ、Ｓｅｔ、Ｍａｐ等がある。また、ドライバ更新部３は、コレクションタイプの変数へのインデックス、キー等の指数を使ったアクセスにより発生するエラーを検出して、エラーケースを検出する。図３では、変数ｍａｐは、コレクションタイプの変数である。ｐｕｔ（キー，値）は、（キー，値）を追加するメソッドであり、ｇｅｔ（キー）は、キーに対応する値を取得するメソッドである。
【００４６】
ｍａｐには、４行目と５行目のｐｕｔにより、（０，１）と（１，ｙ）が追加される。そして、６行目のｍａｐ．ｇｅｔ（ｘ）によりｍａｐへのアクセスが行われるが、ｘが０でも１でもない場合には、（キー，値）の組がｍａｐにはないので、エラーが発生する。ドライバ更新部３は、このようなエラーを発生させることにより、エラーケースを検出する。
【００４７】
次に、ドライバ更新部３が初期値を算出する手順について説明する。図４Ａ〜図４Ｄは、ドライバ更新部３が初期値を算出する手順を説明するための図である。図４Ａに示すように、ドライバ更新部３は、まず、コレクションタイプの集合を用意しておく（ステップ１）。図４Ａでは、ＡｒｒａｙＬｉｓｔ、ＨａｓｈＭａｐ等がコレクションタイプである。ａｄｄ、ｇｅｔは、ＡｒｒａｙＬｉｓｔクラスのメソッドであり、ｐｕｔ、ｇｅｔはＨａｓｈＭａｐクラスのメソッドである。
【００４８】
そして、ドライバ更新部３は、テスト対象プログラム４を解析してコレクションタイプの変数を抽出し、抽出した変数へのアクセスステートメントを全て抽出する（ステップ２）。図４Ａでは、テスト対象メソッド９２から、ＨａｓｈＭａｐタイプの変数ｍａｐがコレクションタイプの変数として抽出され、ｍａｐ．ｐｕｔ（０，１）、ｍａｐ．ｐｕｔ（１，ｙ）、ｍａｐ．ｇｅｔ（ｘ）がｍａｐへのアクセスステートメントとして抽出される。
【００４９】
そして、ドライバ更新部３は、図４Ｂに示すように、抽出したステートメントの引数で整数（ｉｎｔ）タイプのシンボル変数をＶＡＲリストに追加する（ステップ３）。このとき、ドライバ更新部３は、ＶＡＲリストに既にある既存変数は追加しない。図４Ｂでは、ｍａｐ．ｐｕｔ（１，ｙ）からｙが抽出され、ｍａｐ．ｇｅｔ（ｘ）からｘが抽出される。
【００５０】
そして、ドライバ更新部３は、ＶＡＲに対応するＶＡＬＵＥを作成し、整数タイプのデフォルト値である０で初期化する（ステップ４）。図４Ｂでは、ｘ、ｙにそれぞれ対応するＶＡＬＵＥの値が０に初期化される。０は中間ドライバ生成部２により生成された中間ドライバ２ａのシンボル変数の初期値である。
【００５１】
そして、ドライバ更新部３は、図４Ｃに示すように、いずれかの変数（ここではｙ）に対応するＶＡＬＵＥの値をインクリメントしてＶＡＬＵＥの値の組合せを１つずつ作成し、各組合せについてテスト対象プログラム４を実行する（ステップ５）。ただし、図４Ｃでは、１つの変数に対応するＶＡＬＵＥの上限値を１００としている。
【００５２】
図４Ｃでは、ドライバ更新部３は、まず、ｙに対応するＶＡＬＵＥの値を１だけインクリメントし、ｘ＝０，ｙ＝１でテスト対象メソッド９２を実行する。そして、実行が成功したため、ドライバ更新部３は、ｙに対応するＶＡＬＵＥの値を１だけインクリメントし、ｘ＝０，ｙ＝２でテスト対象メソッド９２を実行する。
【００５３】
同様に、ドライバ更新部３は、ｙに対応するＶＡＬＵＥの値を１ずつ１００までインクリメントし、テスト対象メソッド９２の実行が成功すると、ｙに対応するＶＡＬＵＥの値が上限値を超過したので、ｙを０にリセットし、ｘに１を加えて次の組合せを作る。
【００５４】
そして、ドライバ更新部３は、図４Ｄに示すように、ｘ＝１，ｙ＝０でテスト対象メソッド９２を実行する。そして、実行が成功したため、ドライバ更新部３は、ｙに対応するＶＡＬＵＥの値を１だけインクリメントし、ｘ＝１，ｙ＝１でテスト対象メソッド９２を実行する。
【００５５】
同様に、ドライバ更新部３は、ｙに対応するＶＡＬＵＥの値を１ずつ１００までインクリメントし、テスト対象メソッド９２の実行が成功すると、ｙに対応するＶＡＬＵＥの値が上限値を超過したので、ｙを０にリセットし、ｘに１を加えて２として次の組合せを作る。
【００５６】
そして、ドライバ更新部３は、ｘ＝２，ｙ＝０でテスト対象メソッド９２を実行する。すると、エラーが発生したため、ドライバ更新部３は、初期値を算出する処理を終了し、中間ドライバ２ａのシンボル変数の初期値をｘ＝２，ｙ＝０に更新する。
【００５７】
次に、ドライバ生成装置１の効果について説明する。図５Ａ及び図５Ｂは、ドライバ生成装置１の効果を説明するための図である。図５Ａに示すように、ＤＡＲＴは、ｘ＝２，ｙ＝０としてテスト対象メソッド９２をコンコリック実行してパス条件を計算する（１）。すると、ｘ≠０かつｘ≠１であるため、エラーが発生する経路が実行経路となり、対応するパス条件はα≠０＆α≠１である。
【００５８】
そして、ＤＡＲＴは、得られたパス条件の一部を否定した派生パス条件を生成する（２）。図５Ａでは、分岐Ｂ＃１でｔｒｕｅの場合として、派生パス条件α＝０が生成され、分岐Ｂ＃２でｔｒｕｅの場合として、派生パス条件α≠０＆α＝１が生成される。
【００５９】
そして、ＤＡＲＴは、派生パス条件を満たす派生テスト入力を生成する（３）。図５Ａでは、ｘ＝０，ｙ＝０とｘ＝１，ｙ＝０が派生テスト入力として生成される。そして、ＤＡＲＴは、派生テスト入力を用いてテスト対象メソッド９２を実行し、カバレッジを測定する（４）。
【００６０】
そして、ＤＡＲＴは、２つの派生テスト入力でカバレッジが同じであるので、派生テスト入力ｘ＝１，ｙ＝０だけを残し、ｘ＝０，ｙ＝０を削除する（５）。また、カバレッジが１００％でないので、ＤＡＲＴは図５Ｂに示すように、派生テスト入力ｘ＝１，ｙ＝０を用いてテスト対象メソッド９２をコンコリック実行し、パス条件を計算する（１）。
【００６１】
ｘ＝１，ｙ＝０としてテスト対象メソッド９２をコンコリック実行すると、ｘ≠０かつｘ＝１かつｙ≠２であるため、Ｂを実行する経路が実行経路となり、対応するパス条件はα≠０＆α＝１＆β≠２である。そして、ＤＡＲＴは、得られたパス条件の一部を否定した派生パス条件を生成する（２）。図５Ｂでは、分岐Ｂ＃１でｔｒｕｅの場合として、派生パス条件α＝０が生成されるが、派生パス条件α＝０は、図５Ａに示したように生成済みであるので、無視される。また、分岐Ｂ＃１及び分岐Ｂ＃２でｆａｌｓｅの場合として、派生パス条件α≠０＆α≠１が生成されるが、初期値と一致するので無視される。また、分岐Ｂ＃３でｔｒｕｅの場合として、派生パス条件α≠０＆α＝１＆β＝２が生成される。
【００６２】
そして、ＤＡＲＴは、派生パス条件を満たす派生テスト入力を生成する（３）。図５Ｂでは、派生パス条件α≠０＆α＝１＆β＝２を満たすｘ＝１，ｙ＝２が派生テスト入力として生成される。そして、ＤＡＲＴは、派生テスト入力を用いてテスト対象メソッド９２を実行し、カバレッジを測定する（４）。この実行により全ソースコードを通過したので、ＤＡＲＴは、テストケースセットを出力する（５）。テストケースセットには、初期値であるｘ＝２，ｙ＝０、最初の派生テスト入力であるｘ＝１，ｙ＝０、次の派生テスト入力であるｘ＝１，ｙ＝２が含まれる。このうち、ｘ＝２，ｙ＝０がエラーケースであり、エラーケースが含まれる。
【００６３】
すなわち、ドライバ更新部３が、中間ドライバ２ａのシンボル変数の初期値をｘ＝２，ｙ＝０に更新することで、ＤＡＲＴは、エラーケースを含むテストケースセットを生成することができる。
【００６４】
次に、ドライバ生成装置１の機能構成について説明する。図６は、ドライバ生成装置１の機能構成を示す図である。図６に示すように、ドライバ生成装置１は、中間ドライバ生成部２とドライバ更新部３とを有する。中間ドライバ生成部２は、テスト対象プログラム４を解析し、中間ドライバ２ａを生成する。ドライバ更新部３は、プログラム解析部３１と、組合せ生成部３２と、プログラム実行部３３と、更新部３４とを有する。
【００６５】
プログラム解析部３１は、テスト対象プログラム４を解析し、コレクションタイプの変数を抽出する。そして、プログラム解析部３１は、抽出した変数にアクセスするステートメントを抽出する。そして、プログラム解析部３１は、抽出したステートメントの引数で整数タイプのシンボル変数を抽出し、ＶＡＲリストを作成する。そして、プログラム解析部３１は、ＶＡＲリストと同じ長さのＶＡＬＵＥリストを作成し、０で初期化する。
【００６６】
組合せ生成部３２は、プログラム実行部３３の指示に基づいて、ＶＡＬＵＥの値について次の組合せを生成する。いずれかのＶＡＬＵＥの値が上限値を超えると、組合せ生成部３２は、そのＶＡＬＵＥの値を０に設定し、次のＶＡＬＵＥの値を１増加する。
【００６７】
プログラム実行部３３は、ＶＡＬＵＥの値の組合せについてテスト対象プログラム４を実行する。そして、プログラム実行部３３は、エラーが発生するまで、ＶＡＬＵＥの値の次の組合せの生成の指示、及び、生成されたＶＡＬＵＥの値の組合せについてのテスト対象プログラム４の実行を繰り返す。
【００６８】
更新部３４は、プログラム実行部３３によるテスト対象プログラム４の実行でエラーが発生すると、エラーを発生させたＶＡＬＵＥの値の組合せで中間ドライバ２ａのシンボル変数の初期値を更新する。
【００６９】
次に、ドライバ更新部３による処理のフローについて説明する。図７Ａ〜図７Ｃは、ドライバ更新部３による処理のフローを示すフローチャートである。図７Ａに示すように、ドライバ更新部３は、コレクションタイプを使ってテスト対象プログラム４を解析し、コレクションタイプの変数を抽出する（ステップＳ１）。
【００７０】
そして、ドライバ更新部３は、テスト対象プログラム４を解析し、抽出した変数にアクセスするステートメントを抽出する（ステップＳ２）。そして、ドライバ更新部３は、空のＶＡＲリストを作成する（ステップＳ３）。そして、ドライバ更新部３は、抽出したステートメントの引数で整数タイプのシンボル変数を抽出し、ＶＡＲリストになければＶＡＲリストに追加する（ステップＳ４）。そして、ドライバ更新部３は、ＶＡＲリストと同じ長さのＶＡＬＵＥリストを作成して、０で初期化する（ステップＳ５）。
【００７１】
そして、ドライバ更新部３は、図７Ｂに示すように、ＮにＶＡＬＵＥの長さを設定し（ステップＳ６）、ＶＡＬＵＥ［Ｎ−１］の値に＋１する（ステップＳ７）。そして、ドライバ更新部３は、ｉに０を設定し（ステップＳ８）、ｉがＮ−１より小さいか否かを判定する（ステップＳ９）。
【００７２】
そして、ｉがＮ−１より小さい場合には、ドライバ更新部３は、ＶＡＬＵＥ［Ｎ−２−ｉ］の値に、ＶＡＬＵＥ［Ｎ−１−ｉ］を上限値＋１で割った時の商を足す（ステップＳ１０）。そして、ドライバ更新部３は、ＶＡＬＵＥ［Ｎ−１−ｉ］の値に、ＶＡＬＵＥ［Ｎ−１−ｉ］を上限値＋１で割った時の余りを代入する（ステップＳ１１）。そして、ドライバ更新部３は、ｉに１を加え（ステップＳ１２）、ステップＳ９に戻る。
【００７３】
一方、ｉがＮ−１より小さくない場合には、ドライバ更新部３は、ＶＡＬＵＥ［０］の値に、ＶＡＬＵＥ［０］を上限値＋１で割った時の余りを代入する（ステップＳ１３）。そして、ドライバ更新部３は、ＶＡＬＵＥの全ての要素が０であるか否かを判定し（ステップＳ１４）、ＶＡＬＵＥの全ての要素が０である場合には処理を終了する。
【００７４】
一方、ＶＡＬＵＥの中に０以外の要素がある場合には、ドライバ更新部３は、図７Ｃに示すように、ＶＡＬＵＥの値組合せを入力としてテスト対象プログラム４を実行し（ステップＳ１５）、実行結果がエラー発生か成功かを判定する（ステップＳ１６）。そして、実行結果が成功である場合には、ドライバ更新部３は、ステップＳ７に戻り、エラー発生である場合には、ＶＡＬＵＥの値で中間ドライバ２ａのシンボル変数の初期化を更新する（ステップＳ１７）。
【００７５】
上述してきたように、実施例では、中間ドライバ生成部２が、テスト対象プログラム４を解析し、ＤＡＲＴがテスト対象プログラム４を呼び出すために用いるドライバ５の基になる中間ドライバ２ａを生成する。そして、ドライバ更新部３が、ＤＡＲＴがテスト対象プログラム４を実行する際にエラーが発生するように中間ドライバ２ａのシンボル変数の初期化を更新する。したがって、ドライバ生成装置１は、ＤＡＲＴがエラーケースを含むテストケースセットを生成できるドライバ５を生成することができる。
【００７６】
また、実施例では、プログラム解析部３１が、テスト対象プログラム４を解析し、コレクションタイプの変数を抽出してＶＡＲリストとＶＡＬＵＥリストを生成する。そして、組合せ生成部３２が、プログラム実行部３３の指示に基づいてＶＡＬＵＥの値の組合せを１つずつ生成する。そして、プログラム実行部３３が、組合せ生成部３２によりＶＡＬＵＥの値について生成された組合せを順番に用いて、エラーが発生するまで、テスト対象プログラム４の実行を繰り返す。そして、エラーが発生すると、更新部３４が、ＶＡＬＵＥの値の組合せを用いてテスト対象プログラム４のシンボル変数を初期化するように中間ドライバ２ａを更新してドライバ５を出力する。したがって、ＤＡＲＴは、初期値でテスト対象プログラム４にエラーを発生させることができ、エラーケースを含むテストケースセットを生成することができる。
【００７７】
また、実施例では、ＶＡＬＵＥの各値に上限値を設けているので、ドライバ更新部３は、エラーケースの探索に時間をかけ過ぎることを防ぐことができる。
【００７８】
なお、実施例では、ドライバ生成装置１について説明したが、ドライバ生成装置１が有する構成をソフトウェアによって実現することで、同様の機能を有するドライバ生成プログラムを得ることができる。そこで、ドライバ生成プログラムを実行するコンピュータについて説明する。
【００７９】
図８は、実施例に係るドライバ生成プログラムを実行するコンピュータのハードウェア構成を示す図である。図８に示すように、コンピュータ５０は、メインメモリ５１と、ＣＰＵ（Central  Processing  Unit）５２と、ＬＡＮ（Local  Area  Network）インタフェース５３と、ＨＤＤ（Hard  Disk  Drive）５４とを有する。また、コンピュータ５０は、スーパーＩＯ（Input  Output）５５と、ＤＶＩ（Digital  Visual  Interface）５６と、ＯＤＤ（Optical  Disk  Drive）５７とを有する。
【００８０】
メインメモリ５１は、プログラムやプログラムの実行途中結果などを記憶するメモリである。ＣＰＵ５２は、メインメモリ５１からプログラムを読み出して実行する中央処理装置である。ＣＰＵ５２は、メモリコントローラを有するチップセットを含む。
【００８１】
ＬＡＮインタフェース５３は、コンピュータ５０をＬＡＮ経由で他のコンピュータに接続するためのインタフェースである。ＨＤＤ５４は、プログラムやデータを格納するディスク装置であり、スーパーＩＯ５５は、マウスやキーボードなどの入力装置を接続するためのインタフェースである。ＤＶＩ５６は、液晶表示装置を接続するインタフェースであり、ＯＤＤ５７は、ＤＶＤの読み書きを行う装置である。
【００８２】
ＬＡＮインタフェース５３は、ＰＣＩエクスプレス（ＰＣＩｅ）によりＣＰＵ５２に接続され、ＨＤＤ５４及びＯＤＤ５７は、ＳＡＴＡ（Serial  Advanced  Technology  Attachment）によりＣＰＵ５２に接続される。スーパーＩＯ５５は、ＬＰＣ（Low  Pin  Count）によりＣＰＵ５２に接続される。
【００８３】
そして、コンピュータ５０において実行されるドライバ生成プログラムは、ＤＶＤに記憶され、ＯＤＤ５７によってＤＶＤから読み出されてコンピュータ５０にインストールされる。あるいは、ドライバ生成プログラムは、ＬＡＮインタフェース５３を介して接続された他のコンピュータシステムのデータベースなどに記憶され、これらのデータベースから読み出されてコンピュータ５０にインストールされる。そして、インストールされたドライバ生成プログラムは、ＨＤＤ５４に記憶され、メインメモリ５１に読み出されてＣＰＵ５２によって実行される。
【００８４】
また、実施例では、ＤＡＲＴを用いる場合について説明したが、本発明はこれに限定されるものではなく、他のテストケース生成ツールを用いる場合にも同様に適用することができる。
【符号の説明】
【００８５】
１    ドライバ生成装置
２    中間ドライバ生成部
２ａ    中間ドライバ
３    ドライバ更新部
４    テスト対象プログラム
５    ドライバ
６    ＤＡＲＴ実行エンジン
７    シンボリック実行エンジン
８    テストケース
１１    ドライバ
１２    テスト対象プログラム
１３    スタブ
３１    プログラム解析部
３２    組合せ生成部
３３    プログラム実行部
３４    更新部
５０    コンピュータ
５１    メインメモリ
５２    ＣＰＵ
５３    ＬＡＮインタフェース
５４    ＨＤＤ
５５    スーパーＩＯ
５６    ＤＶＩ
５７    ＯＤＤ
９１    プログラム
９２    テスト対象メソッド
９３    ドライバ
【図１】
2018084973.tif 000003
【図２】
2018084973.tif 000004
【図３】
2018084973.tif 000005
【図４Ａ】
2018084973.tif 000006
【図４Ｂ】
2018084973.tif 000007
【図４Ｃ】
2018084973.tif 000008
【図４Ｄ】
2018084973.tif 000009
【図５Ａ】
2018084973.tif 000010
【図５Ｂ】
2018084973.tif 000011
【図６】
2018084973.tif 000012
【図７Ａ】
2018084973.tif 000013
【図７Ｂ】
2018084973.tif 000014
【図７Ｃ】
2018084973.tif 000015
【図８】
2018084973.tif 000016
【図９】
2018084973.tif 000017
【図１０】
2018084973.tif 000018
【図１１】
2018084973.tif 000019
【図１２】
2018084973.tif 000020
【図１３Ａ】
2018084973.tif 000021
【図１３Ｂ】
2018084973.tif 000022
【図１４】
2018084973.tif 000023
【図１５Ａ】
2018084973.tif 000024
【図１５Ｂ】
2018084973.tif 000025