(57)【要約】【課題】動的束縛が存在するプログラムのテストにおけるカバレッジの測定精度を向上させる。【解決手段】フローグラフ作成部２４がフローグラフを作成して、実際に実行するコード部分のみにカバレッジ測定を絞る。さらに、動的実行情報抽出部３１が環境設定の解析を行い、この解析結果に基づき動的実行部絞込部３２が、動的束縛を含んだコードについても絞り込みを行う。そして、絞り込まれた範囲を基準として、動的束縛絞込カバレッジ算出部３３がカバレッジを算出する。【選択図】図７
2006293740.tif 000002
【特許請求の範囲】
【請求項１】
動的束縛を含むソフトウェアのプログラムを取得するプログラム取得手段と、
前記プログラム取得手段が取得したプログラムに関する環境設定情報を取得する環境設定情報取得手段と、
前記環境設定情報取得手段が取得した環境設定情報中における動的に実装を切り換えるための設定部分を定義する動的束縛設定部分定義ファイルを取得する動的束縛設定部分定義ファイル取得手段と、
前記動的束縛設定部分定義ファイル取得手段が取得した動的束縛設定部分定義ファイルに基づいて、前記環境設定情報取得手段が取得した環境設定情報から、実行される実装の指定情報である動的実行情報を抽出する動的実行情報抽出手段と、
前記動的実行情報抽出手段が抽出した動的実行情報に基づいて、前記プログラム取得手段が取得したプログラム中における動的束縛による実装候補の中から、実行される実装を特定する動的束縛絞込手段と、
前記プログラム取得手段が取得したプログラムに対してテストを実行するテスト実行手段と、
前記プログラム取得手段が取得したプログラムにおける動的束縛による実装候補の中から、前記動的束縛絞込手段が特定した実装以外の実装候補を除いた範囲を基準として、前記テスト実行手段によるテスト結果に基づいて、カバレッジを測定するカバレッジ測定手段と、
を備えるソフトウェアカバレッジ測定装置。
【請求項２】
前記テスト実行手段は、テスト結果として、テストにおいて実行された命令コードの情報を出力し、
前記カバレッジ測定手段は、前記プログラム取得手段が取得したプログラムにおける動的束縛による実装候補の中から、前記動的束縛絞込手段が特定した実装以外の実装候補を除いた範囲のすべての命令コードの情報と、前記テスト実行手段が出力した命令コードの情報と、を比較して、カバレッジを測定する、
ことを特徴とする請求項１に記載のソフトウェアカバレッジ測定装置。
【請求項３】
前記プログラム取得手段が取得したプログラムに基づき、動的束縛による実装候補をすべて含むコントロールフローグラフを作成するコントロールフローグラフ作成手段をさらに備え、
前記カバレッジ測定手段は、
前記コントロールフローグラフ作成手段が作成したコントロールフローグラフが含む動的束縛による実装候補の中から、前記動的束縛絞込手段が特定した実装以外の実装候補を除く動的束縛絞込手段と、
前記動的束縛絞込手段により除かれたコントロールフローグラフに示される範囲を基準として、カバレッジを測定する動的束縛絞込カバレッジ測定手段と、を有する、
ことを特徴とする請求項１又は２に記載のソフトウェアカバレッジ測定装置。
【請求項４】
前記コントロールフローグラフ作成手段は、前記プログラム取得手段が取得したプログラムの作成に用いられたコンポーネントにおいて公開されているメソッドであり、且つ該プログラムに用いられているメソッドである公開メソッドを起点に順次呼び出されることにより到達可能なメソッドの関係を示すとともに、動的束縛による実装候補をすべて含むコントロールフローグラフを作成する、
ことを特徴とする請求項３に記載のソフトウェアカバレッジ測定装置。
【請求項５】
動的束縛を含むソフトウェアのプログラムを取得するプログラム取得ステップと、
前記プログラム取得ステップで取得したプログラムに関する環境設定情報を取得する環境設定情報取得ステップと、
前記環境設定情報取得ステップで取得した環境設定情報中における動的に実装を切り換えるための設定部分を定義する動的束縛設定部分定義ファイルを取得する動的束縛設定部分定義ファイル取得ステップと、
前記動的束縛設定部分定義ファイル取得ステップで取得した動的束縛設定部分定義ファイルに基づいて、前記環境設定情報取得ステップで取得した環境設定情報から、実行される実装の指定情報である動的実行情報を抽出する動的実行情報抽出ステップと、
前記動的実行情報抽出ステップで抽出した動的実行情報に基づいて、前記プログラム取得ステップで取得したプログラム中における動的束縛による実装候補の中から、実行される実装を特定する動的束縛絞込ステップと、
前記プログラム取得ステップで取得したプログラムに対してテストを実行するテスト実行ステップと、
前記プログラム取得ステップで取得したプログラムにおける動的束縛による実装候補の中から、前記動的束縛絞込ステップで特定した実装以外の実装候補を除いた範囲を基準として、前記テスト実行ステップにおけるテスト結果に基づいて、カバレッジを測定するカバレッジ測定ステップと、
を有するソフトウェアカバレッジ測定方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、ソフトウェアテスティング技術に関し、特に、ソフトウェアテストにおけるカバレッジを測定するためのソフトウェアカバレッジ測定装置等に関する。
【背景技術】
【０００２】
ソフトウェアの品質を評価する手段として、ソフトウェアのテストにおけるコードカバレッジ（以下、カバレッジという）の測定がある。ここで、カバレッジとは、テストの実行に際して、ソフトウェアプログラム中の全コードに対する、テストが実行されたコードの割合である。このため、カバレッジの測定は、テストにおいて、ソフトウェアプログラム中の全コードのうちのどの部分が実行され、どの部分が実行されなかったのかを判別することにより行われる。
【０００３】
そして、このカバレッジをテストの信頼性の指標として用いることにより、ソフトウェアに対してテストが十分に行われたか否か、換言すれば、テストが正当に行われたか否かを判別することができる。具体的には、カバレッジが高い程、ソフトウェアにおいてテストが実行された範囲が広いことを意味し、ソフトウェアの信頼性が高いことになる。
そのため、カバレッジの穴を自動的に識別して、これらの領域をテストするために入力プロセスを変更することにより、テストカバレッジを高めようとする技術がある（例えば、特許文献１参照）。
【特許文献１】特表２００３−５３５３４３号公報
【発明の開示】
【発明が解決しようとする課題】
【０００４】
ところで、近年、手続き型のプログラミング言語に代わり、オブジェクト指向型のプログラミング言語がシステム開発の中心言語となってきている。そして、オブジェクト指向型言語においては、手続き型言語と異なり、プログラムの実行時に、実行されるクラスが決定されるという「動的束縛」が利用される。
【０００５】
そして、プログラムにおいてこの動的束縛が利用されている部分については、テスト対象となるソースコード、及びコンパイルされたバイナリコードからだけでは、プログラムの実行時にどのコードが実行されるのかを判断することができない。
そのため、オブジェクト指向型等の動的束縛を含むプログラムをテストする場合には、必然的に、実行される可能性があるすべてのクラスを含めたテストを実行する必要が生じる。
【０００６】
しかしながら、カバレッジを測定するときには、アプリケーションにより実行される部分のみを抽出して測定しないと測定精度が落ちる。
そのため、動的束縛を含むプログラムをテストする場合に、例えば、特許文献１に開示されている方法等の従来のテスト方法を用いると、アプリケーションにより実行されないクラスまで、カバレッジの測定範囲に含まれてしまい、カバレッジの測定精度が落ちるという問題がある。
【０００７】
本発明は、上記実状に鑑みてなされたものであり、動的束縛が存在するソフトウェアのテストにおけるカバレッジの測定精度を向上させることができるソフトウェアカバレッジ測定装置等を提供することを目的とする。
【課題を解決するための手段】
【０００８】
上記目的を達成するため、この発明の第１の観点に係るソフトウェアカバレッジ測定装置は、
動的束縛を含むソフトウェアのプログラムを取得するプログラム取得手段と、
前記プログラム取得手段が取得したプログラムに関する環境設定情報を取得する環境設定情報取得手段と、
前記環境設定情報取得手段が取得した環境設定情報中における動的に実装を切り換えるための設定部分を定義する動的束縛設定部分定義ファイルを取得する動的束縛設定部分定義ファイル取得手段と、
前記動的束縛設定部分定義ファイル取得手段が取得した動的束縛設定部分定義ファイルに基づいて、前記環境設定情報取得手段が取得した環境設定情報から、実行される実装の指定情報である動的実行情報を抽出する動的実行情報抽出手段と、
前記動的実行情報抽出手段が抽出した動的実行情報に基づいて、前記プログラム取得手段が取得したプログラム中における動的束縛による実装候補の中から、実行される実装を特定する動的束縛絞込手段と、
前記プログラム取得手段が取得したプログラムに対してテストを実行するテスト実行手段と、
前記プログラム取得手段が取得したプログラムにおける動的束縛による実装候補の中から、前記動的束縛絞込手段が特定した実装以外の実装候補を除いた範囲を基準として、前記テスト実行手段によるテスト結果に基づいて、カバレッジを測定するカバレッジ測定手段と、
を備える。
【０００９】
前記テスト実行手段は、テスト結果として、テストにおいて実行された命令コードの情報を出力し、
前記カバレッジ測定手段は、前記プログラム取得手段が取得したプログラムにおける動的束縛による実装候補の中から、前記動的束縛絞込手段が特定した実装以外の実装候補を除いた範囲のすべての命令コードの情報と、前記テスト実行手段が出力した命令コードの情報と、を比較して、カバレッジを測定する、
ようにしてもよい。
【００１０】
前記プログラム取得手段が取得したプログラムに基づき、動的束縛による実装候補をすべて含むコントロールフローグラフを作成するコントロールフローグラフ作成手段をさらに備え、
前記カバレッジ測定手段は、
前記コントロールフローグラフ作成手段が作成したコントロールフローグラフが含む動的束縛による実装候補の中から、前記動的束縛絞込手段が特定した実装以外の実装候補を除く動的束縛絞込手段と、
前記動的束縛絞込手段により除かれたコントロールフローグラフに示される範囲を基準として、カバレッジを測定する動的束縛絞込カバレッジ測定手段と、を有する、
ようにしてもよい。
【００１１】
前記コントロールフローグラフ作成手段は、前記プログラム取得手段が取得したプログラムの作成に用いられたコンポーネントにおいて公開されているメソッドであり、且つ該プログラムに用いられているメソッドである公開メソッドを起点に順次呼び出されることにより到達可能なメソッドの関係を示すとともに、動的束縛による実装候補をすべて含むコントロールフローグラフを作成する、
ようにしてもよい。
【００１２】
また、この発明の第２の観点に係るソフトウェアカバレッジ測定方法は、
動的束縛を含むソフトウェアのプログラムを取得するプログラム取得ステップと、
前記プログラム取得ステップで取得したプログラムに関する環境設定情報を取得する環境設定情報取得ステップと、
前記環境設定情報取得ステップで取得した環境設定情報中における動的に実装を切り換えるための設定部分を定義する動的束縛設定部分定義ファイルを取得する動的束縛設定部分定義ファイル取得ステップと、
前記動的束縛設定部分定義ファイル取得ステップで取得した動的束縛設定部分定義ファイルに基づいて、前記環境設定情報取得ステップで取得した環境設定情報から、実行される実装の指定情報である動的実行情報を抽出する動的実行情報抽出ステップと、
前記動的実行情報抽出ステップで抽出した動的実行情報に基づいて、前記プログラム取得ステップで取得したプログラム中における動的束縛による実装候補の中から、実行される実装を特定する動的束縛絞込ステップと、
前記プログラム取得ステップで取得したプログラムに対してテストを実行するテスト実行ステップと、
前記プログラム取得ステップで取得したプログラムにおける動的束縛による実装候補の中から、前記動的束縛絞込ステップで特定した実装以外の実装候補を除いた範囲を基準として、前記テスト実行ステップにおけるテスト結果に基づいて、カバレッジを測定するカバレッジ測定ステップと、
を有する。
【発明の効果】
【００１３】
本発明によれば、動的束縛が存在するソフトウェアのテストにおけるカバレッジの測定精度を向上させることができる。
【発明を実施するための最良の形態】
【００１４】
以下、本発明の実施の形態を図面を参照して説明する。
図１は、本発明の実施の形態に係るソフトウェアカバレッジ測定装置の構成例を示すブロック図である。
ソフトウェアカバレッジ測定装置（以下、カバレッジ測定装置という）１は、図示するように、通信部１１と、入力部１２と、出力部１３と、記憶部１４と、入出力Ｉ／Ｆ部１５と、制御部１６と、を備え、各部はバス１７を介して互いに接続されている。
【００１５】
通信部１１は、通信ネットワーク２を介して、ネットワーク上の情報処理装置等と通信を行うものであり、通信インタフェース等を備える。例えば、通信部１１が、テスト対象となるソフトウェアプログラムのソースコード等を受信することにより、カバレッジ測定装置１はテスト対象を取り込む。
【００１６】
入力部１２は、カバレッジ測定装置１に様々な情報を入力するために使用するものであり、ボタン、キー等の入力装置を備える。例えば、入力部１２には、ソフトウェアテストの開始指示情報等が入力される。
出力部１３は、様々な情報を出力するものであり、ディスプレイ等の表示装置を備える。例えば、出力部１３には、テストにおいて測定されるカバレッジ等が表示出力される。
【００１７】
記憶部１４は、様々な情報やプログラム等を記憶するものであり、ハードディスク等の補助記憶装置を備える。例えば、記憶部１４は、テスト実行前に、予め、通信部１１等を介して取り込んだテスト対象等を記憶しておく。
入出力Ｉ／Ｆ部１５は、入出力機器３を接続するためのインタフェースである。例えば、テスト対象となるソフトウェアプログラムのソースコード等を、通信部１１ではなく、入出力Ｉ／Ｆ部１５を介して、ＣＤ−ＲＯＭドライブ等の入出力機器３から取り込むこともできる。
【００１８】
制御部１６は、データの演算処理を行うと共に、バス１７を介して通信部１１、入力部１２、出力部１３、記憶部１４、入出力Ｉ／Ｆ部１５を制御するものであり、ＣＰＵ（Central Processing Unit）１６１、ＲＯＭ（Read Only Memory）１６２、ＲＡＭ（Random Access Memory）１６３等を備える。制御部１６における演算処理及び制御処理は、具体的には、ＣＰＵ１６１が、ＲＡＭ１６３を作業領域として使用して各種データを一時的に記憶させながら、ＲＯＭ１６２に記憶されている制御プログラムを実行することにより行われる。
【００１９】
例えば、制御部１６が、ＲＯＭ１６２や記憶部１４に記憶されている制御プログラムに従って上記各部を制御することにより、カバレッジ測定装置１において、テスト実行処理や、カバレッジ測定処理等が行われる。
【００２０】
図２は、本実施の形態に係るカバレッジ測定装置の機能構成例を示すブロック図である。
カバレッジ測定装置１は、図示するように、トレース用コード埋め込み部２１と、コンパイラ２２と、テスト実行部２３と、フローグラフ作成部２４と、カバレッジ算出部２５と、カバレッジ表示部２６と、テスト追加部２７と、を備える。なお、これらの各構成要素は、図１に示した制御部１６が、同じく図１に示した通信部１１、入力部１２、出力部１３、記憶部１４、又は入出力Ｉ／Ｆ部１５を制御することにより、実現することができる。
【００２１】
トレース用コード埋め込み部２１は、テスト対象となるソフトウェアのソースコードにカバレッジ計測用のトレース用コードを埋め込む。具体的には、トレース用コード埋め込み部２１は、ソースコードが入力されると、ソースコードの中から分岐が発生する部分を判別し、その部分にログ出力コードであるトレース用コードを埋め込む。
トレース用コードは、テストが実行された際に、ソースコード中のどの部分が実行されたかが分かる情報（例えば、ファイル名、行番号等）をログ情報として出力する。
【００２２】
コンパイラ２２は、トレース用コード埋め込み部２１によりトレース用コードが埋め込まれたソースコードを、コンパイルし、バイナリコードを生成する。
テスト実行部２３は、コンパイラ２２が生成したバイナリコードに対してテストを実行し、その結果を出力する。さらに、テスト実行部２３は、テスト実行の際にトレース用コードにより出力されるログ情報を取得して、ログファイルを出力する。
【００２３】
フローグラフ作成部２４は、テスト対象となるソフトウェアのソースコードに基づいて、ソフトウェアにおいて実行される可能性がある部分に絞ったコントロールフローグラフを作成する。ここで、コントロールフローグラフ（以下、フローグラフという）とは、プログラムの制御の流れを示すグラフである。フローグラフ作成部２４におけるフローグラフの作成動作の詳細については、図３を用いて後述する。
【００２４】
カバレッジ算出部２５は、テスト実行部２３が出力したログファイルに基づいてログを集計し、ソースコード中においてテストが実行された部分の情報を取得する。具体的には、例えば、カバレッジ算出部２５は、テストにおいて、ソースコード中のどの位置のコードが実行されたかを示す実行コードの位置情報を取得する。
【００２５】
さらに、カバレッジ算出部２５は、この取得した情報をもとに、フローグラフ作成部２４が作成したフローグラフにより示される実行可能範囲を基準として、次の数式（１）及び（２）により、ファイルカバレッジと関数カバレッジとを算出する。
（１）ファイルカバレッジ＝テスト実行時に実行されたファイルの行数／ファイルの総行数
（２）関数カバレッジ＝テスト実行時に実行された関数の行数／関数の総行数
【００２６】
カバレッジ表示部２６は、カバレッジ算出部２５が算出したカバレッジの値を表示する。ユーザは、ここに表示されたカバレッジの値を参照することによって、実行されたテストにより、テスト対象となるソフトウェアがどれくらい網羅されたのかを知ることができる。
【００２７】
テスト追加部２７は、カバレッジ算出部２５により算出されたファイルカバレッジ又は関数カバレッジが所定の基準値（例えば、１００％や、品質上満足できるものとして予め決められた値等）を満たしているか否かを判別し、満たしていない場合には、網羅的にテストされていない箇所がテストされるように、テストコードを追加した新たなテストケースを作成する。
【００２８】
テスト実行部２３は、テスト追加部２７により追加されたテストを実行し、新たなログファイルを出力する。カバレッジ算出部２５は、この新たなログファイルに基づきカバレッジを算出する。そして、テスト追加部２７は、再び、算出されたカバレッジが所定の基準値を満たしているか否かを判別し、基準値を満たしていない場合には、さらにテストコードを追加する。一方で、基準値を満たしている場合には、テストを終了する。
このようにして、カバレッジが所定の基準値を満たすまで、テストが繰り返される。
【００２９】
次に、テスト実行部２３、フローグラフ作成部２４、及びカバレッジ算出部２５が、ソフトウェアにおける実行可能範囲を基準に、カバレッジを算出する動作を具体的に説明する。
【００３０】
市販コンポーネントを利用してシステム開発を行う場合には、システムの実行に不必要なモジュールやコードを含んでいる場合が多く、これら不必要な部分についてはテストを行う必要はない。仮に、不必要な部分を含めたすべてのコードがカバレッジの測定対象に含まれた場合には、余分なコードが測定対象に含まれてしまい、カバレッジの測定精度が落ちる。
そこで、実行される可能性がある部分に絞ってカバレッジの測定を行うために、コンポーネントのマニュアル等により外部公開されているメソッドから、到達可能なコードを抽出する。
【００３１】
図３は、外部公開されているメソッドに基づいて実行箇所を絞り込む動作例を示す図である。
フローグラフ作成部２４は、コンポーネントにおいて公開メソッドから呼び出されるメソッドの関係を辿り、フローグラフを作成する。このとき、実行される可能性がある公開メソッドから辿れる部分のみのフローグラフを作成し、実行可能範囲とする。具体的には、例えば、メソッドＡとメソッドＢが公開されており、システムの実行にメソッドＡは利用したが、メソッドＢは利用しなかった場合には、公開メソッドＡを起点に順次呼び出されることにより到達可能なメソッドの呼び出し関係を記述したフローグラフを作成することにより、実行される範囲を絞り込む。
【００３２】
一方で、テスト実行部２３は、テストケースを実行し、コンポーネント中のテストケースにより実行された部分を抽出する。
そして、カバレッジ算出部２５が、フローグラフ作成部２４により作成されたフローグラフの実行可能範囲と、テストケースにより実行された部分と、をつき合わせて比較し、カバレッジを測定する。具体的には、例えば、公開メソッドＡのみを利用したソフトウェアをテストする場合には、カバレッジ算出部２５は、テストにより実行された部分の行数を、公開メソッドＡの実行範囲内の総行数で除算することにより、カバレッジの算出を行う。
【００３３】
このように、プログラムを解析することにより作成したフローグラフを利用して、外部メソッドから実行される範囲を特定することにより、公開メソッドから確実に実行される可能性がある部分のみをカバレッジの対象とし高精度にカバレッジを測定することができる。
【００３４】
しかしながら、オブジェクト指向型等のプログラムのように動的束縛を含んだコードがある場合には、上記動作により、メソッドの呼び出し関係を辿ることができない。
そこで、本実施の形態に係るカバレッジ測定装置は、上記動作に加えて、さらに、動的束縛により動的に実行クラスが変わる部分の絞り込みを行う。
【００３５】
ここで、まず、オブジェクト指向型のプログラムにおける動的束縛について説明する。
図４は、動的束縛を利用したプログラムのクラス構造例を示す図である。
図示する構造例のプログラムでは、メソッドの実装を持たないインタフェースInterfaceAの実装として、Impl1、Impl2、Impl3が提供されている。
【００３６】
具体的なプログラム例を記述すると、次のようになる。
1:String type = 実装クラスの指定
2:InterfaceA i = getInstance(type);
3:i.call();
4行目以降省略
【００３７】
このプログラム例では、１行目において、実装を取得する型を指定する。具体的には、Impl1、Impl2、Impl3を取る。
２行目において、指定された実装のインスタンスを取得する。
３行目において、取得した実装のcallメソッドを実行する。
この３行目においては、InterfaceAを実装したクラスのcallメソッドを呼び出すと指定してあるだけで、どの実装が選択されるかは、iに代入されたオブジェクトの状況により、実行時に決定される。
【００３８】
このプログラムを例に、フローグラフの生成動作を説明する。
動的束縛が利用されている場合のフローグラフの生成方法としては、Enhanced Control Flow Graph（ＥＣＦＧ）がある。ここでは、ＥＣＦＧについての詳細な説明は省略するが、ＥＣＦＧの詳細については、Taweesup Apiwattanapong, Alessandro Orso, and Mary Jean Harrold, "A Differencing Algorithm for Object-Oriented Programs" (http://www.cc.gatech.edu/~orso/papers/term.orso.harrold.ASE04.pdf)を参照してほしい。
【００３９】
図５は、図４に示した構造を持つプログラムに基づく動的なクラス実行がある場合のフローグラフの例を示す図である。
図において、点線で示した部分が、ＥＣＦＧを用いて生成した動的束縛が利用される部分であり、実行時に動的にクラスが決定される部分である。
ＥＣＦＧでは、動的束縛が存在する部分に対し、実行する可能性がある実装（実装候補）を並列に並べることによりフローグラフを作成する。このフローグラフにより、図５の３行目において、Impl1.call()、Impl2.call()、Impl3.call()のいずれか一つの実装が実行されることを認識することができる。
【００４０】
しかしながら、このように動的束縛を考慮したフローグラフを作成しても、実行される候補となる実装を網羅的に洗い出したフローグラフが提供されるだけで、実行時にどの実装が選択されるか知ることはできず、実行される範囲を絞り込むことはできない。
つまり、コード中に動的束縛を含んだコードがある場合には、フローグラフの生成を行っただけでは、実行されるメソッドを特定することができない。
【００４１】
そこで、次に、動的束縛を含むプログラムにおける実行箇所の絞り込み動作を説明する。
実システムの動作環境において、設定ファイル等の環境設定により実装が指定されている場合には、環境設定で指定されなかった実装は実行されない。
図６は、環境設定による実装指定例を示す図である。
図示するように、プログラム中において、設定ファイルにより例えばImpl3を利用するように設定されている場合には、Impl3だけが実行されるクラスとなり、Impl1及びImpl2は実行されないことになる。
【００４２】
つまり、プログラムを解析してフローグラフを作成することに加え、環境設定の解析をも行うことにより、プログラム中に動的束縛による複数の実装候補がある場合であっても、実行されるクラスを特定することができる。
そして、実行されないクラスをカバレッジの測定範囲から除外することにより、カバレッジを精度良く求めることができる。
【００４３】
そこで、次に、環境設定の解析による動的実行部分の絞り込み動作を図７を参照して説明する。
図７は、図２におけるカバレッジ算出部２５の具体的構成例を示す図である。
図示するように、カバレッジ算出部２５は、動的実行情報抽出部３１と、動的実行部絞込部３２と、動的束縛絞込カバレッジ算出部３３と、を備える。
【００４４】
フローグラフ作成部２４は、プログラムの解析により、外部公開メソッドから実行される可能性がある部分を抽出したフローグラフを生成する。ただし、動的束縛が存在する箇所には、上述したＥＣＦＧを用いてフローグラフを生成する。フローグラフの生成時点では、動的束縛により実行時に動的に実行されるクラスは特定されない。
カバレッジ算出部２５は、環境設定の解析によりプログラムにおける動的実行部分を絞り込むに際して、フローグラフ作成部２４により作成されたフローグラフを入力し、記憶する。
【００４５】
ここで、動的実行情報抽出部３１に入力される環境設定と動的実行情報定義ファイルについて説明する。
環境設定には、動的実行情報が記述される。そして、環境設定は、設定ファイル、もしくはプログラムの引数等により与えられる。環境設定により与えられる動的実行情報には、例えば、ドライバクラスの定義や、コンポーネントを呼び出すコンテナへのコンポーネントの登録情報がある。具体的には、例えば、図６に示した環境設定例であれば、InterfaceAの実装にImpl3を利用する設定が記述されている。
【００４６】
動的実行情報定義ファイルは、環境設定の中における動的に実装を切り換えるための設定を行っている部分（動的束縛設定部分）を定義する。例えば、ＸＭＬ（eXtensible Markup Language）で記述された設定ファイルを環境設定に利用している場合には、設定ファイル中のＸＭＬの構造上の位置を指定することにより定義を行う。具体的には、例えば、図６に示した環境設定例であれば、動的実行情報定義ファイルは、InterfaceAの実装が設定ファイルにどのように記述されるかを記述している。
【００４７】
動的実行情報抽出部３１は、動的実行情報定義ファイルをもとに設定ファイルを解析し、動的な実行の定義を抽出し、実行される実装の指定情報である動的実行情報として出力する。具体的には、例えば、動的実行情報抽出部３１は、ＸＭＬ上の特定のタグに記述されたドライバクラスの設定情報や、コンポーネントの登録情報を抽出する。
【００４８】
動的実行部絞込部３２は、フローグラフ作成部２４が生成したフローグラフ上で動的束縛により実行される実装が特定されていない箇所に対し、動的実行情報抽出部３１が抽出した動的実行情報をもとに、実装を特定する。換言すれば、動的実行部絞込部３２は、動的実行情報に基づいて、動的束縛による実装候補の中から、実行される実装を特定して、フローグラフ上の実装候補の中から、特定した実装以外の実装候補を除くことにより、動的束縛箇所における絞り込みを行う。
【００４９】
動的束縛絞込カバレッジ算出部３３は、テスト実行部２３から出力されるログファイルに基づき、テストにより実行された箇所を抽出する。そして、この実行された箇所と、動的実行部絞込部３２により動的実行部の絞り込みが行われたフローグラフにより示される実行される部分とを比較し、カバレッジの計算、出力を行う。換言すれば、動的束縛絞込カバレッジ算出部３３は、動的実行部絞込部３２が特定した実装以外の実装候補を除いたフローグラフに示されている範囲を基準として、テストにより実行された箇所に基づき、カバレッジの計算を行う。
具体的には、例えば、動的束縛絞込カバレッジ算出部３３は、テストにより実行された箇所の行数を、動的実行部が絞り込まれた後のフローグラフが示す範囲内の総行数で除算することにより、カバレッジの算出を行う。
【００５０】
本実施の形態では、上記動作により、動的束縛により動的に実行クラスが変わる部分の絞り込みを行うことができる。これにより、システムの実行に不要な部分をカバレッジの測定対象から排除することができ、カバレッジの精度を向上させることができる。
【００５１】
次に、環境設定の解析による動的実行部分の絞り込み動作における具体的な実装例をＤＩコンテナと呼ばれるコンテナへの適用を例に説明する。
ここで、ＤＩ（Dependency Injection）コンテナとは、コンポーネント間の依存性を内部から排除し、コンテナ管理で依存関係を構成するためのコンテナである。
【００５２】
図８は、ＤＩコンテナにおける環境設定を定義した設定ファイル例を示す図である。
ＤＩコンテナでは、図示するように、例えばＸＭＬで設定ファイルに動的実行情報を記述する。
図示する環境設定例において、１〜４行目は、DIAppというアプリケーションクラスのmanagerプロパティにmanagerComponentを設定することを示している。managerComponentは７行目で、DBUserManagerのインスタンスを指定している。これにより、DIAppのmanagerプロパティに対し、DBUserManagerのインスタンスが設定される。
【００５３】
図９は、図８に示したＤＩコンテナの環境設定に対する動的実行情報定義ファイル例を示す図である。
図示する構文では、/xxxが設定ファイルのＸＭＬの要素にマッチし、[@yyy=zzz]により、ＸＭＬの属性yyyがzzzで定義された要素にマッチすることを示す。また、[@yyy]のように属性のみで終了している場合は、その属性を取り出すことを示す。例えば、アプリケーション名がDIAppであるとすると、動的束縛プロパティ名は、/bean[@class=DIApp]/property[@name]となる。これは、class属性にDIAppを持つbean要素の下のproperty要素の@name属性を取り出すという意味となり、図８に示したＸＭＬの設定ファイルから、動的束縛プロパティ名として、managerが取得される。同様にして、実装の名前にはmanagerComponentが、実装にはDBUserManagereが取得される。
【００５４】
このような一連の流れにより、図７の動的実行情報抽出部３１は、動的実行情報定義ファイルをもとに設定ファイルを解析し、動的束縛プロパティmanagerには、DBUserManagerが設定されていることを検出する。
【００５５】
次に、ＤＩコンテナを利用した具体的なアプリケーションを例に、フローグラフ作成部２４で作成されたフローグラフから、動的実行部分を絞り込む動作を説明する。
図１０は、ＤＩコンテナを利用したアプリケーション例を示す図であり、図１１は、フローグラフにおける動的実行部分を絞り込む動作を説明するための図である。
【００５６】
ここで、IUserManagerをユーザを管理するユーザマネージャのインタフェースとし、IUserManagerの実装として、DBUserManagerとFileUserManagerの２つのクラスがあった場合、図１０に示すアプリケーションプログラムの９行目のmanager.auth()の動的束縛による実行候補は、DBUserManager.auth()とFileUserManager.auth()の２つである。そして、その場合に、doActionメソッドに対してフローグラフ作成部２４が作成するフローグラフは、図１１（ａ）のようになる。
【００５７】
動的実行情報抽出部３１は、上述したように、動的束縛プロパティ名managerにDBUserManagerが設定されている旨の情報を抽出しているため、動的実行部絞込部３２は、図１１（ａ）に示すフローグラフからDBUserManager.auth()を残し、FileUserManager.auth()を削除する。その結果、動的実行部が絞り込まれ、図１１（ｂ）のようになる。図１１（ｂ）中、点線部は、グラフから削除された部分である。
動的束縛絞込カバレッジ算出部３３は、このようにして動的実行部を絞り込んだフローグラフにより示される実行部分を基準として、カバレッジの計算を行う。
【００５８】
次に、本実施の形態に係るカバレッジ測定装置の処理動作をフローチャートを用いて説明する。なお、カバレッジ測定装置１の動作は、制御部１６が、ＲＯＭ１６２や記憶部１４に記憶されている制御プログラムに従って、通信部１１、入力部１２、出力部１３、記憶部１４、又は入出力Ｉ／Ｆ部１５を制御することにより実行される。なお、以下の動作説明において、制御部１６による通信制御、入出力制御、メモリ制御等の通常のコンピュータによる動作と同一の動作については、理解を容易にするため、逐一言及することを避ける。
【００５９】
図１２は、本実施の形態に係るカバレッジ測定装置におけるカバレッジ測定処理の例を示すフローチャートである。
例えば、カバレッジ測定装置１の操作者により、カバレッジの測定を開始する旨の情報が入力部１２に入力されると、制御部１６は、例えば記憶部１４に記憶されている情報の中から、テスト対象となるソフトウェアのソースコードと、そのソフトウェアに関する環境設定情報と、環境設定情報中における動的実行情報の存在部分を定義する動的実行情報定義ファイルと、を取得する（ステップＳ１１）。
【００６０】
そして、制御部１６は、取得したソースコードにトレース用コードを埋め込み、コンパイル後のバイナリコードに対してテストを実行し、トレース用コードによるログファイルを取得する（ステップＳ１２）。
次に、制御部１６は、ステップＳ１１で取得した動的実行情報定義ファイルに基づいて、同じくステップＳ１１で取得した環境設定情報から、ソフトウェアにおける動的実行情報を抽出する（ステップＳ１３）。
【００６１】
続いて、制御部１６は、ステップＳ１１で取得したソースコードに基づいて、ソフトウェアにおいて実行される可能性がある範囲を示すフローグラフを作成し、フローグラフの情報を例えば記憶部１４に記憶する（ステップＳ１４）。なお、ソフトウェアの動的束縛部分については、実行される可能性がある実装候補をすべて記載して、フローグラフを作成する。
【００６２】
次に、制御部１６は、抽出された動的実行情報に基づいて、作成されたフローグラフにおける動的束縛部分の実装候補の中から、実行される実装を特定し、特定した実装以外の実装候補を削除することにより、動的束縛部分を絞り込んだ動的束縛絞込フローグラフを作成し、その情報を例えば記憶部１４に記憶する（ステップＳ１５）。
【００６３】
次に、制御部１６は、ステップＳ１２で取得したログファイルからテストにおいて実行された命令コードを特定し、この実行された命令コードと、動的束縛絞込フローグラフに記載されている範囲のすべての命令コードと、を比較することによりカバレッジを算出し（ステップＳ１６）、このカバレッジ測定処理を終了する。
ステップＳ１６でのカバレッジの算出に際し、制御部１６は、具体的には、例えば、テスト結果のログファイルから特定される命令コードの総行数を、動的束縛絞込フローグラフに記載されている範囲のすべての命令コードの総行数で除算することにより、カバレッジを求める。
【００６４】
なお、上述したカバレッジ測定処理は一例であり、これに限定されるものではない。例えば、ステップＳ１１で取得した各情報は、情報を必要とする処理の直前に取得するようにすることもできる。
また、ステップＳ１２のログファイルの取得は、カバレッジを算出するステップＳ１６の前であればよく、例えば、ステップＳ１６の直前に行うようにすることもできる。
また、ステップＳ１４のフローグラフの作成を、ステップＳ１３の動的実行情報の抽出より前に行うようにすることもできる。
【００６５】
以上説明したように、本実施の形態によれば、フローグラフ作成部２４がフローグラフを作成して、実際に実行するコード部分のみにカバレッジ測定を絞る。さらに、動的実行情報抽出部３１が環境設定の解析を行い、この解析結果に基づき動的実行部絞込部３２が、動的束縛を含んだコードについても絞り込みを行う。そして、絞り込まれた範囲を基準として、動的束縛絞込カバレッジ算出部３３がカバレッジを算出する。これにより、カバレッジの測定精度を高めることができる。
【００６６】
従って、オブジェクト指向により実装されたコンポーネントに動的束縛を利用したコードが含まれる場合であっても、カバレッジ測定精度を向上させることができる。
また、コンポーネントテストの品質の正確な定量化により、テスト漏れを精度良く調べることができ、テスト漏れによる品質の低下を軽減することができる。
【００６７】
以上、本発明の実施の形態を説明したが、本発明を実施するにあたっては、種々の形態による変形及び応用が可能であり、上記実施の形態に限られるものではない。
例えば、カバレッジ算出部２５が算出するカバレッジは、ファイルカバレッジや関数カバレッジに限定されるものではなく、ブランチカバレッジ等の他のカバレッジを算出することもできる。
【００６８】
なお、本発明のソフトウェアカバレッジ測定装置は、専用のハードウェアに限られるものではなく、通常のコンピュータシステムによっても実現することができる。
具体的には、上記実施の形態では、カバレッジ測定装置のプログラムが、メモリ等に予め記憶されているものとして説明した。しかし、上述の処理動作を実行させるためのプログラムを、フレキシブルディスク、ＣＤ−ＲＯＭ（Compact Disk Read-Only Memory）、ＤＶＤ（Digital Versatile Disk）、ＭＯ（Magneto-Optical disk）等のコンピュータ読み取り可能な記録媒体に格納して配布し、そのプログラムをコンピュータにインストールすることにより、上述の処理を実行をするソフトウェアカバレッジ測定装置を構成してもよい。
【００６９】
また、プログラムをインターネット等の通信ネットワーク上のサーバ装置が有するディスク装置等に格納しておき、例えば、搬送波に重畳させて、コンピュータにダウンロード等するようにしてもよい。さらに、通信ネットワークを介してプログラムを転送しながら起動実行することによっても、上述の処理を達成することができる。
また、上述の機能を、ＯＳ（Operating System）が分担又はＯＳとアプリケーションの協働により実現する場合等には、ＯＳ以外の部分のみを媒体に格納して配布してもよく、また、コンピュータにダウンロード等してもよい。
【図面の簡単な説明】
【００７０】
【図１】本発明の実施の形態に係るソフトウェアカバレッジ測定装置の構成例を示すブロック図である。
【図２】本実施の形態に係るソフトウェアカバレッジ測定装置の機能構成例を示すブロック図である。
【図３】外部公開されているメソッドに基づいて実行箇所を絞り込む動作例を示す図である。
【図４】動的束縛を利用したプログラムのクラス構造例を示す図である。
【図５】動的なクラス実行がある場合のフローグラフの例を示す図である。
【図６】環境設定による実装指定例を示す図である。
【図７】図２におけるカバレッジ算出部の具体的構成例を示す図である。
【図８】ＤＩコンテナにおける環境設定を定義した設定ファイル例を示す図である。
【図９】ＤＩコンテナの環境設定に対する動的実行情報定義ファイル例を示す図である。
【図１０】ＤＩコンテナを利用したアプリケーション例を示す図である。
【図１１】フローグラフにおける動的実行部分を絞り込む動作を説明するための図である。
【図１２】本実施の形態に係るソフトウェアカバレッジ測定装置におけるカバレッジ測定処理の例を示すフローチャートである。
【符号の説明】
【００７１】
１  ソフトウェアカバレッジ測定装置
２  通信ネットワーク
３  入出力機器
１１  通信部
１２  入力部
１３  出力部
１４  記憶部
１５  入出力Ｉ／Ｆ部
１６  制御部
１７  バス
２１  トレース用コード埋め込み部
２２  コンパイラ
２３  テスト実行部
２４  フローグラフ作成部
２５  カバレッジ算出部
２６  カバレッジ表示部
２７  テスト追加部
３１  動的実行情報抽出部
３２  動的実行部絞込部
３３  動的束縛絞込カバレッジ算出部
１６１  ＣＰＵ
１６２  ＲＯＭ
１６３  ＲＡＭ
【図１】
2006293740.tif 000003
【図２】
2006293740.tif 000004
【図３】
2006293740.tif 000005
【図４】
2006293740.tif 000006
【図５】
2006293740.tif 000007
【図６】
2006293740.tif 000008
【図７】
2006293740.tif 000009
【図８】
2006293740.tif 000010
【図９】
2006293740.tif 000011
【図１０】
2006293740.tif 000012
【図１１】
2006293740.tif 000013
【図１２】
2006293740.tif 000014