(57)【要約】      （修正有）【課題】オブジェクトの型変換を含むテスト対象プログラムのシンボリック実行におけるテスト網羅性の低下を抑制するスタブを生成するスタブ生成装置を提供する。【解決手段】スタブ生成装置１０において、スタブ生成部１１が、テスト対象クラスからのクラスの呼び出しに対して、ダミーのオブジェクトを返却するスタブを生成する。派生スタブ生成部１３が、オリジナルのスタブから返却されるオブジェクトが、返却先で型変換される場合に、スタブに基づいて、オブジェクトの返却先での型変換に対応したオブジェクトを返却する派生スタブを生成する。更新部１４が、テスト対象プログラムにおいて、型変換を伴うクラスの呼び出しの対象を、オリジナルのスタブから、そのスタブに基づいて生成された派生スタブに更新する。【選択図】図１
2018147388.tif 000002
【特許請求の範囲】
【請求項１】
テスト対象プログラムからのクラスの呼び出しに対して、ダミーのオブジェクトを返却する第１スタブを生成する第１生成部と、
前記第１生成部で生成された第１スタブから返却されるオブジェクトが、返却先で型変換される場合に、前記第１スタブに基づいて、前記オブジェクトの返却先での型変換に対応したオブジェクトを返却する第２スタブを生成する第２生成部と、
前記テスト対象プログラムにおいて、型変換を伴うクラスの呼び出しの対象を、前記第１スタブから、該第１スタブに基づいて生成された第２スタブに更新する更新部と、
を含むスタブ生成装置。
【請求項２】
前記第１生成部は、前記クラスの型に応じたオブジェクトを返却する第１スタブを生成し、
前記第２生成部は、前記第１スタブにおいて、前記クラスの型に応じたオブジェクトを返却することを示す記述を、返却先の型変換時にエラーが発生しない型のオブジェクトを返却することを示す記述に書き換えることにより第２スタブを生成する
請求項１に記載のスタブ生成装置。
【請求項３】
前記第２生成部は、前記テスト対象プログラムから、型変換を伴うクラスの呼び出しを示す記述を抽出し、抽出した記述に含まれるクラスの呼び出しに対して前記第１生成部で生成された前記第１スタブを複製し、複製した第１スタブにおけるオブジェクトの返却に関する記述を書き換えることにより、前記第２スタブを生成する請求項２に記載のスタブ生成装置。
【請求項４】
テスト対象プログラムからのクラスの呼び出しに対して、ダミーのオブジェクトを返却する第１スタブを生成し、
生成された第１スタブから返却されるオブジェクトが、返却先で型変換される場合に、前記第１スタブに基づいて、前記オブジェクトの返却先での型変換に対応したオブジェクトを返却する第２スタブを生成し、
前記テスト対象プログラムにおいて、型変換を伴うクラスの呼び出しの対象を、前記第１スタブから、該第１スタブに基づいて生成された第２スタブに更新する
ことを含む処理をコンピュータが実行するスタブ生成方法。
【請求項５】
テスト対象プログラムからのクラスの呼び出しに対して、ダミーのオブジェクトを返却する第１スタブを生成し、
生成された第１スタブから返却されるオブジェクトが、返却先で型変換される場合に、前記第１スタブに基づいて、前記オブジェクトの返却先での型変換に対応したオブジェクトを返却する第２スタブを生成し、
前記テスト対象プログラムにおいて、型変換を伴うクラスの呼び出しの対象を、前記第１スタブから、該第１スタブに基づいて生成された第２スタブに更新する
ことを含む処理をコンピュータに実行させるためのスタブ生成プログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
開示の技術は、スタブ生成装置、スタブ生成方法、及びスタブ生成プログラムに関する。
【背景技術】
【０００２】
シンボリック実行によるプログラムのテスト技術において、テストケースの生成の際に、テスト環境の構築及び設定を行うドライバ、及びテスト対象のプログラムが呼び出すプログラム部品のダミー実装であるスタブを準備することが行われている。
【０００３】
例えば、テスト対象となっているモジュールと、該モジュールから呼び出される依存モジュールと、該依存モジュールが行う手続きの振る舞いを代行するスタブとを、それぞれの記述内容に従って実行するモジュール実行手段を備えたシステムが提案されている。このモジュール実行手段は、テスト対象モジュールから依存モジュールへの呼び出しを検出し、呼び出しの処理を実行するモジュールとして依存モジュールかスタブかを所定の条件に従って決定し、決定に応じて当該呼び出しの処理を実行させる処理委譲手段を含む。
【０００４】
また、対象プログラムと対象プログラム上のパスの情報とを入力し、対象プログラムから呼び出される外部プログラムによって更新される変数値のパス情報に即した変化を表したスタブプログラムを生成する情報処理装置が提案されている。この装置では、対象プログラムにおける外部プログラムへの呼出しをスタブプログラムへの呼出しに置換したテスト用対象プログラムを生成し、パス情報の初期値を用いてテスト用対象プログラムを呼び出すドライバプログラムを生成する。
【先行技術文献】
【特許文献】
【０００５】
【特許文献１】特開２００９−１２９１３３号公報
【特許文献２】特開２０１２−１８１６６６号公報
【発明の概要】
【発明が解決しようとする課題】
【０００６】
対象プログラムに含まれるクラス間の継承関係が定義されている対象プログラムにおいて、ある変数にオブジェクトをアサインする際には、オブジェクトを適切なクラスに型変換する必要がある。
【０００７】
しかし、スタブから返却されるオブジェクトの型と、返却先のクラスの型との継承関係によっては、返却されたオブジェクトに対象プログラムがアクセスした際にエラーとなってしまう場合がある。この場合、対象プログラムのテストの実行がその時点で中断してしまい、テスト網羅性が低下してしまう。
【０００８】
開示の技術は、一つの側面として、オブジェクトの型変換を含むテスト対象プログラムのシンボリック実行におけるテスト網羅性の低下を抑制するスタブを生成することを目的とする。
【課題を解決するための手段】
【０００９】
開示の技術は、一つの態様として、第１生成部が、テスト対象プログラムからのクラスの呼び出しに対して、ダミーのオブジェクトを返却する第１スタブを生成する。第２生成部が、前記第１生成部で生成された第１スタブから返却されるオブジェクトが、返却先で型変換される場合に、前記第１スタブに基づいて、前記オブジェクトの返却先での型変換に対応したオブジェクトを返却する第２スタブを生成する。更新部が、前記テスト対象プログラムにおいて、型変換を伴うクラスの呼び出しの対象を、前記第１スタブから、該第１スタブに基づいて生成された第２スタブに更新する。
【発明の効果】
【００１０】
一つの側面として、オブジェクトの型変換を含むテスト対象プログラムのシンボリック実行におけるテスト網羅性の低下を抑制するスタブを生成することができる、という効果を有する。
【図面の簡単な説明】
【００１１】
【図１】本実施形態に係るスタブ生成装置の機能ブロック図である。
【図２】シンボリック実行技術を用いたプログラムの単体テストの手順を説明するための図である。
【図３】プリミティブタイプのメソッドの返却タイプ毎のデフォルト値の一例を示す図である。
【図４】返却タイプがプリミティブの場合のスタブ生成を説明するための図である。
【図５】返却タイプがユーザ指定タイプのオブジェクトの場合のスタブ生成を説明するための図である。
【図６】ダウンキャストによる例外発生を説明するための図である。
【図７】本実施形態に係るスタブ生成装置として機能するコンピュータの概略を示すブロック図である。
【図８】本実施形態におけるスタブ生成処理の一例を示すフローチャートである。
【図９】テスト対象クラスにおけるクラス間の継承関係を示す図である。
【図１０】テスト対象クラスの一例を示す図である。
【図１１】オリジナルのスタブの生成を説明するための図である。
【図１２】クラスキャストを含むステートメントを説明するための図である。
【図１３】キャスト集合の一例を示す図である。
【図１４】派生スタブの生成を説明するための図である。
【図１５】テスト対象クラスにおけるスタブクラス名の更新の一例を示す図である。
【図１６】テスト対象クラスからのスタブの呼び出しを示す図である。
【図１７】オリジナルのスタブを呼び出す場合を説明するための図である。
【図１８】派生スタブを呼び出す場合を説明するための図である。
【発明を実施するための形態】
【００１２】
以下、図面を参照して、開示の技術に関する実施形態の一例を詳細に説明する。なお、本実施形態では、テスト対象プログラムを、Ｊａｖａ（登録商標）で記述されたクラス及びメソッドとする場合を例に説明する。
【００１３】
図１に示すように、本実施形態に係るスタブ生成装置１０は、テスト対象クラス３１を入力として受け付ける。そして、スタブ生成装置１０は、シンボリック実行技術を用いたプログラムの単体テストで用いるスタブを生成して出力する。
【００１４】
ここで、シンボリック実行技術を用いたプログラムの単体テストの手順について説明する。
【００１５】
図２に示すように、まず、シンボリック実行ドライバ及びスタブを生成する（Ｓ１００）。
【００１６】
なお、シンボリック実行ドライバとは、テスト対象クラス３１の実行環境を構築及び設定し、テスト対象クラスを起動するプログラムである。また、スタブとは、テスト対象クラスが呼び出すプログラム部品のダミー実装である。テスト対象クラスから呼び出されるプログラム部品は、テスト対象クラスのテスト段階では、実装途中であったり、そのプログラム部品のテストが未実施であったりする場合がある。また、プログラム部品が、ファイルやデータベースなどへの外部アクセスを実行するものである場合もある。このような理由で、テスト時において、テスト対象クラスから呼び出されるプログラム部品を利用できない場合には、実際のプログラム部品の代わりにスタブを用いる。
【００１７】
次に、生成したシンボリック実行ドライバ及びスタブと、テスト対象クラスとをシンボリック実行エンジン２００に入力し、シンボリック実行エンジン２００でテストケースが生成される（Ｓ１０１）。そして、生成されたテストケースを使って、単体テストツール２０１によりテストを実行することにより、テスト対象クラスについてのテスト結果が得られる（Ｓ１０３）。
【００１８】
スタブの生成について、テスト対象クラスに含まれるメソッドから呼び出されるクラスであって、スタブ化対象のクラスからの各メソッドへの返却値のタイプ（以下、「返却タイプ」という）がプリミティブタイプの場合を考える。この場合、実装ボディなしで、例えば図３に示すように、メソッドの返却タイプに応じて予め定められたデフォルト値を返却するようなスタブが生成される。例えば、図４に示すように、オリジナルのクラス（ＳｔｕｂＳａｍｐｌｅ）を呼び出すｍｅｔｈｏｄ１の返却タイプは「ｉｎｔ」であり、プリミティブタイプである。図３の例を用いると、返却タイプ「ｉｎｔ」に対するデフォルト値は「０」であるため、ｍｅｔｈｏｄ１のボディ部分に、０を返却するコード（「ｒｅｔｕｒｎ  ０」）を記述する。また、オリジナルのクラス（ＳｔｕｂＳａｍｐｌｅ）に含まれるｍｅｔｈｏｄ２のように、返却タイプが「ｖｏｉｄ」の場合、スタブからは何も返却しないため、ボディ部分は空のままとする。このように、オリジナルのクラスがスタブ化される。すなわち、スタブが生成される。
【００１９】
また、スタブの生成について、スタブ化対象のクラスを呼び出すメソッドの返却タイプがユーザ指定タイプの場合を考える。例えば、スタブ化対象のクラスを呼び出すｍｅｔｈｏｄ１の返却タイプ「ＣｌａｓｓＡ」が、図５に示すようなユーザ指定タイプであるとする。この場合、スタブから「ｎｕｌｌ」を返却した場合、テスト対象クラスにおいて、その返却値「Ｎｕｌｌ」にアクセスする箇所で、ＮｕｌｌＰｏｉｎｔｅｒＥｘｃｅｐｔｉｏｎ例外が発生してしまう。この例外発生を避けるために、ユーザ指定タイプのオブジェクトのインスタンスを返却するスタブが生成される。コンストラクタの各引数にはデフォルト値が渡される。
【００２０】
ここで、テスト対象クラスに含まれるメソッドから呼び出される各クラス間に継承関係が定義されている場合、ある変数にオブジェクトをアサインする際には、適切なクラスにキャスト（型変換）する必要がある。Ｊａｖａ（登録商標）の場合、子クラスから親クラスへのキャスト（アップキャスト）は可能であるが、親クラスから子クラスへのキャスト（ダウンキャスト）は不可である。ただし、アップキャスト後のダウンキャストは可能である。
【００２１】
例えば、子クラス「Ｃｈｉｌｄ」が親クラス「Ｐａｒｅｎｔ」を継承する場合のクラスキャストには、以下のパターンがある。
【００２２】
（１）  Ｐａｒｅｎｔ  ｐ  ＝  （Ｐａｒｅｎｔ）  ｎｅｗ  Ｃｈｉｌｄ（）；
（２）  Ｐａｒｅｎｔ  ｐ  ＝  （Ｐａｒｅｎｔ）  ｎｅｗ  Ｃｈｉｌｄ（）；
Ｃｈｉｌｄ  ｃ  ＝  （Ｃｈｉｌｄ）  ｐ；
（３）  Ｃｈｉｌｄ  ｃ  ＝  （Ｃｈｉｌｄ）  ｎｅｗ  Ｐａｒｅｎｔ（）；
【００２３】
上記（１）の「ｎｅｗ  Ｃｈｉｌｄ（）」は、子クラス「Ｃｈｉｌｄ」のオブジェクトをインスタンス化することを表し、「（Ｐａｒｅｎｔ）」は、オブジェクトを親クラス「Ｐａｒｅｎｔ」にキャストすることを表す。また、「Ｐａｒｅｎｔ  ｐ  ＝」は、親クラス「Ｐａｒｅｎｔ」の変数ｐにオブジェクトをアサインすることを表す。すなわち、上記（１）はアップキャストを表しており、このようなクラスキャストは可能である。
【００２４】
上記（２）は、インスタンス化した子クラス「Ｃｈｉｌｄ」のオブジェクトを親クラス「Ｐａｒｅｎｔ」へキャストし、キャストしたオブジェクトを子クラス「Ｃｈｉｌｄ」にキャストしている。すなわち、上記（２）はアップキャスト後のダウンキャストを表しており、このようなクラスキャストは可能である。
【００２５】
上記（３）は、インスタンス化した親クラス「Ｐａｒｅｎｔ」のオブジェクトを子クラス「Ｃｈｉｌｄ」へダウンキャストすることを表しており、このようなクラスキャストは不可である。
【００２６】
次に、テスト対象クラスにおいて、スタブから返却されるオブジェクトがクラスキャストされる場合に生じる問題点について説明する。
【００２７】
図６に示すように、テスト対象クラスから呼び出されるオリジナルのクラスからは、子クラス「Ｃｈｉｌｄ」から親クラス「Ｐａｒｅｎｔ」にアップキャストされたオブジェクトｐが返却される。返却先では、親クラス「Ｐａｒｅｎｔ」のオブジェクトｐが子クラス「Ｃｈｉｌｄ」にキャストされる。この場合、アップキャスト後のダウンキャストであるため、クラスキャストが可能である。
【００２８】
しかし、このオリジナルのクラスをスタブ化する際に、図６に示すように、ｍｅｔｈｏｄ１の返却タイプ「Ｐａｒｅｎｔ」のインスタンスを返却するスタブが生成されるとする。この場合、オブジェクトの返却先では、親クラス「Ｐａｒｅｎｔ」から子クラス「Ｃｈｉｌｄ」へのダウンキャストとなるため、ＣｌａｓｓＣａｓｔＥｘｃｅｐｔｉｏｎ例外が発生してしまう。
【００２９】
そこで、本実施形態では、オブジェクトの返却先でのクラスキャストに応じたオブジェクトを返却するスタブを生成する。以下、スタブ生成装置１０の各部について詳述する。
【００３０】
図１に示すように、スタブ生成装置１０は、機能的には、スタブ生成部１１と、解析部１２と、派生スタブ生成部１３と、更新部１４とを含む。なお、スタブ生成部１１は、開示の技術の第１生成部の一例であり、解析部１２及び派生スタブ生成部１３は、開示の技術の第２生成部の一例である。
【００３１】
スタブ生成部１１は、入力されたテスト対象クラスに含まれるメソッドから呼び出されるスタブ化対象クラスをスタブ化し、シンボリック実行時に呼び出されるスタブを生成する。スタブ生成部１１によるスタブの生成方法は、従来既知の手法を用いることができるため、本実施形態では詳細な説明を省略する。
【００３２】
解析部１２は、スタブ生成部１１で生成されたスタブから返却されるオブジェクトが、テスト対象クラスの返却先においてクラスキャストされる箇所を特定する。
【００３３】
具体的には、解析部１２は、スタブ生成部１１で生成されたスタブ（スタブ化されたクラス）のクラス名（以下、「スタブクラス名」という）を収集し、スタブ集合２１に格納する。また、解析部１２は、テスト対象クラスから、スタブ集合２１に格納されたスタブクラス名が示すスタブを呼び出し、かつそのスタブから返却されるオブジェクトがキャストされるステートメントを全て抽出する。解析部１２は、抽出した各ステートメントから、オブジェクトのキャスト先のクラス、呼び出されるスタブのスタブクラス名、及びそのスタブを呼び出すメソッドのメソッド名の情報を取得する。解析部１２は、取得した情報からレコードを作成してキャスト集合２２に格納する。
【００３４】
派生スタブ生成部１３は、返却先でクラスキャストされるオブジェクトを返却するスタブから、キャスト先のクラスに応じたオブジェクトを返却するスタブを派生させて生成する。以下、派生スタブ生成部１３で生成するスタブを「派生スタブ」という。
【００３５】
具体的には、派生スタブ生成部１３は、キャスト集合２２に格納された各レコードに含まれるスタブクラス名が示すスタブのコードを複製して、スタブクラス名を派生スタブであることを表す名前に変更する。例えば、派生スタブ生成部１３は、派生スタブのスタブクラス名を、元のスタブのスタブクラス名の後に「派生ｉ」を付加した名前に変更することができる。ｉは、派生スタブを生成する毎に、０からカウントアップされる整数とすることができる。また、派生スタブ生成部１３は、生成した派生スタブのスタブクラス名を、キャスト集合２２における該当のレコードに追加する。
【００３６】
また、派生スタブ生成部１３は、キャスト先のクラスに応じたオブジェクトをインスタンス化して返却するように、派生スタブ内の呼出先メソッドのボディ部におけるｒｅｔｕｒｎの記述を修正する。
【００３７】
更新部１４は、テスト対象クラスにおいて、キャスト集合２２に格納された各レコードの情報に相当するステートメントを検出する。更新部１４は、検出したステートメントにおいて呼び出すスタブのスタブクラス名を、該当のレコードに含まれる派生スタブのスタブクラス名に更新する。
【００３８】
スタブ生成装置１０は、例えば、図７に示すコンピュータ６０で実現することができる。コンピュータ６０はCentral Processing Unit（ＣＰＵ）６１、一時記憶領域としてのメモリ６２、及び不揮発性の記憶部６３を備える。また、コンピュータ６０は、表示装置及び入力装置等の入出力装置６４、記憶媒体６９に対するデータの読み込みと書き込みとを制御するread/write（Ｒ／Ｗ）部６５、及びインターネット等のネットワークに接続されるネットワークinterface（Ｉ／Ｆ）６６を備える。ＣＰＵ６１、メモリ６２、記憶部６３、入出力装置６４、Ｒ／Ｗ部６５、及びネットワークＩ／Ｆ６６は、バス６７を介して互いに接続される。
【００３９】
記憶部６３は、Hard Disk Drive（ＨＤＤ）、solid state drive（ＳＳＤ）、フラッシュメモリ等によって実現できる。記憶媒体としての記憶部６３には、コンピュータ６０をスタブ生成装置１０として機能させるためのスタブ生成プログラム７０が記憶される。
【００４０】
ＣＰＵ６１は、スタブ生成プログラム７０を記憶部６３から読み出してメモリ６２に展開し、スタブ生成プログラム７０が有するプロセスを順次実行する。スタブ生成プログラム７０は、スタブ生成プロセス７１と、解析プロセス７２と、派生スタブ生成プロセス７３と、更新プロセス７４とを有する。ＣＰＵ６１は、スタブ生成プロセス７１を実行することで、図１に示すスタブ生成部１１として動作する。また、ＣＰＵ６１は、解析プロセス７２を実行することで、図１に示す解析部１２として動作する。また、ＣＰＵ６１は、派生スタブ生成プロセス７３を実行することで、図１に示す派生スタブ生成部１３として動作する。また、ＣＰＵ６１は、更新プロセス７４を実行することで、図１に示す更新部１４として動作する。これにより、スタブ生成プログラム７０を実行したコンピュータ６０が、スタブ生成装置１０として機能することになる。
【００４１】
なお、スタブ生成プログラム７０により実現される機能は、例えば半導体集積回路、より詳しくはApplication Specific Integrated Circuit（ＡＳＩＣ）等で実現することも可能である。
【００４２】
次に、本実施形態に係るスタブ生成装置１０の作用について説明する。スタブ生成装置１０にテスト対象クラスが入力されると、スタブ生成装置１０において、図８に示すスタブ生成処理が実行される。なお、ここでは、図９に示すようなクラス間の継承関係が定義されたテスト対象クラスが入力されるものとする。図９は、親クラス「果物」を継承する子クラス「みかん」及び「バナナ」と、親クラス「動物」を継承する子クラス「猫」及び「犬」とが定義されている例を示している。また、図１０に示すように、テスト対象クラス３１のメソッドから呼び出されるユーザ定義クラスとして、クラス４１Ａ（クラス名「スタブＡ」）及びクラス４１Ｂ（クラス名「スタブＢ」）が定義されている。以下では、このオリジナルのクラス４１Ａ及び４１Ｂをスタブ化対象クラスとする場合について説明する。
【００４３】
図８に示すスタブ生成処理のステップＳ１１で、スタブ生成部１１が、スタブ化対象のオリジナルのクラス４１Ａ及び４１Ｂをスタブ化し、スタブ４２Ａ（スタブクラス名「スタブＡ」）及びスタブ４２Ｂ（スタブクラス名「スタブＢ」）を生成する。ここでは、図１１に示すように、オリジナルのクラスを呼び出すメソッドの返却タイプのオブジェクトのインスタンスを返却するスタブ４２Ａ及び４２Ｂが生成される。
【００４４】
次に、ステップＳ１２で、解析部１２が、スタブ生成部１１により生成されたスタブのスタブクラス名をスタブ集合２１に格納する。ここでは、スタブクラス名「スタブＡ」及び「スタブＢ」がスタブ集合２１に格納される。
【００４５】
次に、ステップＳ１３で、解析部１２が、テスト対象クラス３１から、スタブ集合２１に格納されたスタブクラス名が示すスタブを呼び出し、かつそのスタブから返却されるオブジェクトがキャストされるステートメントを全て抽出する。解析部１２は、例えば、キャストを示す記述（本実施形態では、「（みかん）」のように、（  ）内にキャスト先のクラスを表記した記述）を含むステートメントを抽出することができる。
【００４６】
次に、ステップＳ１４で、解析部１２が、抽出した各ステートメントから、オブジェクトのキャスト先のクラス、呼び出されるスタブのスタブクラス名、及びそのスタブを呼び出すメソッドのメソッド名の情報を取得する。例えば、図１２に示すように、本実施形態では、解析部１２は、ステートメント中の（  ）内からキャスト先のクラスを取得し、それに続く記述の「．（ドット）」の前部分をスタブクラス名、後部分をメソッド名として取得することができる。
【００４７】
解析部１２は、取得した情報からレコードを作成してキャスト集合２２に格納する。図１３に、テスト対象クラス３１の各ステートメントからキャスト集合２２に格納されるレコードの例を示す。なお、テスト対象クラス３１の３行目のステートメント（図１３中の破線部）は、キャストを示す記述が含まれないため、上記ステップＳ１３で抽出されない。
【００４８】
次に、ステップＳ１５で、派生スタブ生成部１３が、キャスト集合２２に格納されたレコードを特定するための変数ｉを初期値の０に設定する。
【００４９】
次に、ステップＳ１６で、派生スタブ生成部１３が、変数ｉがキャスト集合２２に格納されたレコード数より小さいか否かを判定する。ｉ＜キャスト集合のレコード数の場合には、処理はステップＳ１７へ移行する。
【００５０】
ステップＳ１７では、派生スタブ生成部１３が、キャスト集合２２に格納されたｉ−１番目のレコードを、以下のステップＳ１８〜Ｓ２１の処理対象のレコードに設定する。
【００５１】
次に、ステップＳ１８で、派生スタブ生成部１３が、処理対象のレコードに含まれるスタブクラス名が示すスタブのコードを複製して、派生スタブを生成する。図１４に示すように処理対象のレコード５１（図１３に示すキャスト集合２２の１行目のレコード）が設定されている場合、レコード５１の「スタブクラス名」からスタブ４２Ａ（スタブクラス名「スタブＡ」）が特定される。そして、このスタブ４２Ａが複製されて、派生スタブ４３Ａが生成される。
【００５２】
次に、ステップＳ１９で、派生スタブ生成部１３が、図１４の破線部Ｐに示すように、元のスタブクラスのクラス名（「スタブＡ」）の後に「派生ｉ」を付加する。
【００５３】
次に、ステップＳ２０で、派生スタブ生成部１３が、キャスト先のクラスに応じたオブジェクトをインスタンス化して返却するように、派生スタブ内の呼出先メソッドのボディ部におけるｒｅｔｕｒｎの記述を修正する。図１４の破線部Ｑは、キャスト先のクラスである子クラス「みかん」のオブジェクトをインスタンス化して、親クラス「果物」にアップキャストしたオブジェクトを返却するように修正した例である。この場合、返却先ではアップキャスト後のダウンキャストとなり、クラスキャストが適切に行われる。
【００５４】
次に、ステップＳ２１で、派生スタブ生成部１３が、図１４の矢印Ｒに示すように、生成した派生スタブのスタブクラス名を、キャスト集合２２における処理対象のレコードに追加する。
【００５５】
次に、ステップＳ２２で、派生スタブ生成部１３が、変数ｉを１インクリメントして、処理はステップＳ１６に戻る。本実施形態では、ステップＳ１６〜Ｓ２２の繰り返し処理により、図１３に示すキャスト集合２２の２行目のレコードからスタブＡ派生１、３行目のレコードからスタブＡ派生２、４行目のレコードからスタブＢ派生３が生成される。ステップＳ１６で、ｉがキャスト集合２２のレコード数を超えたと判定されると、処理はステップＳ２３へ移行する。
【００５６】
ステップＳ２３では、更新部１４が、テスト対象クラス３１において、キャスト集合２２に格納された各レコードの情報に相当するステートメントを検出する。そして、更新部１４は、図１５に示すように、検出したステートメントにおいて呼び出すスタブのスタブクラス名を、該当のレコードに含まれる派生スタブのスタブクラス名に更新する。図１５の４〜７行目のステートメントでは、呼び出すスタブが派生スタブ生成部１３により生成された派生スタブに更新されている。また、３行目のステートメントでは、返却オブジェクトはキャストされないため、呼び出すスタブはスタブ生成部１１により生成されたオリジナルのスタブのままである。
【００５７】
更新部１４によるスタブクラス名の更新が終了すると、スタブ生成部１１により生成されたスタブ、及び派生スタブ生成部１３により生成された派生スタブが出力され、スタブ生成処理は終了する。
【００５８】
図１６に、テスト対象クラス３１からのスタブの呼び出しを概略的に示す。テスト対象クラス３１の４行目のステートメントからは、派生スタブ４３Ａ０（スタブクラス名「スタブＡ派生０」）が呼び出される。また、５行目のステートメントからは、派生スタブ４３Ａ１（スタブクラス名「スタブＡ派生１」）が呼び出される。また、６行目のステートメントからは、派生スタブ４３Ａ２（スタブクラス名「スタブＡ派生２」）が呼び出される。また、５行目のステートメントからは、派生スタブ４３Ｂ（スタブクラス名「スタブＢ派生３」）が呼び出される。なお、３行目のステートメントからは、オリジナルのスタブ４２Ａ（スタブクラス名「スタブＡ」）が呼び出される。
【００５９】
以上説明したように、本実施形態に係るスタブ生成装置は、テスト対象クラスのメソッドから呼び出されるクラスのダミーであるスタブを生成する。このスタブをそのまま使用した場合、図１７に示すように、スタブから返却されるオブジェクトが返却先でダウンキャストとなり、例外が発生する場合がある。そこで、本実施形態では、図１８に示すように、オリジナルのスタブから、キャスト先のクラスに応じたオブジェクトを返却するような派生スタブを生成する。そして、テスト対象クラスにおいて、呼び出すスタブを派生スタブに更新する。これにより、ダウンキャストの発生を抑止することができる。なお、キャストがないステートメントからのクラスの呼び出しの場合には、オリジナルのスタブを呼び出す。
【００６０】
これにより、クラスキャストのエラーによりテスト対象クラスのシンボリック実行が中断されることを防止できるため、テスト網羅性の低下を抑制することができる。
【００６１】
なお、上述したように、エラーが発生するのはダウンキャストの場合である。そのため、上記実施形態では、クラスキャストとしてダウンキャストのみを扱う場合について説明したが、アップキャストが混在するテスト対象クラスに対しても開示の技術を適用することができる。この場合、ダウンキャストとアップキャストとを区別することなく、返却オブジェクトがキャストされる場合に、派生スタブを生成すればよい。アップキャストの場合、派生スタブから返却されるオブジェクトのクラスは、オリジナルのスタブから返却されるオブジェクトのクラスと同じになるため、問題は生じない。なお、図９に示すようなクラスの継承関係を参照して、ダウンキャストの場合のみ派生スタブを生成するようにしてもよい。この場合、不要な派生スタブの生成を抑制することができる。
【００６２】
また、上記実施形態では、Ｊａｖａ（登録商標）で記述されたクラス及びメソッドを、テスト対象のプログラムとする場合について説明したが、これに限定されない。開示の技術は、他の言語で記述されたプログラム、特に、オブジェクト指向言語で記述されたプログラムに適用可能である。
【００６３】
また、上記では、スタブ生成プログラム７０が記憶部６３に予め記憶（インストール）されている態様を説明したが、これに限定されない。開示の技術に係るプログラムは、ＣＤ−ＲＯＭ、ＤＶＤ−ＲＯＭ、ＵＳＢメモリ等の記憶媒体に記録された形態で提供することも可能である。
【００６４】
以上の実施形態に関し、更に以下の付記を開示する。
【００６５】
（付記１）
テスト対象プログラムからのクラスの呼び出しに対して、ダミーのオブジェクトを返却する第１スタブを生成する第１生成部と、
前記第１生成部で生成された第１スタブから返却されるオブジェクトが、返却先で型変換される場合に、前記第１スタブに基づいて、前記オブジェクトの返却先での型変換に対応したオブジェクトを返却する第２スタブを生成する第２生成部と、
前記テスト対象プログラムにおいて、型変換を伴うクラスの呼び出しの対象を、前記第１スタブから、該第１スタブに基づいて生成された第２スタブに更新する更新部と、
を含むスタブ生成装置。
【００６６】
（付記２）
前記第１生成部は、前記クラスの型に応じたオブジェクトを返却する第１スタブを生成し、
前記第２生成部は、前記第１スタブにおいて、前記クラスの型に応じたオブジェクトを返却することを示す記述を、返却先の型変換時にエラーが発生しない型のオブジェクトを返却することを示す記述に書き換えることにより第２スタブを生成する
付記１に記載のスタブ生成装置。
【００６７】
（付記３）
前記第２生成部は、前記テスト対象プログラムから、型変換を伴うクラスの呼び出しを示す記述を抽出し、抽出した記述に含まれるクラスの呼び出しに対して前記第１生成部で生成された前記第１スタブを複製し、複製した第１スタブにおけるオブジェクトの返却に関する記述を書き換えることにより、前記第２スタブを生成する付記２に記載のスタブ生成装置。
【００６８】
（付記４）
テスト対象プログラムからのクラスの呼び出しに対して、ダミーのオブジェクトを返却する第１スタブを生成し、
生成された第１スタブから返却されるオブジェクトが、返却先で型変換される場合に、前記第１スタブに基づいて、前記オブジェクトの返却先での型変換に対応したオブジェクトを返却する第２スタブを生成し、
前記テスト対象プログラムにおいて、型変換を伴うクラスの呼び出しの対象を、前記第１スタブから、該第１スタブに基づいて生成された第２スタブに更新する
ことを含む処理をコンピュータが実行するスタブ生成方法。
【００６９】
（付記５）
前記第１スタブとして、前記クラスの型に応じたオブジェクトを返却する第１スタブを生成し、
前記第２スタブを、前記第１スタブにおいて、前記クラスの型に応じたオブジェクトを返却することを示す記述を、返却先の型変換時にエラーが発生しない型のオブジェクトを返却することを示す記述に書き換えることにより生成する
付記４に記載のスタブ生成方法。
【００７０】
（付記６）
前記テスト対象プログラムから、型変換を伴うクラスの呼び出しを示す記述を抽出し、抽出した記述に含まれるクラスの呼び出しに対して生成された前記第１スタブを複製し、複製した第１スタブにおけるオブジェクトの返却に関する記述を書き換えることにより、前記第２スタブを生成する付記５に記載のスタブ生成方法。
【００７１】
（付記７）
テスト対象プログラムからのクラスの呼び出しに対して、ダミーのオブジェクトを返却する第１スタブを生成し、
生成された第１スタブから返却されるオブジェクトが、返却先で型変換される場合に、前記第１スタブに基づいて、前記オブジェクトの返却先での型変換に対応したオブジェクトを返却する第２スタブを生成し、
前記テスト対象プログラムにおいて、型変換を伴うクラスの呼び出しの対象を、前記第１スタブから、該第１スタブに基づいて生成された第２スタブに更新する
ことを含む処理をコンピュータに実行させるためのスタブ生成プログラム。
【００７２】
（付記８）
前記第１スタブとして、前記クラスの型に応じたオブジェクトを返却する第１スタブを生成し、
前記第２スタブを、前記第１スタブにおいて、前記クラスの型に応じたオブジェクトを返却することを示す記述を、返却先の型変換時にエラーが発生しない型のオブジェクトを返却することを示す記述に書き換えることにより生成する
付記７に記載のスタブ生成プログラム。
【００７３】
（付記９）
前記テスト対象プログラムから、型変換を伴うクラスの呼び出しを示す記述を抽出し、抽出した記述に含まれるクラスの呼び出しに対して生成された前記第１スタブを複製し、複製した第１スタブにおけるオブジェクトの返却に関する記述を書き換えることにより、前記第２スタブを生成する付記８に記載のスタブ生成プログラム。
【００７４】
（付記１０）
テスト対象プログラムからのクラスの呼び出しに対して、ダミーのオブジェクトを返却する第１スタブを生成し、
生成された第１スタブから返却されるオブジェクトが、返却先で型変換される場合に、前記第１スタブに基づいて、前記オブジェクトの返却先での型変換に対応したオブジェクトを返却する第２スタブを生成し、
前記テスト対象プログラムにおいて、型変換を伴うクラスの呼び出しの対象を、前記第１スタブから、該第１スタブに基づいて生成された第２スタブに更新する
ことを含む処理をコンピュータに実行させるためのスタブ生成プログラムを記憶した記憶媒体。
【符号の説明】
【００７５】
１０   スタブ生成装置
１１   スタブ生成部
１２   解析部
１３   派生スタブ生成部
１４   更新部
２１   スタブ集合
２２   キャスト集合
３１   テスト対象クラス
４１   オリジナルのクラス
４２   スタブ
４３   派生スタブ
６０   コンピュータ
６１   ＣＰＵ
６２   メモリ
６３   記憶部
６９   記憶媒体
７０   スタブ生成プログラム
【図１】
2018147388.tif 000003
【図２】
2018147388.tif 000004
【図３】
2018147388.tif 000005
【図４】
2018147388.tif 000006
【図５】
2018147388.tif 000007
【図６】
2018147388.tif 000008
【図７】
2018147388.tif 000009
【図８】
2018147388.tif 000010
【図９】
2018147388.tif 000011
【図１０】
2018147388.tif 000012
【図１１】
2018147388.tif 000013
【図１２】
2018147388.tif 000014
【図１３】
2018147388.tif 000015
【図１４】
2018147388.tif 000016
【図１５】
2018147388.tif 000017
【図１６】
2018147388.tif 000018
【図１７】
2018147388.tif 000019
【図１８】
2018147388.tif 000020