(57)【要約】【課題】スタブを実プログラムに置き換えた際に最低限必要となるテストプログラムを自動生成する機能を実現した単体テスト支援装置およびそのプログラムを提供する。【解決手段】テストケース生成部１４は、スタブ情報記憶部２３に記憶されたスタブ情報に従い、スタブプログラムが実際のプログラムに置き換わった際に、置き換わったプログラムをテストするためのテストケース情報（２ｆ）を生成し、テストケース記憶部２２に格納する。【選択図】    図１
2011100418.tif 000002
【特許請求の範囲】
【請求項１】
スタブと、スタブが実プログラムに置き換わった際に実プログラムをテストするためのテストプログラムを生成する単体テスト支援装置であって、
前記スタブを定義するスタブ定義情報に基づきテストケースを生成するテストケース生成手段と、
前記テストケース生成手段が生成したテストケースに基づき前記テストプログラムを生成するテストプログラム生成手段と
を具備したことを特徴とする単体テスト支援装置。
【請求項２】
前記テストケース生成手段は、前記スタブの定義情報における下位プログラムの動作種別毎にテストケースを生成することを特徴とする請求項１に記載の単体テスト支援装置。
【請求項３】
前記テストケース生成手段は、前記スタブで代替している子メソッドの内部インターフェイス情報を含むふるまい情報若しくはメソッドのテスト仕様情報を前記スタブの定義情報として前記テストケースを生成することを特徴とする請求項２に記載の単体テスト支援装置。
【請求項４】
スタブと、スタブが実プログラムに置き換わった際に実プログラムをテストするためのテストプログラムを生成する単体テスト支援装置としてコンピュータを機能させるためのテスト支援プログラムであって、
前記スタブを定義するスタブ定義情報をもとにテストケースを生成する機能と、
前記テストケースをもとに前記テストプログラムを生成する機能と
をコンピュータに実現させるためのテスト支援プログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、情報処理システムにおけるソフトウェア開発に適用して好適な単体テスト支援装置およびそのプログラムに関する。
【背景技術】
【０００２】
情報処理システムにおいてソフトウェアの品質を確保するためには、テスト工程の序盤での単体テスト（メソッドまたは関数と称されるプログラム単位での単体テスト）を十分に行なうことが重要である。
【０００３】
ソフトウェア開発のスタイルは、トップダウン型とボトムアップ型に大別されるが、特に、前者のトップダウン型において、単体テストの段階では、テスト対象のプログラムから更に呼び出される下位プログラムが未実装な場合は、スタブと呼ばれるダミーのプログラムを下位プログラムの代替として用意しテストを実施していた。
【０００４】
スタブで代替していた下位プログラムも、開発が進むにつれ実際のプログラムに置き換わる。無論、これら下位プログラムに対しても上位のプログラムと同様に単体テストを行なうことが望ましいが、システムが大規模・複雑化するほど、工数上の問題が顕在化してくる。すなわち、システムテスト、結合テスト等に加え、最下層のプログラム単位まで厳密にテストを行なおうとするとテストの工数が著しく増大する。ただし、工数的な理由で、下位プログラムの単体テストを疎かにすると、思いもよらぬところでテストケースの漏れが生じ、ソフトウェア全体としての品質低下を招くこととなる。この問題を解消するにはソフトウェアの開発工程において下位プログラムの単体テストを実施するためのテストプログラムを別途用意する必要があり、ソフトウェア開発に係る作業負担が嵩む問題があった。
【０００５】
従来では、例えば、Ｊｔｅｓｔ（登録商標）や特許文献１などに見られるように、テストプログラムやスタブ（スタブプログラム）を生成する製品や発明が存在した。しかしながら、スタブプログラムが実際のプログラムに置き換わった際のテストについて解決するものではなかった。
【先行技術文献】
【特許文献】
【０００６】
【特許文献１】特開２００８−１４０２６３号公報
【発明の概要】
【発明が解決しようとする課題】
【０００７】
上述したように、従来ではソフトウェアの開発工程において下位プログラムの単体テストにかかる作業負担に問題があった。
【０００８】
本発明は上記実情に鑑みなされたもので、スタブを実プログラムに置き換えた際に最低限必要となるテストプログラムを自動生成する機能を実現した単体テスト支援装置（単体テスト支援ツール）およびそのプログラムを提供することを目的とする。
【課題を解決するための手段】
【０００９】
本発明は、下位プログラムに対するテストプログラムを簡便に生成するための手段を提供するもので、具体的には、スタブを定義する際の入出力の対応情報を、下位プログラムのテスト仕様として利用することに加え、対応情報をベースに主に入力の組み合わせに着目してテスト仕様を生成させることにより、少ない入力の手間で効果的なテスト仕様、およびテストプログラムを生成する手段を提供する。
【００１０】
本発明は、スタブと、スタブが実プログラムに置き換わった際に実プログラムをテストするためのテストプログラムを生成する単体テスト支援装置であって、前記スタブを定義するスタブ定義情報に基づきテストケースを生成するテストケース生成手段と、前記テストケース生成手段が生成したテストケースに基づき前記テストプログラムを生成するテストプログラム生成手段とを具備したことを特徴とする。
【００１１】
本発明によれば、スタブを実プログラムに置き換えた際に最低限必要となるテストプログラムが自動生成されることから、子メソッド、孫メソッドのような、プログラムの細部についても、現実的な工数内でテストを実施することができ、ソフトウェア全体としての品質が確保される。
【発明の効果】
【００１２】
本発明によれば、スタブを実プログラムに置き換えた際に最低限必要となるテストプログラムの自動生成機能を実現でき、これによりソフトウェア開発にかかるプログラムテストの作業負担を軽減して開発対象ソフトウェアの品質を確保することができる。
【図面の簡単な説明】
【００１３】
【図１】本発明の実施形態に係る単体テスト支援装置の構成を示すブロック図。
【図２】上記実施形態におけるテストケース生成部の構成を示すブロック図。
【図３】本発明の実施例１におけるテスト対象プログラムの概要を示す。
【図４】上記実施例１におけるテスト仕様情報の一例を示す図。
【図５】上記実施例１におけるテストケース情報の一例を示す図
【図６】上記実施例１におけるスタブ情報の一例を示す図。
【図７】上記実施例１におけるテスト対象プログラムとテストプログラムとスタブプログラムの関係を示す図。
【図８】上記実施例１におけるテストケース生成部内の入力値算出部の処理の流れを示すフローチャート。
【図９】上記実施例１における入力値リストと入力値選定結果の一例を示す図。
【図１０】上記実施例における下位プログラムに対する生成されたテストケースの一例を示す図。
【図１１】上記実施例１におけるテスト対象プログラムとなった下位プログラムとテストプログラムの関係を示す図。
【図１２】本発明の実施例２におけるスタブ情報の一例を示す図。
【図１３】上記実施例２における入力値リストと入力値選定結果の一例を示す図。
【図１４】上記実施例２における下位プログラムに対する生成されたテストケースの一例を示す図。
【図１５】上記実施例２におけるテスト対象プログラムとなった下位プログラムとテストプログラムの関係を示す図。
【図１６】本発明の実施例２におけるスタブ情報の一例を示す図。
【図１７】上記実施例３における入力値リストと入力値選定結果の一例を示す図。
【図１８】上記実施例３における下位プログラムに対する生成されたテストケースの一例を示す図。
【発明を実施するための形態】
【００１４】
以下図面を参照して本発明の実施形態を説明する。
【００１５】
本発明の実施形態におけるツール全体の構成並びに基本動作を図１および図２を参照して説明する。なお、この実施形態におけるテスト対象の下位プログラムについて、オブジェクト指向によるプログラミング言語の表現形式ではメソッドと呼称され、Ｃ言語に代表されるプログラミング言語の表現形式では関数と呼称されるが、以降の説明ではメソッドと呼称する。
【００１６】
本発明は、開発対象ソフトウェアの設計情報からテストプログラムとスタブプログラムを生成する単体テスト支援装置において、テストプログラム生成に必要な設計情報を与えなくても、スタブ（スタブプログラム）の生成に利用した設計情報に基づき、最低限実施しておくべきテストプログラムを自動生成することを特徴とする。
【００１７】
スタブプログラムは、主に子メソッドのふるまいに基づき生成される。テストプログラムは、主にメソッドのテスト仕様に基づき生成されるが、スタブ定義のためにふるまいが与えられた子メソッドに関しては、テスト仕様を与えなくてもふるまい情報に基づき生成することも可能である。本発明においては、子メソッドのふるまい情報にもとづきスタブプログラムを生成するスタブプログラム生成機能と、メソッドのテスト仕様、もしくは、子メソッドのふるまい情報にもとづきテストプログラムを生成するテストプログラム生成機能とを具備する。
【００１８】
図１は、本発明の実施形態に係る単体テスト支援装置の全体の構成を示すブロック図である。
【００１９】
本発明の実施形態に係る単体テスト支援装置は、図１に示すように、入力部（テスト仕様読込部）１１と、テストプログラム生成部１２と、スタブプログラム生成部１３と、テストケース生成部１４と、テスト実行部１５と、出力部１６と、テストケース記憶部２２と、スタブ情報記憶部２３と、テストプログラム記憶部２４と、スタブプログラム記憶部２５とを具備して構成されている。
【００２０】
入力部１１は、外部のテスト仕様記憶部２１からテスト仕様（２ａ）を順次読み込み、テスト対象プログラムに対するテストケース情報（２ｂ）をテストケース記憶部２２に、テスト対象プログラムから呼び出される下位プログラムの動作をスタブ情報（２ｃ）としてスタブ情報記憶部２３に、それぞれ出力する。この入力部１１が読み込むテスト仕様（２ａ）は、外部のテスト対象プログラム記憶部２６に記憶されたテスト対象プログラムをテストするための入力と期待される出力の組、および下位プログラムにおける入力と期待される出力の組を有する。また、入力部１１は、テストケース記憶部２２に記憶されたテストケース情報（２ｂ）、およびスタブ情報記憶部２３に記憶されたスタブ情報（２ｃ）を必要に応じて追加・変更する機能を有するもので、この機能については後述する。
【００２１】
テストケース記憶部２２は、テスト対象プログラム毎に、当該テスト対象プログラムをテストするための入力と期待される出力の組を示す情報をテストケース情報（２ｂ）として記憶する。
【００２２】
スタブ情報記憶部２３は、テスト対象プログラムが動作する上で必要となる下位プログラムにおける入出力の対応関係を示す情報をスタブ情報（２ｃ）として記憶する。
【００２３】
テストプログラム生成部１２は、テストケース記憶部２２に記憶されたテストケース情報（２ｂ）に従い、テストプログラム（２ｄ）を生成し、当該テストプログラム（２ｄ）をテストプログラム記憶部２４に格納する。テストプログラム（２ｄ）は、テストケース情報（２ｂ）で定義された入力でテスト対象プログラムを起動し、実行結果がテストケースで定義された出力（例外やエラーも含む）どおりであるか否かをチェックするといった動作を行なう。
【００２４】
スタブプログラム生成部１３は、スタブ情報記憶部２３に記憶されたスタブ情報に従い、スタブプログラム（２ｅ）を生成し、当該スタブプログラム（２ｅ）をスタブプログラム記憶部２５に格納する。スタブプログラム（２ｅ）は、テスト対象プログラムから呼び出され、予めスタブ情報で定義された通りのふるまいをする。
【００２５】
テストケース生成部１４は、スタブ情報記憶部２３に記憶されたスタブ情報に従い、スタブプログラムが実際のプログラムに置き換わった際に、置き換わったプログラムをテストするためのテストケース情報（２ｆ）を生成し、当該テストケース情報（２ｆ）をテストケース記憶部２２に格納する。テストケース生成の詳細については後述する。
【００２６】
テスト実行部１５は、外部のテスト対象プログラム記憶部２６に記憶されたテスト対象プログラムとスタブプログラム記憶部２５に記憶されたスタブプログラムをリンクさせて、テスト対象プログラムを実行可能な状態にする。そして、テストプログラムを通じて、テスト対象プログラムをテストケースに定義された入力で動作させ、動作結果がテストケースに定義されたとおりであるか否かをチェックし、チェックの結果を出力部１６に出力する。
【００２７】
出力部１６は、テスト実行部１５からのチェックの結果に従い、テストケース記憶部２２に記憶されたテストケース毎に合否の判定を行い、その判定結果をテスト結果情報（２ｇ）として外部のテスト結果記憶部に出力する。
【００２８】
上記したテストケース生成部１４の構成を図２に示している。このテストケース生成部１４は、入力値算出部１４１とテストケース合成部１４２を具備して構成されている。
【００２９】
入力値算出部１４１は、スタブ情報記憶部２３に記憶されたスタブ情報から、実際のプログラムに置き換える、スタブにおける各入力パラメータについて、スタブ定義で使われた入力値に基づき、置き換えたプログラムをテストするのに必要となる入力値を選択、もしくは算出し、テストケース合成部１４２へ出力する。
【００３０】
テストケース合成部１４２は、算出された入力値の組み合わせに基づきテストケースを合成し、テストケース記憶部２２へ出力する。出力される各テストケースにおいて、入力値の組み合わせがスタブ情報に存在する場合、その組み合わせに対する期待される出力値をスタブ情報から転記する。一方、入力値の組み合わせがスタブ情報に存在しない場合、期待される出力値は規定値、もしくは空のままとする。この状態を未定状態と定義するが、未定状態の期待される出力は、入力部１１を通してユーザが追記することが可能である。
【００３１】
上記したように、スタブ情報に基づきテストケースを生成することにより、大規模なソフトウェアに対しても、現実的な作業量で効果的なテストを実施することができる。また、テストケース生成において、スタブ情報をそのままテストケースとするわけではなく、テストに有効な入力値を算出し、その組み合わせに基づき生成するため、無駄や漏れのないテストを下位プログラムに対しても行なうことができる。
【００３２】
ここで、さらに図３乃至図１８を参照して本発明の実施形態における第１乃至３実施例を説明する。  
（第１実施例）  
本発明の実施形態における第１の実施例を図３乃至図１１を参照して説明する。  
テスト対象プログラムの概要を図３に示している。ここでは、元々のテスト対象プログラムである、ｆｕｎｃ１およびｆｕｎｃ２より、共通の下位プログラムｓｕｂが呼ばれている。なお、ここでは、ｆｕｎｃ１およびｆｕｎｃ２と、ｓｕｂをそれぞれメソッドｆｕｎｃ１、メソッドｆｕｎｃ２、メソッドｓｕｂと呼称する。
【００３３】
上記メソッドｆｕｎｃ１およびｆｕｎｃ２をテストするためのテスト仕様を図４に示している。  
テスト仕様には、それぞれのテスト対象プログラムについて、テストに用いる入力パラメータと期待される出力値の組がテストケース情報として与えられている。加えて、それぞれのテストケースにおいて、下位プログラムのメソッドｓｕｂがどのような入力パラメータで起動され、どのような出力を返すのかが、スタブ情報として与えられている。
【００３４】
上記したように、入力部１１によって、テスト仕様は、テストケース記憶部２２と、スタブ情報記憶部２３に取り込まれる。
【００３５】
メソッドｆｕｎｃ１に対するテストケース情報を図５に示している。メソッドｆｕｎｃ２に対しても、同様のテストケース情報がテストケース記憶部２２に格納される。
【００３６】
メソッドｓｕｂに関するスタブ情報を図６に示している。この図６から分かるように、複数のテスト対象プログラムから呼ばれる下位プログラムに関するスタブ情報は、それぞれのテスト対象プログラムにおけるテスト仕様から抽出されたスタブ情報を全てまとめたものになる。なお、スタブ定義情報の最終行（０，＊，＊）は、規定値としてこのスタブが０を返すことを表す。
【００３７】
上記のテストケース情報とスタブ情報に基づき、テストプログラムとスタブプログラムが生成される。
【００３８】
メソッドｆｕｎｃ１について、元のテスト対象プログラムと生成されたテストプログラムとスタブプログラムの関係を図７に示している。
【００３９】
テストプログラムは、テストケース情報に示された入力値の組でテスト対象プログラムを記載し、戻り値がテストケース情報に示された期待された出力どおりであるか否かをチェックする。図７に示す例では、期待された出力どおりでない場合、メソッドＦＡＩＬＥＤが呼び出され、テスト失敗時の処理が本メソッド内で実施される。
【００４０】
一方、スタブ情報に示された入出力関係を実現すべく、スタブプログラムが生成される。図７に示す例では、予め定義された入力の場合に限り対応する出力を返し、その他の場合は０を返すメソッドとして実装されている。
【００４１】
なお、メソッドｆｕｎｃ２についても、図７と同様のテストプログラム、および図７と同一のスタブプログラムが生成されテストが実施されるが、ここでは割愛する。
【００４２】
次に、下位プログラムであるメソッドｓｕｂがスタブから実プログラムに置き換わった際のテストプログラム生成について述べる。
【００４３】
スタブプログラムが実プログラムに置き換わった際は、テストケース生成部１４により、スタブ情報からテストケースを生成する。
【００４４】
テストケース生成部１４に設けられた入力値算出部１４１の処理の流れを図８に示している。この入力値算出部１４１における処理では、各入力パラメータにおいて、スタブ生成で実際に使用した値を列挙し入力値リストとする（ステップＳ１１〜Ｓ１７）。次に、入力値リスト内の入力値の中からテストケースとして必要な値を選定する（ステップＳ１３）。
【００４５】
入力値リストと、選定結果の例を図９に示している。この例では、選定結果を網掛のセルで示し、各入力パラメータについて、入力値リスト内の最小値と最大値を選定している。
【００４６】
図９に示す入力値選定結果に基づいたメソッドｓｕｂのテストケースを図１０に示している。このテストケースは、制定された入力値の全組み合わせを網羅するように、テストケース合成部１４２により生成される。
【００４７】
図１０のテストケースに基づいて生成されたメソッドｓｕｂのテストプログラムとメソッドｓｕｂ自身の関係を図１１に示している。
【００４８】
この例では、メソッドｓｕｂからの返り値は一律で規定値の０としているが、ユーザが入力部を介して、図１０に示すテストケースにおける、期待される出力値を変更することにより、図１１に示すテストプログラムに反映することも可能である。
【００４９】
（実施例２）  
本発明の実施形態における実施例２を図１２乃至図１５を参照して説明する。  
この実施例２におけるテスト対象プログラムの構成は上記した実施例１と同様であるが、この実施例２では下位プログラムが正常に返り値を戻す場合（正常系）と、エラーを発生させる場合（エラー系）があるものとしている。
【００５０】
この下位プログラムの動作を定義したスタブ情報例を図１２に示している。
【００５１】
この場合、正常系、エラー系それぞれの場合について、種別として、入力値リストを構成し、入力値の選定を実施する。
【００５２】
この入力値リストと選定結果を図１３に示している。なお、各種別における入力値の列挙・選定のアルゴリズムは、上記した実施例１と同様である。この実施例２で生成されたテストケースを図１４に示している。テストケースの生成は、それぞれの種別における最大値と最小値の組み合わせに基づく。
【００５３】
選定された入力値の組そのものがスタブ情報に存在する場合、該当するテストケースにおける期待される出力値はテストケースから転記され、未定状態ではなくなる。この例では、エラー系のテストケースとして生成した入力値（２，２）の組についても、正常系として動作することがスタブ情報で定義されているので、期待される出力値はＥｒｒｏｒからスタブ情報における値（４）に変更されている。
【００５４】
この実施例２で生成されたテストプログラムを図１５に示している。上記した実施例１の同テストプログラムと異なる点は、エラー系に種別されるテストケースについて、エラー検出のメソッドｉｓＥｒｒｏｒを返り値の比較の代わりに使用している。
【００５５】
（実施例３）  
本発明の実施形態における実施例３を図１６乃至図１８を参照して説明する。  
先の二つの実施例１，２と異なり、この実施例３では、下位プログラムの入力パラメータａ，ｂ，ｃが大小関係や順序関係を持たない値を取るものとする。
【００５６】
メソッドｓｕｂのスタブ情報の一例を図１６に示している。ここでは、入力パラメータａの入力値Ａ１，Ａ２，Ａ３は、大小関係・順序関係を持たない。ｂ及びｃについても同様である。
【００５７】
このような場合、テストケース生成部１４に設けられた入力値算出部１４１は、図１７に示すように、スタブ情報に出現した全ての入力値を選定する。
【００５８】
テストケース合成部１４２は、図１８に示すように、全組み合わせを網羅するようなテストケースを生成するが、実験計画法等の手法を用いて、全網羅よりも数を削減したテストケースを生成することも可能である。
【００５９】
なお、本発明に係る単体テスト支援装置の構成および機能は、上記実施形態および各実施例そのままに限定されるものではなく、実施段階ではその要旨を逸脱しない範囲で構成要素を変形して具現可能である。
【００６０】
そして、上記実施形態に開示されている複数の構成要素の適宜な組み合わせにより種々の発明を形成できる。例えば、実施形態に示される全構成要素から幾つかの構成要素を削除してもよい。更に、異なる実施形態に構成要素を適宜組み合わせてもよい。
【００６１】
また、上記実施形態に記載した手法は、コンピュータに実行させることのできる、例えば単体テスト支援装置として機能させるためのテスト支援プログラムとして、磁気ディスク、光ディスク、光磁気ディスク、半導体メモリなどの記憶媒体に格納して頒布することもできる。
【００６２】
更に、記憶媒体からコンピュータにインストールされたプログラムの指示に基づきコンピュータ上で稼働しているＯＳ（オペレーティングシステム）や、データベース管理ソフト、ネットワークソフト等のＭＷ（ミドルウェア）等が上記実施形態を実現するための各処理の一部を実行してもよい。
【００６３】
加えて、本発明における記憶媒体は、コンピュータと独立した媒体に限らず、ＬＡＮやインターネット等により伝送されたプログラムをダウンロードして記憶または一時記憶した記憶媒体であってもよい。
【符号の説明】
【００６４】
１１…入力部（テスト仕様読込部）、１２…テストプログラム生成部、１３…スタブプログラム生成部、１４…テストケース生成部、１５…テスト実行部、１６…出力部、２１…テスト仕様記憶部、２２…テストケース記憶部、２３…スタブ情報記憶部、２４…テストプログラム記憶部、２５…スタブプログラム記憶部、２６…テスト対象プログラム記憶部、２７…テスト結果記憶部、１４１…入力値算出部、１４２…テストケース合成部。
【図１】
2011100418.tif 000003
【図２】
2011100418.tif 000004
【図３】
2011100418.tif 000005
【図４】
2011100418.tif 000006
【図５】
2011100418.tif 000007
【図６】
2011100418.tif 000008
【図７】
2011100418.tif 000009
【図８】
2011100418.tif 000010
【図９】
2011100418.tif 000011
【図１０】
2011100418.tif 000012
【図１１】
2011100418.tif 000013
【図１２】
2011100418.tif 000014
【図１３】
2011100418.tif 000015
【図１４】
2011100418.tif 000016
【図１５】
2011100418.tif 000017
【図１６】
2011100418.tif 000018
【図１７】
2011100418.tif 000019
【図１８】
2011100418.tif 000020