(57)【特許請求の範囲】
【請求項１】
テスト対象のプログラムと、該テスト対象のプログラムから呼び出される関数との関係を示す関係情報を抽出する抽出部と、
前記抽出部により抽出された前記関係情報に基づいて、前記テスト対象のプログラムから呼び出される関数のうち、前記テスト対象のプログラム内でアクセスされるユーザ定義型のインスタンスを返却する関数、及び前記テスト対象のプログラム内の条件分岐の条件として使用される値を返却する関数を、スタブ化の対象から除外する関数として判定する判定部と、
を含むスタブ化対象判定装置。
【請求項２】
前記判定部は、前記テスト対象のプログラムにおいて、ユーザ定義型のインスタンスへのアクセス又は条件分岐の実行を示す行に記述された変数又は関数と関係する変数又は関数を、前記抽出部により抽出された関係情報に基づいて順次辿った中に含まれる関数を、前記スタブ化の対象から除外する関数として判定する請求項１記載のスタブ化対象判定装置。
【請求項３】
前記抽出部は、前記テスト対象のプログラムに含まれる変数、及び該テスト対象のプログラムから呼び出される関数から、互いに関連する変数と変数とのペア、関数と関数とのペア、及び変数と関数とのペアと、ユーザ定義型のインスタンスへのアクセス又は条件分岐の実行を示す行の識別情報と該行に記述された変数又は関数とのペアとを、前記関係情報として抽出し、
前記判定部は、前記抽出部により前記関係情報として抽出された各ペアから、前記行の識別情報を含むペアを抽出し、抽出したペアに含まれる変数又は関数を含むペアを抽出することを繰り返し、抽出された各ペアに含まれる関数を、前記スタブ化の対象から除外する関数として判定する
請求項２記載のスタブ化対象判定装置。
【請求項４】
前記抽出部は、前記テスト対象のプログラムに含まれる変数と、該テスト対象のプログラムから呼び出される関数と、ユーザ定義型のインスタンスへのアクセス又は条件分岐の実行を示す行の識別情報とを抽出し、予め定めたルールに基づいて、前記ペアの各々を抽出する請求項３記載のスタブ化対象判定装置。
【請求項５】
前記抽出部は、前記判定部によりスタブ化の対象から除外されている関数のうち、該関数内から更に他の関数を呼び出す関数を、新たなテスト対象のプログラムに設定し、該新たなテスト対象のプログラムから前記関係情報を抽出し、
前記判定部は、前記抽出部により抽出された前記関係情報に基づいて、前記新たなテスト対象のプログラムに含まれる関数のうち、前記新たなテスト対象のプログラム内でアクセスされるユーザ定義型のインスタンスを返却する関数、及び前記新たなテスト対象のプログラム内の条件分岐の条件として使用される値を返却する関数を、スタブ化の対象から除外する関数として判定する
請求項１〜請求項４のいずれか１項記載のスタブ化対象判定装置。
【請求項６】
コンピュータに、
テスト対象のプログラムと、該テスト対象のプログラムから呼び出される関数との関係を示す関係情報を抽出し、
抽出された前記関係情報に基づいて、前記テスト対象のプログラムから呼び出される関数のうち、前記テスト対象のプログラム内でアクセスされるユーザ定義型のインスタンスを返却する関数、及び前記テスト対象のプログラム内の条件分岐の条件として使用される値を返却する関数を、スタブ化の対象から除外する関数として判定する
ことを含む処理を実行させるスタブ化対象判定方法。
【請求項７】
コンピュータに、
テスト対象のプログラムと、該テスト対象のプログラムから呼び出される関数との関係を示す関係情報を抽出し、
抽出された前記関係情報に基づいて、前記テスト対象のプログラムから呼び出される関数のうち、前記テスト対象のプログラム内でアクセスされるユーザ定義型のインスタンスを返却する関数、及び前記テスト対象のプログラム内の条件分岐の条件として使用される値を返却する関数を、スタブ化の対象から除外する関数として判定する
ことを含む処理を実行させるスタブ化対象判定プログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
開示の技術は、スタブ化対象判定装置、スタブ化対象判定方法、及びスタブ化対象判定プログラムに関する。
【背景技術】
【０００２】
シンボリック実行技術によるプログラムのテスト技術において、テストケースの生成の際に、テスト環境の構築及び設定を行うドライバ、及びテスト対象のプログラムが呼び出すプログラム部品のダミー実装であるスタブを準備することが行われている。
【０００３】
例えば、テスト対象となっているモジュールと、該モジュールから呼び出される依存モジュールと、該依存モジュールが行う手続きの振る舞いを代行するスタブとを、それぞれの記述内容に従って実行するモジュール実行手段を備えたシステムが提案されている。このモジュール実行手段は、テスト対象モジュールから依存モジュールへの呼び出しを検出し、呼び出しの処理を実行するモジュールとして依存モジュールかスタブかを所定の条件に従って決定し、決定に応じて当該呼び出しの処理を実行させる処理委譲手段を含む。
【０００４】
また、テストパタン表示機能と、テストパタンより関数の呼び出し関係を抽出する機能と、スタブと実関数の使い分け既決定関数をチェックする機能とを有するシステムが提案されている。このシステムは、さらに、実関数に呼び出された関数でスタブと実関数の使い分け未決定関数を提示し、テスト環境の設定者が決定した内容を保存する機能を有する。また、スタブと実関数の使い分けに基づき、テスト実行可能な状態にするのに必要な情報を作成するための機能を有する。
【０００５】
また、対象プログラムと対象プログラム上のパスの情報とを入力し、対象プログラムから呼び出される外部プログラムによって更新される変数値のパス情報に即した変化を表したスタブプログラムを生成する情報処理装置が提案されている。この装置では、前記対象プログラムにおける外部プログラムへの呼出しを前記スタブプログラムへの呼出しに置換したテスト用対象プログラムを生成し、パス情報の初期値を用いてテスト用対象プログラムを呼び出すドライバプログラムを生成する。
【先行技術文献】
【特許文献】
【０００６】
【特許文献１】特開２００９−１２９１３３号公報
【特許文献２】特開平０９−２６５４１４号公報
【特許文献３】特開２０１２−１８１６６６号公報
【発明の概要】
【発明が解決しようとする課題】
【０００７】
シンボリック実行技術によるプログラムのテスト技術において、テストケースを生成するためのドライバは、テスト対象のプログラムから直接生成することができる。一方、スタブについては、テスト対象のプログラムから呼び出される関数の各々について、スタブ化の対象の関数か否かを判定する必要がある。しかし、テスト対象のプログラムから呼び出される関数には、その構造を解析することが困難な関数もあり、スタブ化対象の関数か否かを適切に判定できない場合がある。このようなスタブ化対象の関数か否かの判定の困難性に鑑みて、単純に、呼び出される関数のスタブ化を行わないとすることもできるが、この場合、テストケース生成の際に、パスが爆発的に増加する可能性がある。逆に、呼び出される関数を全てスタブ化の対象とすると、生成されるテストケースの網羅性が低下する可能性がある。
【０００８】
開示の技術は、一つの側面として、テストケースの網羅性を低下させることなく、効率的にテストケースを生成することができるように、スタブ化対象の関数を判定することを目的とする。
【課題を解決するための手段】
【０００９】
開示の技術は、一つの態様として、テスト対象のプログラムと、該テスト対象のプログラムから呼び出される関数との関係を示す関係情報を抽出する抽出部を備える。また、開示の技術は、前記抽出部により抽出された前記関係情報に基づいて、前記テスト対象のプログラムから呼び出される関数のうち、スタブ化の対象から除外する関数を判定する判定部を備える。判定部は、前記テスト対象のプログラム内でアクセスされるユーザ定義型のインスタンスを返却する関数、及び前記テスト対象のプログラム内の条件分岐の条件として使用される値を返却する関数を、スタブ化の対象から除外する関数として判定する。
【発明の効果】
【００１０】
開示の技術は、一つの側面として、テストケースの網羅性を低下させることなく、効率的にテストケースを生成することができるように、スタブ化対象の関数を判定することができる、という効果を有する。
【図面の簡単な説明】
【００１１】
【図１】本実施形態に係るスタブ化対象判定装置の概略構成を示す機能ブロック図である。
【図２】シンボリック実行におけるシンボリックドライバ及びスタブの作成を説明するための図である。
【図３】テスト対象プログラムと、シンボリックドライバと、スタブとの呼び出し関係の一例を示す図である。
【図４】関数の呼び出しを含む場合における実行パスを説明するための図である。
【図５】テスト対象プログラムから直接呼び出される関数を全てスタブ化する方針を説明するための図である。
【図６】テスト対象プログラムから直接呼び出される関数を全てスタブ化する方針の問題点を説明するための図である。
【図７】本実施形態に係るスタブ化対象判定装置として機能するコンピュータの概略構成を示すブロック図である。
【図８】本実施形態におけるスタブ化対象判定処理の一例を示すフローチャートである。
【図９】テスト対象メソッド及びテスト対象メソッドから呼び出されるメソッドの一例を示す図である。
【図１０】テスト対象メソッドの一例を示す図である。
【図１１】ＶＭＬ集合に追加するペアの一例を示す図である。
【図１２】探索された接続ペアの系列の一例を示す図である。
【図１３】探索された接続ペアの系列をグラフで表現した一例を示す図である。
【図１４】エッジで接続されたノードを順次辿った場合のノードに対応する要素を羅列した一例を示す図である。
【図１５】探索された接続ペアの系列を表現したグラフにおいて、探索された接続ペアの系列を辿った一例を示す図である。
【図１６】新たに設定されたテスト対象メソッドの一例を示す図である。
【図１７】新たに設定されたテスト対象メソッドについて、ＶＭＬ集合に追加するペアの一例を示す図である。
【図１８】新たに設定されたテスト対象メソッドについて探索された接続ペアの系列の一例を示す図である。
【図１９】新たに設定されたテスト対象メソッドについて探索された接続ペアの系列をグラフで表現した一例を示す図である。
【発明を実施するための形態】
【００１２】
まず、実施形態の詳細を説明する前に、シンボリック実行技術を用いたプログラムの単体テストの手順について説明する。
【００１３】
図２に示すように、まず、シンボリックドライバ及びスタブを作成する（Ｓ１００）。シンボリックドライバとは、テスト対象プログラムの実行環境を構築及び設定し、テスト対象プログラムを起動するプログラムである。また、スタブとは、テスト対象プログラムが呼び出すプログラム部品のダミー実装である。テスト対象プログラムから呼び出されるプログラム部品は、テスト対象プログラムのテスト段階では、実装途中であったり、そのプログラム部品のテストが未実施であったりする場合がある。また、プログラム部品が、ファイルやデータベースなどへの外部アクセスを実行するものである場合もある。このような理由で、テスト対象プログラムから呼び出されるプログラム部品を利用できない場合には、実際のプログラム部品の代わりにスタブを用いる。
【００１４】
次に、作成したシンボリックドライバ及びスタブと、テスト対象プログラム群とをシンボリック実行エンジン２００に入力し、シンボリック実行エンジン２００でテストケースが生成される（Ｓ１０１）。そして、生成されたテストケースを使って、単体テストツール２０１によりテストを実行することにより、テスト対象プログラムについてのテスト結果が得られる（Ｓ１０３）。
【００１５】
図３に、テスト対象プログラムと、シンボリックドライバと、スタブとの呼び出し関係の一例を示す。図３に示すように、シンボリックドライバによりテスト対象プログラムが実行される。そして、テスト対象プログラムからの関数の呼び出しでは、作成されたスタブが呼び出され、スタブからテスト対象プログラムに値が返却される。例えば、テスト対象プログラムにおける条件分岐の分岐先が、スタブからの返却値によって異なる場合には、あらゆる分岐パターンに対応したテストケースを生成可能にするため、作成するスタブにバリエーションを持たせる場合がある。しかし、このようなスタブの作成は人手により行われるため、大きな作業コストを要する。
【００１６】
そこで、上記のようなスタブ作成のコスト削減のために、簡単な方法として、テスト対象プログラムから呼び出される関数のいずれもスタブ化しないという方針が考えられる。しかし、この方針では、呼び出される関数が多い場合や、プログラム内の条件分岐が多い場合に、シンボリック実行時にパスが爆発的に増加してしまう可能性がある。パスの爆発的な増加は、シンボリック実行の未終了や実行失敗を招く。
【００１７】
例えば、図４に示すように、関数「ｓｕｂｆｕｎｃ」の呼び出しを含むテスト対象プログラムにおいて、ｓｕｂｆｕｎｃを呼び出す前の実行にはｍ通りのパスが存在し、ｓｕｂｆｕｎｃを呼び出した後の実行にはｎ通りのパスが存在するとする。また、呼び出されたｓｕｂｆｕｎｃ内には、ｐ通りのパスが存在し、ｓｕｂｆｕｎｃの返却値はテスト対象プログラムの実行に影響を与えないものとする。
【００１８】
ｓｕｂｆｕｎｃをスタブ化する場合は、ｓｕｂｆｕｎｃ内で実行されるパスを網羅する必要がないため、テスト対象プログラムで呼び出す関数も含めた全体の実行パスは、合計でｍ×ｎ通りとなる。一方、上述したように、いずれの関数もスタブ化しないという方針に従って、ｓｕｂｆｕｎｃをスタブ化しない場合は、ｓｕｂｆｕｎｃ内で実行されるパスも網羅する必要があるため、テスト対象プログラムの全体の実行パスは、合計でｍ×ｐ×ｎ通りとなる。すなわち、ｓｕｂｆｕｎｃをスタブ化しない場合には、スタブ化する場合のｐ倍のパスを網羅する必要があり、特に、ｍ、ｎ、及びｐの各々が大きい場合には、パスが爆発的に増加してしまう。したがって、効率的にテストを実行するためには、ｓｕｂｆｕｎｃはスタブ化した方がよい。
【００１９】
いずれの関数もスタブ化しないという方針とは逆に、テスト対象プログラムから直接呼び出される関数が外部関数であると考え、図５に示すように、テスト対象プログラムから直接呼び出される関数を全てスタブ化する方針が考えられる。また、図５に示すように、テスト対象プログラムから直接呼び出される関数をスタブ化することにより、テスト対象プログラムから間接的に呼び出される関数については、スタブ化はされないが、テストの際に実行されなくなる。なお、テスト対象プログラムから間接的に呼び出される関数とは、スタブ化対象の関数から呼び出される関数、及びその関数から呼び出されるそれ以降の関数である。
【００２０】
呼び出される関数の全てをスタブ化する方針では、以下のような問題がある。例えば、図６に示すように、ＪａｖａＳｃｒｉｐｔ（登録商標）で記述されたメソッドを、テスト対象メソッドとする場合を考える。図６の例では、テスト対象メソッドは、行２で、ｍｅｔｈｏｄ１を呼び出し、ｍｅｔｈｏｄ１が、ユーザ定義オブジェクトを返却値として返し、行３で、その返却値を利用するメソッドとなっている。
【００２１】
ここで、メソッドの返却値がユーザ定義オブジェクトタイプとなる場合に、そのオブジェクトタイプの動的解析は困難であるため、このメソッドをスタブ化する場合には、スタブのバリエーションを作成せずに、ｎｕｌｌを返却するスタブを作成する。したがって、図６のテスト対象メソッドで呼び出されるｍｅｔｈｏｄ１をスタブ化した場合、行２で返却される値は「ｎｕｌｌ」となる。この場合、スタブから返却された値を行３で利用しようとしても、ｎｕｌｌで返却されたオブジェクトのメンバーや内部メソッドにアクセスすることができず、行３でテストの実行にエラーが発生する。したがって、テスト対象メソッドの全８行のうち、２行（１行目及び２行目）だけ実行されて、それ以降の６行が実行されない結果となるため、テスト網羅性（コードカバレッジ）は、２／８＊１００＝２５％と、低いものとなってしまう。
【００２２】
上記のような、全ての関数をスタブ化しない方針、及び全ての関数をスタブ化する方針の各々の課題を考慮して、以下で詳述する実施形態では、テスト対象プログラム内の処理に影響を与えるような関数を探索及び特定する。そして、特定した関数を除外した残りの関数をスタブ化対象の関数として判定する。テスト対象プログラム内の処理に影響を与える関数としては、テスト対象プログラム内でアクセスされるユーザ定義型のインスタンスを返却する関数、及びテスト対象プログラム内の条件分岐の条件として使われる値を返却する関数を特定する。
【００２３】
以下、図面を参照して、開示の技術に関する実施形態の一例を詳細に説明する。なお、本実施形態では、テスト対象プログラムを、ＪａｖａＳｃｒｉｐｔ（登録商標）で記述されたメソッドとする場合を例に説明する。
【００２４】
図１に示すように、本実施形態に係るスタブ化対象判定装置１０は、テスト対象メソッド３１を入力として受け付ける。そして、スタブ化対象判定装置１０は、テスト対象メソッド３１から呼び出されるメソッドのスタブ化の可否を判定し、スタブ化対象のメソッド群を、スタブ化メソッドリスト３５として出力する。
【００２５】
スタブ化対象判定装置１０は、図１に示すように、機能的には、抽出部１１と、判定部１２とを含む。
【００２６】
抽出部１１は、テスト対象メソッド３１と、テスト対象メソッド３１から呼び出されるメソッドとの関係を示す関係情報を抽出する。具体的には、抽出部１１は、テスト対象メソッド３１に含まれる変数を抽出して、変数の集合であるＶ集合２１に追加する。抽出する変数は、テスト対象メソッド３１のパラメータ、グローバル変数などのシンボル化対象変数、及びテスト対象メソッド３１内の全てのローカル変数である。また、抽出部１１は、テスト対象メソッド３１から直接呼び出されるメソッドを抽出して、メソッドの集合であるＭ集合２２に追加する。また、抽出部１１は、テスト対象メソッド３１のステートメントに条件分岐の実行が含まれる行の行番号を抽出して、行番号の集合であるＬ集合２３に追加する。また、抽出部１１は、テスト対象メソッド３１のステートメントに、Ｍ集合２２に含まれるメソッドから返却されたユーザ定義オブジェクトへのアクセスが含まれる行の行番号を抽出して、Ｌ集合２３に追加する。
【００２７】
また、抽出部１１は、Ｖ集合２１に含まれる変数の各々、Ｍ集合２２に含まれるメソッドの各々、及びＬ集合２３に含まれる行番号の各々から、予め定めたルールに基づいて、関連する要素同士のペアを抽出し、ＶＭＬ集合２４に追加する。なお、ＶＭＬ集合２４に追加される情報は、開示の技術の関係情報の一例である。また、関連する要素同士のペアとは、互いに関連する変数と変数とのペア、メソッドとメソッドとのペア、変数とメソッドとのペア、行番号と変数とのペア、及び行番号とメソッドとのペアである。各ペアを抽出するためのルールとしては、例えば、以下のようなものを定めておくことができる。
【００２８】
（１）変数ｖが変数ｗを処理した結果の場合、ペア［ｖ，ｗ］をＶＭＬ集合２４に追加
（２）メソッドｍがメソッドｎの引数として呼び出される場合、ペア［ｍ，ｎ］をＶＭＬ集合２４に追加
（３）変数ｖがメソッドｍに引数として渡される場合、ペア［ｍ，ｖ］をＶＭＬ集合２４に追加
（４）メソッドｍが変数ｖに値を返却する場合、ペア［ｖ，ｍ］をＶＭＬ集合２４に追加
（５）ｉ行目で変数ｖへアクセス又は変数ｖが利用される場合、ペア［ｉ，ｖ］をＶＭＬ集合２４に追加
（６）ｉ行目のステートメントにメソッドｍの呼び出しが含まれる場合、ペア［ｉ，ｍ］をＶＭＬ集合２４に追加
【００２９】
なお、抽出部１１の処理は、例えば、ＡＳＭなどの解析エンジンにより実現することができる。
【００３０】
判定部１２は、ＶＭＬ集合２４に含まれる情報に基づいて、テスト対象メソッド３１から呼び出されるメソッドのうち、スタブ化対象のメソッドを判定する。具体的には、判定部１２は、テスト対象メソッド３１内でアクセスされるユーザ定義オブジェクトを返却するメソッド、及びテスト対象メソッド３１内の条件分岐の条件として使用される値を返却するメソッドを、スタブ化対象外のメソッドとして判定する。より具体的には、判定部１２は、テスト対象メソッド３１において、ユーザ定義オブジェクトへのアクセス又は条件分岐の実行を含む行のステートメントに含まれる変数、又はそのステートメントで呼び出されるメソッドを特定する。そして、判定部１２は、特定した変数又はメソッドを、ＶＭＬ集合２４に含まれる情報に基づいて順次辿った中に含まれるメソッドを、スタブ化対象外のメソッドとして判定する。
【００３１】
例えば、判定部１２は、ＶＭＬ集合２４に含まれる各ペアから、Ｌ集合２３に含まれる行番号ａを１つ目の要素とするペア［ａ，ｂ］を探索する。また、判定部１２は、ＶＭＬ集合２４に含まれる各ペアから、ペア［ａ，ｂ］の２つ目の要素ｂを１つ目の要素とするペア［ｂ，ｃ］を探索する。以下では、一方のペアの２つ目の要素を１つ目の要素とする他方のペアを、一方のペアの「接続ペア」という。以下同様に、接続ペアが存在しなくなるまで順次接続ペアを探索する。そして、判定部１２は、探索したペアの各々に要素として含まれるメソッドを、スタブ化対象外のメソッドとして判定する。判定部１２は、Ｍ集合２２に含まれるメソッドのうち、スタブ化対象外であると判定したメソッドをスタブ化対象外集合２５へ移し、残りのメソッドをスタブ化対象集合２６へ移す。
【００３２】
また、判定部１２は、スタブ化対象外集合２５に含まれるメソッドのうち、そのメソッド内から更に他のメソッドを呼び出すメソッドを新たなテスト対象メソッドに設定する。そして、判定部１２は、スタブ化対象集合２６以外の各集合を全て空にして、テスト対象メソッドから呼び出されるメソッドのスタブ化の可否を判定する処理を再帰的に繰り返す。判定部１２は、最終的にスタブ化対象集合２６に含まれる全てのメソッドをスタブ化対象のメソッドとして判定し、スタブ化対象のメソッドの識別情報を羅列したスタブ化メソッドリスト３５を作成して出力する。
【００３３】
スタブ化対象判定装置１０は、例えば、図７に示すコンピュータ４０で実現することができる。コンピュータ４０はＣＰＵ４１、一時記憶領域としてのメモリ４２、及び不揮発性の記憶部４３を備える。また、コンピュータ４０は、表示装置及び入力装置等の入出力装置４４、記録媒体４９に対するデータの読み込みと書き込みとを制御するｒｅａｄ／ｗｒｉｔｅ（Ｒ／Ｗ）部４５、及びインターネット等のネットワークに接続されるネットワークＩ／Ｆ４６を備える。ＣＰＵ４１、メモリ４２、記憶部４３、入出力装置４４、Ｒ／Ｗ部４５、及びネットワークＩ／Ｆ４６は、バス４７を介して互いに接続される。
【００３４】
記憶部４３は、ＨＤＤ（Hard Disk Drive）、ＳＳＤ（solid state drive）、フラッシュメモリ等によって実現できる。記憶媒体としての記憶部４３には、コンピュータ４０をスタブ化対象判定装置１０として機能させるためのスタブ化対象判定プログラム５０が記憶される。
【００３５】
ＣＰＵ４１は、スタブ化対象判定プログラム５０を記憶部４３から読み出してメモリ４２に展開し、スタブ化対象判定プログラム５０が有するプロセスを順次実行する。スタブ化対象判定プログラム５０は、抽出プロセス５１と、判定プロセス５２とを有する。ＣＰＵ４１は、抽出プロセス５１を実行することで、図１に示す抽出部１１として動作する。また、ＣＰＵ４１は、判定プロセス５２を実行することで、図１に示す判定部１２として動作する。これにより、スタブ化対象判定プログラム５０を実行したコンピュータ４０が、スタブ化対象判定装置１０として機能することになる。
【００３６】
なお、スタブ化対象判定プログラム５０により実現される機能は、例えば半導体集積回路、より詳しくはＡＳＩＣ（Application Specific Integrated Circuit）等で実現することも可能である。
【００３７】
次に、本実施形態に係るスタブ化対象判定装置１０の作用について説明する。スタブ化対象判定装置１０にテスト対象メソッド３１が入力されると、スタブ化対象判定装置１０において、図８に示すスタブ化対象判定処理が実行される。なお、ここでは、図９に示すようなテスト対象メソッド３１が入力されるものとする。テスト対象メソッド３１から直接呼び出されるメソッドは、メソッド３２１（ｍｅｔｈｏｄ１）、メソッド３２２（ｍｅｔｈｏｄ２）、メソッド３２３（ｍｅｔｈｏｄ３）、及びメソッド３２４（ｍｅｔｈｏｄ４）である。また、メソッド３２２から呼び出されるメソッド３３Ａ（ｍｅｔｈｏｄＡ）と、メソッド３２３から呼び出されるメソッド３３Ｂ（ｍｅｔｈｏｄＢ）及びメソッド３３Ｃ（ｍｅｔｈｏｄＣ）とが含まれる。また、ｍｅｔｈｏｄ１から返却されるユーザ定義オブジェクトのインスタンス３４を含む。また、図１０に、テスト対象メソッド３１に行番号を併記した例を示す。テスト対象メソッド３１のパラメータｓ及びｘをシンボル変数とする。
【００３８】
図８に示すスタブ化対象判定処理のステップＳ１１で、抽出部１１が、Ｖ集合２１、Ｍ集合２２、Ｌ集合２３、ＶＭＬ集合２４、スタブ化対象外集合２５、及びスタブ化対象集合２６の各々を初期化（空に）する。
【００３９】
次に、ステップＳ１２で、抽出部１１が、テスト対象メソッド３１に含まれる変数を抽出して、Ｖ集合２１に追加する。ここでは、シンボル変数であるｓ及びｘ、並びにローカル変数であるａ、ｂ、ｃ、及びｎｕｍがＶ集合２１に追加される。また、抽出部１１が、テスト対象メソッド３１から直接呼び出されるメソッドを抽出して、Ｍ集合２２に追加する。ここでは、ｍｅｔｈｏｄ１、ｍｅｔｈｏｄ２、ｍｅｔｈｏｄ３、及びｍｅｔｈｏｄ４がＭ集合２２に追加される。さらに、抽出部１１が、テスト対象メソッド３１のステートメントに条件分岐、又はＭ集合２２に含まれるメソッドから返却されたユーザ定義オブジェクトへのアクセスが含まれる行の行番号を抽出して、Ｌ集合２３に追加する。ここでは、ユーザ定義オブジェクトへのアクセスを含む行３、並びに条件分岐を含む行６、行８、及び行１０がＬ集合２３に追加される。
【００４０】
次に、ステップＳ１３で、抽出部１１が、Ｖ集合２１に含まれる変数の各々、Ｍ集合２２に含まれるメソッドの各々、及びＬ集合２３に含まれる行番号の各々から、上述したルールに従って、関連する要素同士のペアを抽出し、ＶＭＬ集合２４に追加する。ここでは、図１１に示すような各ペアがＶＭＬ集合２４に追加される。例えば、テスト対象メソッド３１の２行目のステートメントに含まれる「ｍｅｔｈｏｄ１（ｓ）」の記述は、変数ｓがｍｅｔｈｏｄ１に引数として渡されることを表している。したがって、この記述は、上記ルールの（３）に合致し、ペア［ｍｅｔｈｏｄ１，ｓ］が抽出され、ＶＭＬ集合２４に追加される。
【００４１】
次に、ステップＳ１４で、判定部１２が、ＶＭＬ集合２４に含まれる各ペアから、Ｌ集合２３に含まれる行番号ａを１つ目の要素とするペア［ａ，ｂ］を探索する。そして、判定部１２は、ＶＭＬ集合２４に含まれる各ペアから、ペア［ａ，ｂ］以降の接続ペアを順次探索する。
【００４２】
ここでは、Ｌ集合２３に含まれる行番号ａを１つ目の要素とするペア［ａ，ｂ］として、［行３，ｎｕｍ］、［行６，ｃ］、［行８，ｓ］、及び［行１０，ａ］の各ペアが探索される。そして、ペア［行３，ｎｕｍ］の接続ペアとして、ペア［ｎｕｍ，ｍｅｔｈｏｄ１］が探索され、さらに、ペア［ｎｕｍ，ｍｅｔｈｏｄ１］の接続ペアとして、ペア［ｍｅｔｈｏｄ１，ｓ］が探索される。図１２に示すように、［行６，ｃ］、［行８，ｓ］、及び［行１０，ａ］の各ペアについても同様に接続ペアが探索される。
【００４３】
上記ステップＳ１４で探索された、Ｌ集合２３に含まれる行番号ａを１つ目の要素とするペア［ａ，ｂ］から開始する接続ペアの系列は、例えば、図１３に示すように、各ペアに含まれる要素をノードとするグラフで表すことができる。図１３の例では、ノード間を、各ノードに対応する要素間の関係を表す情報を保持したエッジで接続している。要素間の関係を表す情報とは、上記ステップＳ１３で各ペアを抽出する際に適用されたルールに相当する。例えば、ノード「ｍｅｔｈｏｄ１」とノード「ｓ」との間は、ペア［ｍｅｔｈｏｄ１，ｓ］が、上記のルール（３）に合致して抽出されたことに基づいて、メソッドに対する変数の入出力関係を示すエッジで接続されている。また、エッジに併記している行番号は、エッジで接続された各ノードに対応するペアが抽出された行番号を示す。
【００４４】
図１３に示すグラフにおいて、行番号に対応するノードから、エッジで接続されたノードを順次辿った場合のノードに対応する要素を羅列した例を図１４に示す。また、これらの要素の羅列に従って、図１３に示すグラフの各ノードを辿った例を図１５に示す。このように、Ｌ集合２３に含まれる行番号から順次関連するメソッド又は要素を辿った中にメソッドが含まれる場合には、そのメソッドは、テスト対象メソッド３１の処理に影響を与えるメソッドであるといえる。すなわち、スタブ化対象外のメソッドである、テスト対象メソッド３１内でアクセスされるユーザ定義オブジェクト、又は条件分岐の条件となる値を返却するメソッドである。
【００４５】
上述したように、図１３に示すグラフは、図１２に示すような、Ｌ集合２３に含まれる行番号ａを１つ目の要素とするペア［ａ，ｂ］から開始する接続ペアの系列をグラフで表現したものである。従って、図１２に示すように、上記ステップＳ１４で探索された接続ペアの系列の各々に含まれるメソッドは、テスト対象メソッド３１の処理に影響を与えるメソッドといえるため、スタブ化対象外のメソッドと判定することができる。
【００４６】
そこで、次のステップＳ１５で、判定部１２が、上記ステップＳ１４で探索された接続ペアの系列の各々に含まれるメソッド、ここでは、ｍｅｔｈｏｄ１、ｍｅｔｈｏｄ３、及びｍｅｔｈｏｄ４を、Ｍ集合２２からスタブ化対象外集合２５へ移す。また、判定部１２は、Ｍ集合２２に残ったメソッド、ここでは、ｍｅｔｈｏｄ２をスタブ化対象集合２６へ移す。
【００４７】
次に、判定部１２が、スタブ化対象外集合２５に含まれるメソッドのうち、そのメソッドから他のメソッドを呼び出すメソッドを、テスト対象メソッド集合（図示省略）へ追加する。ここでは、ｍｅｔｈｏｄ３がテスト対象メソッド集合に追加される。
【００４８】
次に、ステップＳ１７で、判定部１２が、テスト対象メソッド集合にメソッドが存在するか否かを判定する。メソッドが存在する場合には、処理はステップＳ１８へ移行し、判定部１２が、テスト対象メソッド集合に含まれるメソッドから１つを選択して、新たなテスト対象メソッドに設定する。ここでは、ｍｅｔｈｏｄ３が新たなテスト対象メソッドに設定される。図１６に、ｍｅｔｈｏｄ３（メソッド３２３）に行番号を併記した例を示す。次に、ステップＳ１９で、判定部１２が、スタブ化対象集合２６以外の各集合を初期化（空に）し、処理はステップＳ１２に戻る。
【００４９】
ｍｅｔｈｏｄ３をテスト対象メソッド３１として実行されるステップＳ１２では、抽出部１１が、メソッド３２３に含まれるシンボル変数であるｓ及びｘ、並びにローカル変数であるｉｓ  Ｔｒｕｅを抽出して、Ｖ集合２１に追加する。また、ｍｅｔｈｏｄ３から呼び出されるｍｅｔｈｏｄＣからは、ユーザ定義オブジェクトタイプではなく、値が直接返却されるため、抽出部１１は、この値に対応するダミー変数としてμを設定し、Ｖ集合２１に追加する。また、抽出部１１が、ｍｅｔｈｏｄ３から直接呼び出されるメソッドであるｍｅｔｈｏｄＢ及びｍｅｔｈｏｄＣを、Ｍ集合２２に追加する。さらに、抽出部１１が、テスト対象メソッド３１のステートメントに条件分岐、又はＭ集合２２に含まれるメソッドから返却されたユーザ定義オブジェクトへのアクセスが含まれる行の行番号である行２を、Ｌ集合２３に追加する。
【００５０】
次に、ステップＳ１３で、抽出部１１が、図１７に示す各ペアを、ＶＭＬ集合２４に追加する。次に、ステップＳ１４で、判定部１２が、ＶＭＬ集合２４に含まれる各ペアから、Ｌ集合２３に含まれる行番号ａを１つ目の要素とするペア［ａ，ｂ］から接続ペアを順次探索する。ここでは、図１８に示すような、接続ペアの系列が探索される。この接続ペアの系列をグラフで表現した例を、図１９に示す。
【００５１】
次に、ステップＳ１５で、判定部１２が、上記ステップＳ１４で探索された接続ペアの系列に含まれるメソッド、ここでは、ｍｅｔｈｏｄＢを、Ｍ集合２２からスタブ化対象外集合２５へ移し、残りのｍｅｔｈｏｄＣをスタブ化対象集合２６へ移す。
【００５２】
スタブ化対象外集合２５に含まれるｍｅｔｈｏｄＢは、さらに他のメソッドを呼び出さないため、テスト対象メソッド集合には追加されず、ステップＳ１７が否定判定となり、処理はステップＳ２０へ移行する。ステップＳ２０では、判定部１２が、スタブ化対象集合２６に含まれるメソッドの各々の識別情報を羅列したスタブ化メソッドリスト３５を作成して出力する。ここでは、ｍｅｔｈｏｄ２及びｍｅｔｈｏｄＣがスタブ化メソッドリスト３５として出力される。そして、スタブ化対象判定処理は終了する。
【００５３】
以上説明したように、本実施形態に係るスタブ化対象判定装置によれば、テスト対象プログラム内でアクセスされるユーザ定義オブジェクト又は条件分岐の条件となる値を返却する関数を、スタブ化対象関数から除外する。これにより、テスト対象プログラムに影響する関数はスタブ化の対象外と判定され、他の関数についてはスタブ化の対象と判定される。したがって、テストケースの網羅性を低下させることなく、効率的にテストケースを生成することができるように、スタブ化対象の関数を判定することができる。
【００５４】
また、本実施形態により、スタブ化の対象となる関数の判定を自動化することで、プログラムのテスト全体の作業コストも削減することができる。
【００５５】
具体的に、上述した、全ての関数をスタブ化する方針を比較例として、本実施形態の効果について述べる。例えば、図９に示すテスト対象プログラム（テスト対象メソッド３１）の場合、比較例では、テスト対象メソッド３１から直接呼び出されるメソッドがスタブ化対象となる。具体的には、メソッド３２１（ｍｅｔｈｏｄ１）、メソッド３２２（ｍｅｔｈｏｄ２）、メソッド３２３（ｍｅｔｈｏｄ３）、及びメソッド３２４（ｍｅｔｈｏｄ４）がスタブ化対象となる。一方、本実施形態に係るスタブ化対象判定装置では、上述したように、スタブ化対象のメソッドを、メソッド３２２（ｍｅｔｈｏｄ２）及びメソッド３３Ｃ（ｍｅｔｈｏｄＣ）と判定する。
【００５６】
比較例に対し、本実施形態では、ｍｅｔｈｏｄ１をスタブ化しないことにより、変数ｓをシンボル化したシンボリック実行により、行２において、ｍｅｔｈｏｄ１がｎｕｌｌとユーザ定義オブジェクトとを両方返却する。このため、行３において、ユーザ定義オブジェクトである変数ｎｕｍにアクセスでき、テスト実行はここで失敗しないため、テスト網羅性が向上する。
【００５７】
また、比較例の場合と同様に、本実施形態においても、スタブ化されるメソッドから呼び出されるメソッドについては、スタブ化はされないが、テスト実行時には実行されない。ここでは、スタブ化されるｍｅｔｈｏｄ２から呼び出されるｍｅｔｈｏｄＡも実行されなくなる。これにより、テスト対象メソッド全体の実行パス数が削減され、パスの爆発的増加を抑制することができる。
【００５８】
なお、上記実施形態では、ＪａｖａＳｃｒｉｐｔ（登録商標）で記述されたメソッドを、テスト対象のプログラムとする場合について説明したが、これに限定されない。開示の技術は、他の言語で記述されたプログラム、特に、オブジェクト指向言語で記述されたプログラムに適用可能である。
【００５９】
また、スタブ化対象外の関数の判定方法は、テスト対象プログラムと、そのテスト対象プログラムから呼び出される関数との関係に基づいて、テスト対象プログラムに影響を与える関数を判定できるものであれば、上記実施形態の例に限定されない。テスト対象プログラムと、そのテスト対象プログラムから呼び出される関数との関係とは、例えば、図１３に示すグラフで表現されるような関係である。
【００６０】
また、上記では、スタブ化対象判定プログラム５０が記憶部４３に予め記憶（インストール）されている態様を説明したが、これに限定されない。開示の技術に係るプログラムは、ＣＤ−ＲＯＭ、ＤＶＤ−ＲＯＭ、ＵＳＢメモリ等の記録媒体に記録された形態で提供することも可能である。
【００６１】
以上の実施形態に関し、更に以下の付記を開示する。
【００６２】
（付記１）
テスト対象のプログラムと、該テスト対象のプログラムから呼び出される関数との関係を示す関係情報を抽出する抽出部と、
前記抽出部により抽出された前記関係情報に基づいて、前記テスト対象のプログラムから呼び出される関数のうち、前記テスト対象のプログラム内でアクセスされるユーザ定義型のインスタンスを返却する関数、及び前記テスト対象のプログラム内の条件分岐の条件として使用される値を返却する関数を、スタブ化の対象から除外する関数として判定する判定部と、
を含むスタブ化対象判定装置。
【００６３】
（付記２）
前記判定部は、前記テスト対象のプログラムにおいて、ユーザ定義型のインスタンスへのアクセス又は条件分岐の実行を示す行に記述された変数又は関数と関係する変数又は関数を、前記抽出部により抽出された関係情報に基づいて順次辿った中に含まれる関数を、前記スタブ化の対象から除外する関数として判定する付記１記載のスタブ化対象判定装置。
【００６４】
（付記３）
前記抽出部は、前記テスト対象のプログラムに含まれる変数、及び該テスト対象のプログラムから呼び出される関数から、互いに関連する変数と変数とのペア、関数と関数とのペア、及び変数と関数とのペアと、ユーザ定義型のインスタンスへのアクセス又は条件分岐の実行を示す行の識別情報と該行に記述された変数又は関数とのペアとを、前記関係情報として抽出し、
前記判定部は、前記抽出部により前記関係情報として抽出された各ペアから、前記行の識別情報を含むペアを抽出し、抽出したペアに含まれる変数又は関数を含むペアを抽出することを繰り返し、抽出された各ペアに含まれる関数を、前記スタブ化の対象から除外する関数として判定する
付記２記載のスタブ化対象判定装置。
【００６５】
（付記４）
前記抽出部は、前記テスト対象のプログラムに含まれる変数と、該テスト対象のプログラムから呼び出される関数と、ユーザ定義型のインスタンスへのアクセス又は条件分岐の実行を示す行の識別情報とを抽出し、予め定めたルールに基づいて、前記ペアの各々を抽出する付記３記載のスタブ化対象判定装置。
【００６６】
（付記５）
前記抽出部は、前記判定部によりスタブ化の対象から除外されていない関数を、新たなテスト対象のプログラムに設定し、該新たなテスト対象のプログラムから前記関係情報を抽出し、
前記判定部は、前記抽出部により抽出された前記関係情報に基づいて、前記新たなテスト対象のプログラムに含まれる関数のうち、前記新たなテスト対象のプログラム内でアクセスされるユーザ定義型のインスタンスを返却する関数、及び前記新たなテスト対象のプログラム内の条件分岐の条件として使用される値を返却する関数を、スタブ化の対象から除外する関数として判定する
付記１〜付記４のいずれか１項記載のスタブ化対象判定装置。
【００６７】
（付記６）
コンピュータに、
テスト対象のプログラムと、該テスト対象のプログラムから呼び出される関数との関係を示す関係情報を抽出し、
抽出された前記関係情報に基づいて、前記テスト対象のプログラムから呼び出される関数のうち、前記テスト対象のプログラム内でアクセスされるユーザ定義型のインスタンスを返却する関数、及び前記テスト対象のプログラム内の条件分岐の条件として使用される値を返却する関数を、スタブ化の対象から除外する関数として判定する
ことを含む処理を実行させるスタブ化対象判定方法。
【００６８】
（付記７）
前記判定する処理において、前記テスト対象のプログラムにおいて、ユーザ定義型のインスタンスへのアクセス又は条件分岐の実行を示す行に記述された変数又は関数と関係する変数又は関数を、抽出された関係情報に基づいて順次辿った中に含まれる関数を、前記スタブ化の対象から除外する関数として判定する付記６記載のスタブ化対象判定方法。
【００６９】
（付記８）
前記抽出する処理において、前記テスト対象のプログラムに含まれる変数、及び該テスト対象のプログラムから呼び出される関数から、互いに関連する変数と変数とのペア、関数と関数とのペア、及び変数と関数とのペアと、ユーザ定義型のインスタンスへのアクセス又は条件分岐の実行を示す行の識別情報と該行に記述された変数又は関数とのペアとを、前記関係情報として抽出し、
前記判定する処理において、前記関係情報として抽出された各ペアから、前記行の識別情報を含むペアを抽出し、抽出したペアに含まれる変数又は関数を含むペアを抽出することを繰り返し、抽出された各ペアに含まれる関数を、前記スタブ化の対象から除外する関数として判定する
付記７記載のスタブ化対象判定方法。
【００７０】
（付記９）
前記抽出する処理において、前記テスト対象のプログラムに含まれる変数と、該テスト対象のプログラムから呼び出される関数と、ユーザ定義型のインスタンスへのアクセス又は条件分岐の実行を示す行の識別情報とを抽出し、予め定めたルールに基づいて、前記ペアの各々を抽出する付記８記載のスタブ化対象判定方法。
【００７１】
（付記１０）
前記抽出する処理において、前記判定する処理においてスタブ化の対象から除外されていない関数を、新たなテスト対象のプログラムに設定し、該新たなテスト対象のプログラムから前記関係情報を抽出し、
前記判定する処理において、抽出された前記関係情報に基づいて、前記新たなテスト対象のプログラムに含まれる関数のうち、前記新たなテスト対象のプログラム内でアクセスされるユーザ定義型のインスタンスを返却する関数、及び前記新たなテスト対象のプログラム内の条件分岐の条件として使用される値を返却する関数を、スタブ化の対象から除外する関数として判定する
付記６〜付記９のいずれか１項記載のスタブ化対象判定方法。
【００７２】
（付記１１）
コンピュータに、
テスト対象のプログラムと、該テスト対象のプログラムから呼び出される関数との関係を示す関係情報を抽出し、
抽出された前記関係情報に基づいて、前記テスト対象のプログラムから呼び出される関数のうち、前記テスト対象のプログラム内でアクセスされるユーザ定義型のインスタンスを返却する関数、及び前記テスト対象のプログラム内の条件分岐の条件として使用される値を返却する関数を、スタブ化の対象から除外する関数として判定する
ことを含む処理を実行させるスタブ化対象判定プログラム。
【００７３】
（付記１２）
前記判定する処理において、前記テスト対象のプログラムにおいて、ユーザ定義型のインスタンスへのアクセス又は条件分岐の実行を示す行に記述された変数又は関数と関係する変数又は関数を、抽出された関係情報に基づいて順次辿った中に含まれる関数を、前記スタブ化の対象から除外する関数として判定する付記１１記載のスタブ化対象判定プログラム。
【００７４】
（付記１３）
前記抽出する処理において、前記テスト対象のプログラムに含まれる変数、及び該テスト対象のプログラムから呼び出される関数から、互いに関連する変数と変数とのペア、関数と関数とのペア、及び変数と関数とのペアと、ユーザ定義型のインスタンスへのアクセス又は条件分岐の実行を示す行の識別情報と該行に記述された変数又は関数とのペアとを、前記関係情報として抽出し、
前記判定する処理において、前記関係情報として抽出された各ペアから、前記行の識別情報を含むペアを抽出し、抽出したペアに含まれる変数又は関数を含むペアを抽出することを繰り返し、抽出された各ペアに含まれる関数を、前記スタブ化の対象から除外する関数として判定する
付記１２記載のスタブ化対象判定プログラム。
【００７５】
（付記１４）
前記抽出する処理において、前記テスト対象のプログラムに含まれる変数と、該テスト対象のプログラムから呼び出される関数と、ユーザ定義型のインスタンスへのアクセス又は条件分岐の実行を示す行の識別情報とを抽出し、予め定めたルールに基づいて、前記ペアの各々を抽出する付記１３記載のスタブ化対象判定プログラム。
【００７６】
（付記１５）
前記抽出する処理において、前記判定する処理においてスタブ化の対象から除外されていない関数を、新たなテスト対象のプログラムに設定し、該新たなテスト対象のプログラムから前記関係情報を抽出し、
前記判定する処理において、抽出された前記関係情報に基づいて、前記新たなテスト対象のプログラムに含まれる関数のうち、前記新たなテスト対象のプログラム内でアクセスされるユーザ定義型のインスタンスを返却する関数、及び前記新たなテスト対象のプログラム内の条件分岐の条件として使用される値を返却する関数を、スタブ化の対象から除外する関数として判定する
付記１１〜付記１４のいずれか１項記載のスタブ化対象判定プログラム。
【００７７】
（付記１６）
コンピュータに、
テスト対象のプログラムと、該テスト対象のプログラムから呼び出される関数との関係を示す関係情報を抽出し、
抽出された前記関係情報に基づいて、前記テスト対象のプログラムから呼び出される関数のうち、前記テスト対象のプログラム内でアクセスされるユーザ定義型のインスタンスを返却する関数、及び前記テスト対象のプログラム内の条件分岐の条件として使用される値を返却する関数を、スタブ化の対象から除外する関数として判定する
ことを含む処理を実行させるスタブ化対象判定プログラムを記憶した記憶媒体。
【符号の説明】
【００７８】
１０   スタブ化対象判定装置
１１   抽出部
１２   判定部
２１   Ｖ集合
２２   Ｍ集合
２３   Ｌ集合
２４   ＶＭＬ集合
２５   スタブ化対象外集合
２６   スタブ化対象集合
３１   テスト対象メソッド
４０   コンピュータ
４１   ＣＰＵ
４２   メモリ
４３   記憶部
４９   記録媒体
５０   スタブ化対象判定プログラム
【図１】
0006512032.tif 000002
【図２】
0006512032.tif 000003
【図３】
0006512032.tif 000004
【図４】
0006512032.tif 000005
【図５】
0006512032.tif 000006
【図６】
0006512032.tif 000007
【図７】
0006512032.tif 000008
【図８】
0006512032.tif 000009
【図９】
0006512032.tif 000010
【図１０】
0006512032.tif 000011
【図１１】
0006512032.tif 000012
【図１２】
0006512032.tif 000013
【図１３】
0006512032.tif 000014
【図１４】
0006512032.tif 000015
【図１５】
0006512032.tif 000016
【図１６】
0006512032.tif 000017
【図１７】
0006512032.tif 000018
【図１８】
0006512032.tif 000019
【図１９】
0006512032.tif 000020