(57)【特許請求の範囲】
【請求項１】
計算機ソフトウェアの一部分をテストするソフトウェア部分テストシステムであって、
少なくともテスト対象となっているモジュールと、該モジュールから呼び出されるサブモジュールである依存モジュールと、該依存モジュールが行う手続きの振る舞いの一部のみを代行するスタブとを、それぞれの記述内容に従って実行するモジュール実行手段を備え、
前記モジュール実行手段は、
テスト対象モジュールから前記依存モジュールへの呼び出しを前記依存モジュールに代わって受け取り、前記呼び出しを受け取ると、当該呼び出しの処理を実行するモジュールを依存モジュールとするかまたはスタブとするかを当該呼び出し時点でのプログラム中のデータの内容に関して記述された条件式に従って決定して、決定されたモジュールに当該呼び出しの処理を実行させる処理委譲手段を含む
ことを特徴とするソフトウェア部分テストシステム。
【請求項２】
処理委譲手段は、呼び出しのパラメータ値に関して記述された条件式の真偽値に基づいて、当該呼び出しの処理を実行するモジュールを決定する
請求項１に記載のソフトウェア部分テストシステム。
【請求項３】
処理委譲手段は、呼び出し時点での変数値に関して記述された条件式の真偽値に基づいて、当該呼び出しの処理を実行するモジュールを決定する
請求項１に記載のソフトウェア部分テストシステム。
【請求項４】
処理委譲手段は、呼び出しのパラメータ値および呼び出し時点での変数値に関して記述された条件式の真偽値に基づいて、当該呼び出しの処理を実行するモジュールを決定する
請求項１に記載のソフトウェア部分テストシステム。
【請求項５】
処理委譲手段は、アスペクト指向言語を用いて、依存モジュールが行う手続きを呼び出すコードをポイントカットとするアスペクトコンポーネント内で、条件式により処理の委譲先を制御するよう記述されたプログラムに従って動作する情報処理装置によって実現される
請求項１から請求項４のうちのいずれか１項に記載のソフトウェア部分テストシステム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、計算機ソフトウェアの一部分をテストするソフトウェア部分テストシステムに関する。
【背景技術】
【０００２】
モジュール化されたソフトウェアの部分的テストに関する技術として、スタブを用いてテスト対象範囲外の部分をシミュレートすることでテストを実施する方法が非特許文献１に記載されている。スタブとは、テスト対象範囲に含まれるモジュールから呼び出されるサブモジュールの動作をシミュレートするダミーのモジュールであって、本来のモジュールの振る舞いのうち、テストの実行で必要となる入力値に限って期待通りの出力を返すように作られるものである。例えば、モジュールＸを別の作成途上のモジュールＹを呼び出しているソフトウェアにおいて、部分的にモジュールＸだけをテストしたい場合に、モジュールＹが動作不能の場合でも、モジュールＹをスタブに置き換えることでテストが実施可能となる。また、例えば、モジュールＹの振る舞いを変更した場合のモジュールＸの動作をテストしたい場合に、モジュールＹをスタブに置き換えることによって目的を達成できる。
【０００３】
また、例えば、特許文献１には、スタブを呼び出しを受け付ける仮スタブと、それぞれが所定の単一動作を行う実スタブとして実現するソフトウェアテスト方法が記載されている。特許文献１に記載されているソフトウェアテスト方法では、仮スタブと実スタブとの対応関係を仮スタブ呼び出し時の引数値および内部条件を使って定義し、テスト実施時に実スタブ決定処理が、仮スタブ呼び出し時の引数値および内部条件に基づいて実行する実スタブを決定して実行する。
【０００４】
【特許文献１】特開２０００−１３２４２５号公報
【非特許文献１】Boris Beizer著，小野間彰訳，「ソフトウェアテスト技法」，第１版，日経ＢＰ出版センター，１９９４年２月，ｐ．３７５
【発明の開示】
【発明が解決しようとする課題】
【０００５】
問題点は、テストに使用するモジュールの振るまいを、入力値全体ではなく部分的に変更したり補ったりしたい場合に、変更や補完の必要がない入力値についてもスタブに実装しなおす必要が生じることである。
【０００６】
なお、特許文献１に記載されているテスト方法では、テスト条件に応じてスタブの動作を切り替えることはできるが、テストに使用するモジュールの振る舞いをスタブによって部分的に変更したり、補ったりしようということは何ら考慮されていない。すなわち、スタブがモジュール全体の動作を置き換えるものである点については、一般的なスタブと同様である。
【０００７】
そこで、本発明は、ソフトウェアの一部分をテストする際に、テストに使用するモジュールの振る舞いをスタブによって部分的に変更したり、補ったりすることができるソフトウェア部分テストシステムを提供することを目的とする。
【課題を解決するための手段】
【０００８】
本発明によるソフトウェア部分テストシステムは、計算機ソフトウェアの一部分をテストするソフトウェア部分テストシステムであって、少なくともテスト対象となっているモジュールと、該モジュールから呼び出されるサブモジュールである依存モジュールと、該依存モジュールが行う手続きの振る舞いの一部のみを代行するスタブとを、それぞれの記述内容に従って実行するモジュール実行手段を備え、モジュール実行手段は、テスト対象モジュールから依存モジュールへの呼び出しを依存モジュールに代わって受け取り、呼び出しを受け取ると、当該呼び出しの処理を実行するモジュールを依存モジュールとするかまたはスタブとするかを当該呼び出し時点でのプログラム中のデータの内容に関して記述された条件式に従って決定して、決定されたモジュールに当該呼び出しの処理を実行させる処理委譲手段を含むことを特徴とする。
【発明の効果】
【００１１】
本発明によれば、ソフトウェアの一部分をテストする際に、テストに使用するモジュールの振る舞いをスタブによって部分的に変更したり、補ったりすることができる。
【発明を実施するための最良の形態】
【００１２】
以下、本発明の実施形態を図面を参照して説明する。図１は、本発明によるソフトウェア部分テストシステムの構成例を示すブロック図である。図１に示すソフトウェア部分テストシステムは、少なくともテスト対象となっているモジュールと、該モジュールから呼び出されるサブモジュールである依存モジュールと、該依存モジュールが行う手続きの振る舞いを代行するスタブとを、それぞれの記述内容に従って実行するモジュール実行手段１０を備える。そして、モジュール実行手段１０は、テスト対象モジュールから依存モジュールへの呼び出しを検出し、当該呼び出しの処理を実行するモジュールとして依存モジュールかスタブかを所定の条件に従って決定し、決定に応じて当該呼び出しの処理を実行させる処理委譲手段１１を含む。
【００１３】
処理委譲手段１１は、例えば、呼び出し時点でのプログラム中のデータの内容（例えば、呼び出しのパラメータ値や他の変数値）に関して記述された条件式の真偽値に基づいて、当該呼び出しの処理を実行するモジュールを決定してもよい。
【００１４】
モジュール実行手段１０は、具体的には、ＣＰＵ等のプログラムに従って動作する情報処理装置によって実現される。なお、処理委譲手段１１は、例えば、テストアプリケーションの一モジュールとして実装されていてもよい。また、例えば、デバッガやテストツールの一機能として組み込まれていてもよい。
【００１５】
以下、より具体的な構成について説明する。図２は、ソフトウェア部分テストシステムのより具体的な構成例を示すブロック図である。図２に示すように、本実施形態におけるソフトウェア部分テストシステムは、制御部１００を備える。制御部１００は、テストドライバ実行部１０１と、テスト対象モジュール実行部１０２と、委譲先制御部１０３と、依存モジュール実行部１０４と、スタブ実行部１０５とを含む。
【００１６】
テストドライバ実行部１０１は、テスト対象モジュール群をテストするためにテストケースに応じてテスト対象モジュールに対して手続き呼び出しを行うテストドライバを実行する。なお、テストドライバ実行部１０１は、図１に示すモジュール実行手段１０のうちのテストドライバを実行する部分に相当する処理部である。
【００１７】
テスト対象モジュール実行部１０２は、テストドライバ実行部１０１からの手続き呼び出しに応じて、テスト対象モジュール群を実行する。なお、テスト対象モジュール実行部１０２は、図１に示すモジュール実行手段１０のうちのテスト対象モジュールを実行する部分に相当する処理部である。
【００１８】
委譲先制御部１０３は、テスト対象モジュールから呼び出されるサブモジュールである依存モジュールへの呼び出しを一旦横取りして受け付け、条件式２０１に従ってその処理の実行を依存モジュールに委譲するかスタブに委譲するかを決定し、決定に応じて当該呼び出しの処理の実行を委譲する（制御を引き渡す）。なお、委譲先制御部１０３は、図１に示す処理委譲手段１１に相当する処理部である。本実施形態において、委譲先制御部１０３は、移譲先を決定するための条件式２０１として、呼び出し時点でのプログラム中のデータの内容（例えば、呼び出しのパラメータ値や他の変数値）に関して記述された論理式を保持している。
【００１９】
依存モジュール実行部１０４は、テスト対象モジュールとの間で手続きに対する呼び出し関係を有している依存モジュールを実行する。例えば、テスト対象モジュールＡ内にテスト対象モジュールではないモジュールＢを呼び出すステートメントが存在するとき、テスト対象モジュールＡは依存モジュールＢに対する呼び出し関係を有している。なお、本実施形態では、テスト対象モジュールＡから依存モジュールＢへの呼び出しにおいて、依存モジュール実行部１０４に直接制御が引き渡されずに、委譲先制御部１０３に一旦引き渡される。なお、依存モジュール実行部１０４は、図１に示すモジュール実行手段１０のうちの依存モジュールを実行する部分に相当する処理部である。
【００２０】
呼び出し時における制御の引き渡しは、例えば、アスペクト指向言語を用いて、依存モジュールが行う手続きを呼び出すコードを、横断的関心事として一つのコンポーネントにまとめ、そのコンポーネント内で条件式により処理の委譲先を制御するよう記述されたプログラムに従って動作することによって実現することができる。また、例えば、予め依存モジュールが行う手続きの型を定義しておき、その型と一致する手続きを呼び出すコードをブレークポイントとして、そのブレークポイントにおいて実行コードを書き換えるようなデバッグコマンドを実装することによって実現することも可能である。
【００２１】
スタブ実行部１０５は、テスト対象モジュールから呼び出されるサブモジュールである依存モジュールの手続きを代替するスタブを実行する。なお、依存モジュール実行部１０４は、図１に示すモジュール実行手段１０のうちのスタブを実行する部分に相当する処理部である。
【００２２】
なお、上記例では、テストドライバ実行部１０１，テスト対象モジュール実行部１０２，委譲先制御部１０３，依存モジュール実行部１０４，スタブ実行部１０５を別々の処理部として示しているが、必ずしも独立して動作する処理部として実装されることを要しない。例えば、各処理部をテストアプリケーションの一モジュールとして実装することも可能である。そのような場合には、各処理部は、それぞれの処理部の動作を行うモジュールをリンカ等で結合されたアプリケーションプログラムを実行する１つのＣＰＵによって実現される。また、例えば、各処理部をデバッガやテストツールの一機能として組み込むことも可能である。そのような場合には、各処理部は、テスト対象モジュールのソースコードやオブジェクトファイルを読み込んで、その実行コードに準じて、各処理部の動作を行うよう記述されたデバッグプログラムに従って動作するＣＰＵによって実現される。
【００２３】
なお、図３では、本発明との比較において、依存モジュールが行う手続きの全てをスタブで代替するソフトウェア部分テストシステムの構成例を示している。図２に示す実施形態との違いは、委譲先制御部１０３を備えていない点である。図３に示す例では、依存モジュールが行う手続きの全ては、スタブによって代行されている。一方、本発明では、依存モジュールをスタブで完全に置き換えるのではなく、委譲先制御部１０３で呼び出しの受け取りを代行し、その上で依存モジュールとスタブとのどちらかに処理を委譲するようにしている。
【００２４】
次に、本実施形態の動作について説明する。図４は、本実施形態におけるソフトウェア部分テストシステムの動作の一例を示すフローチャートである。図４に示す例では、テストドライバ実行部１０１がテストドライバを実行することによって、テスト対象モジュール実行部１０２がテストドライバからの手続き呼び出しに応じて、テスト対象モジュール群を実行することにより、テスト対象モジュールに含まれる命令が順次発行される（ステップＡ１１０）。このとき、発行された命令が依存モジュールへの呼び出しでない場合には（ステップＡ１１１のＮｏ）、テスト対象モジュール実行部１０２が、命令が発行されたコンテキスト（すなわち、テスト対象モジュールの記述）の内容に従い、処理を実行する（ステップＡ１１２）。そして、テスト対象モジュール内での命令に対する処理を実行しおえると、呼び出し元のテストドライバ実行部１０１に制御を返せばよい。
【００２５】
一方、発行された命令が依存モジュールへの呼び出しである場合には（ステップＡ１１１のＹｅｓ）、委譲先制御部１０３が、当該命令による呼び出しの指示を依存モジュール実行部１０４に代わって受け取る（ステップＡ１１３）。
【００２６】
委譲先制御部１０３は、受け取った呼び出し命令に係る手続き（呼び出された委譲モジュールの手続き）に対応づけられている条件式２０１を評価する（ステップＡ１１４）。条件式２０１は、例えば、呼び出しのパラメータ値に関して記述された条件式である。また、例えば、呼び出し時点での変数値に関して記述された条件式であってもよい。また、例えば、呼び出しのパラメータ値および呼び出し時点での変数値に関して記述された条件式であってもよい。委譲先制御部１０３は、例えば、受け取った命令が発行されたコンテキストにおいてプログラムコードとして記述されている条件式２０１を実行することによって評価してもよい。また、例えば、プログラムコードとは独立して保持している条件式２０１に、現時点でのプログラム中のデータ内容を代入することによって評価してもよい。
【００２７】
ここで、委譲先制御部１０３は、条件式２０１の評価結果が真であれば、依存モジュールにより当該呼び出し命令に係る手続きの処理を実行させるため、依存モジュール実行部１０４に処理の実行を委譲する（ステップＡ１１５，Ａ１１６）。
【００２８】
一方、条件式２０１の評価結果が偽であれば、スタブにより当該呼び出し命令に係る手続きの処理を実行させるため、スタブ実行部１０５に処理の実行を委譲する（ステップＡ１１５，Ａ１１７）。
【００２９】
なお、図４のフローチャートに示す処理は、テスト対象モジュール群に含まれる命令が実行されるたびに繰り返される。
【００３０】
次に、具体例を用いて本実施形態の動作を説明する。図５は、ソフトウェア部分テストシステムにおいて実施対象となるプログラムモジュールの例を示す説明図である。図５に示すＪａｖａ（登録商標）プログラムでは、テスト対象モジュールＸは、依存モジュールＹと依存モジュールＺに対して呼び出し関係を有している。テスト対象モジュールＸが持つ唯一のメソッドｆｕｎｃ１は、依存モジュールＹが持つメソッドｆｕｎｃ２と、依存モジュールＺが持つメソッドｆｕｎｃ３１，ｆｕｎｃ３２およびｆｕｎｃ３３とを利用して実現されている。
【００３１】
今、ｆｕｎｃ２は未完成であり、引数ｎが正の場合に限って正しい動作が保証されているが、それ以外では例外を発生する状況にある。このような状況において、例外の発生を抑えてテストを完遂させるために、本実施例では、依存モジュールＹの振る舞いを部分的に変更させる。
【００３２】
図６は、本実施形態におけるソフトウェア部分テストシステムの一実施例を示す説明図である。図６に示す例では、処理委譲用のコンポーネントとして、アスペクトＹ＿ｄｅｌｅｇａｔｏｒがアスペクト指向言語によって定義されている。アスペクト指向言語では、関係するコンポーネントやオブジェクトにまたがるように、ばらばらに割り当てられてた機能（アスペクト指向言語では”関心事”と呼ばれる。モデル上のエンティティや分散処理などの実装上の留意点となるような観点を含む。）を、横断的関心事（crosscutting concern）と呼び、これを独立したコンポーネントとしてまとめる機能を実装することを目標とした言語である。図６に示す例は、Ｊａｖａ言語にアスペクト指向技術のための拡張を施したプログラミング言語であるＡｓｐｅｃｔＪを用いてプログラムを作成することにより、委譲先制御部１０３を実現させた例である。
【００３３】
ＡｓｐｅｃｔＪでは、横断関心事を単一コンポーネントにまとめられるようにするため、ｃｌａｓｓやｉｎｔｅｒｆａｃｅといったコンポーネントの他にも、ａｓｐｅｃｔというコンポーネントを宣言できる。ａｓｐｅｃｔコンポーネントでは、いくつかのアドバイスを記述することができる。ここでいうアドバイスとは、ｃｌａｓｓでいうメソッドに相当する。例えば、メソッドが継承機構によって子クラスの定義に自動的に挿入されるように、アドバイスの本体は、メソッド本体の中のポイントカットで指定された場所に自動的に挿入される。従って、ポイントカットで指定された場所にプログラムの実行が到着すると、アドバイスの本体をメソッドのように実行させることができる。
【００３４】
図６に示すアスペクトＹ＿ｄｅｌｅｇａｔｏｒは、依存モジュールＹが持つメソッドｆｕｎｃ２を呼び出すコードをポイントカットとするアスペクトコンポーネントであって、アドバイスとして、条件式によって依存モジュールＹが持つメソッドｆｕｎｃ２をそのまま呼び出すか、スタブとして代替されているメソッドＹ＿ｓｔｕｂ＿ｆｕｎｃ２を呼び出すかを切り替えるコードが記述されている。
【００３５】
図６において、”pointcut atFunc2(int n):call (int Y.func2(int n) && (args(i)) ”で、依存モジュールＹのメソッドｆｕｎｃ２への呼び出しを引数情報とともに横取りするためのポイントカットが定義されている。また、”int around (int n):atFunc2”とは、横取りした呼び出しに対する処理内容をその後につづくブロック内に定義することを表している。また、”proceed(n)”は、もともとの呼び出し先の手続きを実行することを表している。
【００３６】
本例において、”ｆｕｎｃ１（５，１０）＞０”および”ｆｕｎｃ１（−５，１０）＜０”となることを確認するテストを実行すると、メソッドｆｕｎｃ１の第１引数ｐ＝５のとき、メソッドｆｕｎｃ２に対しては引数ｎ＝５が渡されるので、条件式”(n>0)?”に従い、本来の依存モジュールＹのメソッドｆｕｎｃ２のロジックが実行される。メソッドｆｕｎｃ１の第１引数ｐ＝−５のとき、メソッドｆｕｎｃ２に対しては引数ｎ＝−５が渡されるので、同様の条件式に従い、依存モジュールＹのスタブとして実装されているメソッドＹ＿ｓｔｕｂ＿ｆｕｎｃ２のロジックが実行される。
【００３７】
ここで、例えば、テストパターンとして、メソッドｆｕｎｃ１の第１引数ｐ＝７，１０をテストする必要が生じたとしても、それに応じてスタブを変更する必要はなく、条件式”(n>0)?”で動作保証されているｆｕｎｃ２のロジックがそのまま利用できる。
【００３８】
以上のように、本実施形態によれば、依存モジュールの全てをスタブで代替する必要がなく、部分的な振る舞いだけをスタブに代行させることができる。例えば、依存モジュールの振る舞いを一部の入力値域についてのみ変更したい場合に、その変更したい入力値域に関する振る舞いだけをスタブに定義すればよい。本実施形態では、委譲先制御部１０３を備えているため、依存モジュールへの呼び出しをそのまま依存モジュールで処理するか、またはスタブで処理するかを条件式で切り替えることができるからである。
【００３９】
なお、上記実施形態には、少なくともテスト対象となっているモジュールと、該モジュールから呼び出されるサブモジュールである依存モジュールと、該依存モジュールが行う手続きの振る舞いを代行するスタブとを、それぞれの記述内容に従って実行するモジュール実行手段を備え、前記モジュール実行手段は、テスト対象モジュールから依存モジュールへの呼び出しを検出し、当該呼び出しの処理を実行するモジュールとして依存モジュールかスタブかを所定の条件に従って決定し、決定に応じて当該呼び出しの処理を実行させる処理委譲手段を含むソフトウェア部分テストシステムの構成例が示されている（図１参照。）。
【００４０】
また、上記実施形態には、処理委譲手段が、呼び出し時点でのプログラム中のデータの内容に関して記述された条件式の真偽値に基づいて、当該呼び出しの処理を実行するモジュールを決定するソフトウェア部分テストシステムの構成例が示されている。
【００４１】
また、上記実施形態には、処理委譲手段が、呼び出しのパラメータ値に関して記述された条件式の真偽値に基づいて、当該呼び出しの処理を実行するモジュールを決定するソフトウェア部分テストシステムの構成例が示されている。
【００４２】
また、上記実施形態には、処理委譲手段が、呼び出し時点での変数値に関して記述された条件式の真偽値に基づいて、当該呼び出しの処理を実行するモジュールを決定するソフトウェア部分テストシステムの構成例が示されている。
【００４３】
また、上記実施形態には、処理委譲手段が、呼び出しのパラメータ値および呼び出し時点での変数値に関して記述された条件式の真偽値に基づいて、当該呼び出しの処理を実行するモジュールを決定するソフトウェア部分テストシステムの構成例が示されている。
【００４４】
また、上記実施形態には、処理委譲手段が、アスペクト指向言語を用いて、依存モジュールが行う手続きを呼び出すコードをポイントカットとするアスペクトコンポーネント内で、条件式により処理の委譲先を制御するよう記述されたプログラムに従って動作する情報処理装置によって実現されるソフトウェア部分テストシステムの構成例が示されている。
【産業上の利用可能性】
【００４５】
本発明は、ソフトウェアを複数のモジュールに分割して並行開発する際の部分テストに好適に適用可能である。
【図面の簡単な説明】
【００４６】
【図１】本発明によるソフトウェア部分テストシステムの構成例を示すブロック図である。
【図２】ソフトウェア部分テストシステムのより具体的な構成例を示すブロック図である。
【図３】依存モジュールが行う手続きの全てをスタブで代替するソフトウェア部分テストシステムの構成例を示す説明図である。
【図４】本実施形態におけるソフトウェア部分テストシステムの動作の一例を示すフローチャートである。
【図５】実施対象となるプログラムモジュールの例を示す説明図である。
【図６】ソフトウェア部分テストシステムの一実施例を示す説明図である。
【符号の説明】
【００４７】
１０  モジュール実行手段
１１  処理委譲手段
１００  制御部
１０１  テストドライバ実行部
１０２  テスト対象モジュール実行部
１０３  委譲先制御部
１０４  依存モジュール実行部
１０５  スタブ実行部
【図１】
0005082797.tif 000002
【図２】
0005082797.tif 000003
【図３】
0005082797.tif 000004
【図４】
0005082797.tif 000005
【図５】
0005082797.tif 000006
【図６】
0005082797.tif 000007