(57)【要約】【課題】スタブ関数を用いたソフトウェアの単体試験において、試験対象の関数が呼び出す下位関数と試験対象の関数との間の入出力のインターフェースを実装したスタブ関数を自動的に生成することにより、ソフトウェアの単体試験の試験効率を向上させること。【解決手段】スタブ関数Ｉ／Ｆ抽出部３は試験対象の関数とこの試験対象の関数が呼び出す下位関数との間の入出力のＩ／Ｆを抽出し、スタブ関数Ｉ／Ｆ分析部４は抽出されたＩ／Ｆを分析する。スタブ関数生成部５は、Ｉ／Ｆの抽出分析結果に基づいて、下位関数と試験対象の関数との間の入出力のインターフェースを実装したスタブ関数を生成する。スタブ関数出力値生成部６はスタブ関数の出力変数の出力値を生成する。テストケース生成部７は、試験対象の関数の入力変数の取り得る値と、スタブ関数出力値生成部６が出力したスタブ関数の出力変数の取り得る値とからテストケースの作成を行う。【選択図】        図１
2008140263.tif 000002
【特許請求の範囲】
【請求項１】
試験対象の関数が呼び出す下位関数をその動作を模擬する関数であるスタブ関数で置き換えた後に前記試験対象の関数の試験を行うソフトウェアの単体試験において、前記スタブ関数を自動生成することにより単体試験を支援する単体試験支援装置であって、
前記下位関数を前記試験対象の関数から特定し、前記下位関数と前記試験対象の関数との間の入出力のインターフェースを抽出するインターフェース抽出手段と、
前記インターフェース抽出手段により抽出された前記インターフェースを分析するインターフェース分析手段と、
前記インターフェースの分析結果に基づいて、前記インターフェースを備えたスタブ関数を生成するスタブ関数生成手段と、
を備えることを特徴とする単体試験支援装置。
【請求項２】
前記試験対象の関数、前記インターフェース、及び前記インターフェースの分析結果をもとに、前記スタブ関数の出力変数の出力値を生成するスタブ関数出力値生成手段を備えることを特徴とする請求項１に記載の単体試験支援装置。
【請求項３】
前記下位関数の出力変数が前記試験対象の関数内における条件分岐で使用されるときに、前記スタブ関数出力値生成部は、前記条件分岐で使用される前記出力変数の取り得る値を特定することにより、前記スタブ関数の出力値を生成することを特徴とする請求項２に記載の単体試験支援装置。
【請求項４】
前記スタブ関数生成部は、前記スタブ関数内で前記スタブ関数の出力変数をグローバル変数に設定し、このグローバル変数の値を任意に設定可能とすることにより、前記出力変数の出力値に任意の値が設定可能なスタブ関数を生成することを特徴とする請求項１〜３のいずれか１つに記載の単体試験支援装置。
【請求項５】
前記スタブ関数生成部は、前記スタブ関数内でグローバル変数を前記スタブ関数の入力変数に設定し、このグローバル変数の値を確認することにより、前記スタブ関数の入力変数の入力値を前記試験対象の関数が前記スタブ関数を呼び出した後に確認することが可能なスタブ関数を生成することを特徴とする請求項１〜４のいずれか１つに記載の単体試験支援装置。
【請求項６】
前記試験対象の関数の入力変数の取り得る値と、前記スタブ関数の出力変数の取り得る値との組み合わせから、単体試験用のテストケースを生成するテストケース生成手段を備えることを特徴とする請求項１〜５のいずれか１つに記載の単体試験支援装置。
【請求項７】
前記スタブ関数の出力値の取り得る値は、前記スタブ関数出力値生成部により生成された出力値であることを特徴とする請求項６に記載の単体試験支援装置。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、ソフトウェアを開発する際のソフトウェアの単体試験を支援する装置に関するものである。
【背景技術】
【０００２】
従来の高級言語プログラムの単体試験方法として、下位の関数からプログラムを実装して試験を実施するボトムアップ方式の試験方法と、上位の関数からプログラムを実装して試験を実施するトップダウン方式の試験方法がある。一般に、ボトムアップ方式の試験では、試験対象の関数を呼び出す上位の関数を擬似するドライバ関数と呼ばれる関数の実装が必要となる。ドライバ関数は試験対象の関数の実行に必要な変数等に値を設定し、試験対象の関数を呼び出す。一方、トップダウン方式の試験では、試験対象の関数が呼び出す下位の関数を擬似するスタブ関数と呼ばれる関数の実装が必要となる。スタブ関数は、試験対象の関数からの呼び出しに対して、試験対象の関数の実行を継続できるように、出力引数等の値を設定する。但し、ボトムアップ方式の試験において、試験対象の関数が呼び出す下位の関数が既に実装されている場合でも、試験時に試験の網羅率を上げ、又は異常系の特殊な試験を行う場合には、実装されている下位の関数の代わりに、試験でのみ使用するスタブ関数を実装して試験を行うことがある。
【０００３】
スタブ関数を用いて試験を行う際に、試験対象の関数がスタブ関数の戻り値等の出力変数の値をスタブ関数の呼出し後に参照する場合には、スタブ関数の出力変数の値を任意に設定して試験ができることが望ましい。また、試験対象の関数が、スタブ関数にスタブ関数の引数として入力変数を渡す場合に、正しい値を渡しているかどうかをスタブ関数の内部で確認できることが望ましい。このような目的のために、従来、単体試験においてスタブ関数を使用する場合、スタブ関数の作成は主に作業者が行っていた。
【０００４】
また、市販されているＣ++Ｔｅｓｔ（登録商標）など、スタブ関数を自動生成するツールは存在するが、スタブ関数の戻り値及び出力変数の値等を任意の値に設定し、また、スタブ関数の入力変数の値を確認する仕組みを備えたスタブ関数の作成は行なっておらず、自由度の高い単体試験の実施が困難となっている。
【０００５】
また、特許文献１では、ハードウェアの制御を目的としたソフトウェアの開発を支援するソフトウェア開発支援方法において、ハードウェア仕様情報とソフトウェア設計情報とを関連づけた入出力動作仕様情報及び入出力スタブコマンド生成規則から、ハードウェアとソフトウェアが連係して実現するシステムの動作を模擬する入出力スタブ関数の自動生成を行う技術が開示されている。
【０００６】
また、特許文献２では、テストドライバの中でスタブ関数を記述すると、テスト実行中に、スタブ関数の処理を展開して試験を行う方法が記載されている。
【０００７】
【特許文献１】特開平６−１３１２１５号公報
【特許文献２】特開２００４−２８７８５８号公報
【発明の開示】
【発明が解決しようとする課題】
【０００８】
しかしながら、上記従来のスタブ関数を用いたソフトウェアの単体試験においては、テストスタブを作業者が作成する必要があった。そのため、単体試験作業の効率が低下するという問題があった。
【０００９】
例えば、作業者はスタブ関数の出力変数がどのような値を出力すべきかを入力する必要があった。また、スタブ関数の出力まで考慮して、単体試験の入力としてどのような入力条件を与えるべきかを作業者が与える必要があった。これらは、単体試験作業の効率を低下させる要因となっている。
【００１０】
また、市販されている単体試験支援環境では、スタブ関数が自動生成されても、スタブ関数の出力変数の値を任意に設定できないという問題があった。さらに、スタブ関数の引数としての入力変数の値を確認できないため、試験の信頼性に影響を及ぼす可能性があった。これらは、自由度の高い単体試験の実施を困難としていた。
【００１１】
本発明は、上記に鑑みてなされたものであって、スタブ関数を用いたソフトウェアの単体試験において、試験対象の関数が呼び出す下位の関数と、試験対象の関数との間の入出力のインターフェースを実装したスタブ関数を生成することにより、ソフトウェアの単体試験の試験効率を向上させることが可能なソフトウェアの単体試験支援装置を得ることを目的とする。また、自由度の高い単体試験の実施を可能としたソフトウェアの単体試験支援装置を得ることを目的とする。
【課題を解決するための手段】
【００１２】
上述した課題を解決し、目的を達成するために、本発明にかかるソフトウェアの単体試験支援装置は、試験対象の関数が呼び出す下位関数をその動作を模擬する関数であるスタブ関数で置き換えた後に前記試験対象の関数の試験を行うソフトウェアの単体試験において、前記スタブ関数を自動生成することにより単体試験を支援する単体試験支援装置であって、前記下位関数を前記試験対象の関数から特定し、前記下位関数と前記試験対象の関数との間の入出力のインターフェースを抽出するインターフェース抽出手段と、前記インターフェース抽出手段により抽出された前記インターフェースを分析するインターフェース分析手段と、前記インターフェース分析手段による前記インターフェースの分析結果に基づいて、前記インターフェースを備えたスタブ関数を生成するスタブ関数生成手段と、を備えることを特徴とする。
【発明の効果】
【００１３】
本発明によれば、スタブ関数を用いたソフトウェアの単体試験において、試験対象の関数とこの試験対象の関数が呼び出す下位関数との間の入出力のインターフェースを実装したスタブ関数を自動的に生成するようにしたので、スタブ関数の生成作業の効率が向上し、ソフトウェアの効率的な単体試験が可能になる、という効果を奏する。
【発明を実施するための最良の形態】
【００１４】
以下に、本発明にかかるソフトウェアの単体試験支援装置の実施の形態を図面に基づいて詳細に説明する。なお、この実施の形態によりこの発明が限定されるものではない。
【００１５】
実施の形態１．
図１は、本発明にかかる単体試験支援装置の実施の形態１の構成を示すブロック図である。図１に示すように、本実施の形態の単体試験支援装置２０は、入出力装置１と、システム制御部２と、スタブ関数Ｉ／Ｆ（インターフェース）抽出部３と、スタブ関数Ｉ／Ｆ分析部４と、スタブ関数生成部５と、スタブ関数出力値生成部６と、テストケース生成部７と、入力変数値記憶部１２と、ソースコード記憶部８と、スタブ関数Ｉ／Ｆ記憶部９と、スタブ関数記憶部１０と、テストケース記憶部１１と、から構成される。
【００１６】
本実施の形態にかかる単体試験支援装置は、高級言語により記述されたプログラムにおける構成単位であるモジュール、例えば関数等に対する単体試験を行うものである。以下では、簡単のために関数を用いて説明を行うが、本発明は一般のモジュールに適用可能であることは明白であり、明細書中では、Ｃ言語等における関数を明示的に意味する場合を除けば、関数はこのようなより広い概念を意味するものとする。本実施の形態においては、単体試験支援装置２０は、図２に例示するような、例えばＣ言語で記述されたプログラム中の関数を試験対象の関数（以下、試験対象関数という）とする。図２に記述されたプログラムには、入力変数としてｉｎｐｕｔ_ｄａｔを有し、戻り値としてｒｅｔ_ｄａｔを返す関数ｆｕｎｃ１が定義されている。この関数ｆｕｎｃ１が、試験対象関数の一例である。
【００１７】
入出力装置１は、単体試験支援装置２０と利用者との間のＩ／Ｆであり、入力装置及び出力装置からなる。入出力装置１は、例えば、ディスプレイ、キーボード、及びマウス等から構成される。
【００１８】
ソースコード記憶部８には、入出力装置１を介して入力された試験対象プログラムが記憶される。また、入力変数値記憶部１２には、試験対象関数の入力変数及び入力変数の取り得る値が記憶される。
【００１９】
スタブ関数Ｉ／Ｆ抽出部３は、試験対象関数が呼び出す下位関数を特定し、この下位関数と試験対象関数との間の入出力を規定するＩ／Ｆを抽出する。スタブ関数Ｉ／Ｆ抽出部３により抽出されたＩ／Ｆは、スタブ関数Ｉ／Ｆ記憶部９に記憶される。スタブ関数Ｉ／Ｆ分析部４は、スタブ関数Ｉ／Ｆ抽出部３により抽出された抽出結果を分析し、Ｉ／Ｆを分類し特定する。スタブ関数Ｉ／Ｆ分析部４により分析されたＩ／Ｆの分析結果は、スタブ関数Ｉ／Ｆ記憶部９に記憶される。ここで、下位関数と試験対象関数との間の関係を規定するＩ／Ｆとは、下位関数の入出力動作仕様に関する情報であり、例えば、引数設定情報、戻り値情報等からなる。スタブ関数Ｉ／Ｆ抽出部３により抽出されたＩ／Ｆは、試験対象関数の下位関数の動作を擬似するスタブ関数の生成に使用される。
【００２０】
スタブ関数生成部５は、スタブ関数Ｉ／Ｆ記憶部９に記憶されたＩ／Ｆ、及びＩ／Ｆの分析結果に基づき、スタブ関数を生成する。
【００２１】
また、スタブ関数出力値生成部６は、スタブ関数Ｉ／Ｆ記憶部９に記憶されたＩ／Ｆ、Ｉ／Ｆ分析結果、及びソースコード記憶部８に記憶された試験対象プログラムに基づいて、スタブ関数の出力変数の出力値を生成し、出力変数及び出力値はスタブ関数記憶部１０に記憶される。
【００２２】
テストケース生成部７は、入力変数値記憶部１２に記憶された試験対象関数の入力変数及び入力変数の取り得る値と、スタブ関数記憶部１０に記憶されたスタブ関数の出力変数及び出力変数の取り得る値から、単体試験時におけるスタブ関数のテストケースを生成し、このテストケースの情報はテストケース記憶部１１に記憶される。
【００２３】
システム制御部２は、入出力装置１を介して入力された指示情報をもとに、スタブ関数Ｉ／Ｆ抽出部３、スタブ関数Ｉ／Ｆ分析部４、スタブ関数生成部５、スタブ関数出力値生成部６、及びテストケース生成部７等に対する制御を行う。
【００２４】
システム制御部２、スタブ関数Ｉ／Ｆ抽出部３、スタブ関数Ｉ／Ｆ分析部４、スタブ関数生成部５、スタブ関数出力値生成部６、及びテストケース生成部７は、コンピュータのＣＰＵ（Central Processing Unit：中央処理装置）等の演算装置、演算装置が解釈するプログラムが記憶されているハードディスク等の記憶装置、また、演算に必要なメモリ装置から実現される。入力変数値記憶部１２、ソースコード記憶部８、スタブ関数Ｉ／Ｆ記憶部９、スタブ関数記憶部１０、及びテストケース記憶部１１は、ハードディスク等の記憶装置から実現される。
【００２５】
次に、本実施の形態の動作について、図１〜図６を参照して説明する。図３は、単体試験を行うまでの標準的な作業手順を表すフローチャート、図４は、スタブ関数Ｉ／Ｆ分析部による分析手順を表すフローチャート、図５は、スタブ関数Ｉ／Ｆの分析例、図６は、図２に示す試験対象関数が呼び出す下位関数の一例である。
【００２６】
先ず、図３を参照して、図２のプログラム中に定義されている関数ｆｕｎｃ１の単体試験を行うまでの標準的な流れについて説明する。図３に示すように、ステップＳ３０１において、利用者が試験対象関数と試験対象関数の入力変数及びその取り得る値を指定する。即ち、利用者は図１の入出力装置１を介して、例えば図２の試験対象関数ｆｕｎｃ１を含む試験対象プログラムを単体試験支援装置２０に入力し、試験対象プログラムを図１のソースコード記憶部８に記憶させる。さらに、利用者は、試験対象関数の入力変数である引数ｉnｐｕｔ_ｄａｔが取り得る値（例えば、０、１０、１００等）を入力し、これらの入力値は入力変数値記憶部１２に記憶される。
【００２７】
次に、ステップＳ３０２においては、試験対象関数とスタブ関数とのＩ／Ｆを抽出し分析する。具体的には、図１のスタブ関数Ｉ／Ｆ抽出部３は、ソースコード記憶部８に記憶されている試験対象プログラムから、試験対象関数とこの試験対象関数が呼び出す下位関数との間の入出力のＩ／Ｆを抽出し、スタブ関数Ｉ／Ｆ分析部４は、抽出されたＩ／Ｆを分析する。Ｉ／Ｆ及びその分析結果は、スタブ関数Ｉ／Ｆ記憶部９に記憶される。
【００２８】
ここで、ステップＳ３０２の詳細について説明するために、図４について説明する。先ず、図４のステップＳ４００においては、スタブ関数Ｉ／Ｆ抽出部３は、試験対象関数を構文解析し、試験対象関数が呼び出している下位関数を識別する。つまり、ソースコード記憶部８に記憶されている試験対象プログラムを一般のコンパイラ等で行われている構文解析技術を用いて構文解析し、試験対象関数が呼び出している下位関数を全て抽出する。例えば、図２に示す例では、関数ｓｕｂ_ｆｎｕｃ１、及び関数ｓｕｂ_ｆｕｎｃ２が抽出される。
【００２９】
続いて、抽出された試験対象関数が呼び出している全ての下位関数に対し、スタブ関数Ｉ／Ｆ分析部４は、ステップＳ４０１からステップＳ４０５までのループを繰り返して実行する。ステップＳ４０２では、試験対象関数が下位関数を呼び出した後に、呼び出している下位関数の戻り値を使用する場合に、呼び出されている下位関数は試験対象関数に対して戻り値としてのＩ／Ｆを持つと定義し、その結果はスタブ関数Ｉ／Ｆ記憶部９に記憶される。図２の関数ｆｕｎｃ１が試験対象関数の場合、試験対象関数は関数ｓｕｂ_ｆｕｎｃ１を呼び出しており、そして、関数ｓｕｂ_ｆｕｎｃ１の戻り値を使用している（変数ｓｕｂ_ｒｅｔ_ｖａｌ）。このとき、スタブ関数Ｉ／Ｆ記憶部９に記憶される分析結果の一例を、図５の２行目に示す。図５に示すように、戻り値のＩ／Ｆとして、その戻り値の型であるｉｎｔがスタブ関数Ｉ／Ｆ記憶部に記憶される。
【００３０】
次に、図４のステップＳ４０３では、試験対象関数が呼び出している下位関数を構文解析し、その引数が呼び出している下位関数で参照されている場合、これを入力のＩ／Ｆを持つと定義し、その結果とその型及び変数名をスタブ関数Ｉ／Ｆ記憶部９に記憶させる。試験対象関数が図２の関数ｆｕｎｃ１であり、この試験対象関数が呼び出している下位関数を図６の関数ｓｕｂ_ｆｕｎｃ１とした場合に対して、スタブ関数Ｉ／Ｆ記憶部９に記憶される分析結果の一例を図５の３行目と５行目に示す。図２では、変数ａｒｇ_ｉが関数ｓｕｂ_ｆｕｎｃ１内で参照されているので、入力のＩ／Ｆとして、変数名ａｒｇ_ｉ及びその型であるｉｎｔが図５の３行目に記述されている。また、ポインタ変数ａｒｇ_ｉｏが関数ｓｕｂ_ｆｕｎｃ１内で参照されているので、入力のＩ／Ｆとして、変数名ａｒｇ_ｉ及びその型であるｉｎｔ＊が図５の５行目に記述されている。
【００３１】
次に、図４のステップＳ４０４では、試験対象関数が呼び出している下位関数を構文解析し、その引数が直接又は間接的に指し示す先が変更されている場合、これを出力のＩ／Ｆを持つと定義し、その結果とその引数の型及び変数名をスタブ関数Ｉ／Ｆ記憶部９に記憶させる。図２の試験対象関数ｆｕｎｃ１が呼び出している関数ｓｕｂ_ｆｕｎｃ１を、例えば、図６に示す関数とした場合に対して、スタブ関数Ｉ／Ｆ記憶部９の記憶内容の一例を図５の４行目と６行目に示す。図６に示すように、関数ｓｕｂ_ｆｕｎｃ１の引数としてのポインタ変数ａｒｇ_ｏは、関数ｓｕｂ_ｆｕｎｃ１内でポインタを経由してその指し示す先の値＊ａｒｇ_ｏが変更されている。そのため、出力のＩ／Ｆとして、変数名ａｒｇ_ｏ及びその型であるｉｎｔ＊が、図５の４行目に記述されている。また、図６に示すように、関数ｓｕｂ_ｆｕｎｃ１の引数としてのポインタ変数ａｒｇ_ｉｏは、関数ｓｕｂ_ｆｕｎｃ１内でポインタを経由してその指し示す先の値＊ａｒｇ_ｉｏが変更されている。そのため、出力のＩ／Ｆとして、変数名ａｒｇ_ｉｏ及びその型であるｉｎｔ＊が、図５の６行目に記述されている。以上のようにして、試験対象関数から抽出された全ての下位関数に対して図４に示すステップＳ４０１〜Ｓ４０５を繰り返し適用することにより、図３のステップＳ３０２に示す試験対象関数とスタブ関数とのＩ／Ｆを抽出し分析するステップが実行される。
【００３２】
但し、図２の関数ｓｕｂ_ｆｕｎｃ２のように、試験対象関数が呼び出している下位関数の引数が定数であり（図示例では、引数の値が１０）、戻り値が試験対象関数で使用されていない場合は、単体試験時に、スタブ関数の出力値を設定し、又はスタブ関数の引数の値が適切であるかどうかを確認する必要がない。そのため、スタブ関数Ｉ／Ｆ記憶部９に分析結果を記憶する必要は特にない。従って、このような場合には、Ｉ／Ｆの抽出及び分析は行わない。
【００３３】
再び図３に戻り、ステップＳ３０３において、スタブ関数Ｉ／Ｆ記憶部９の内容に従い、ソースコード記憶部８の内容をスタブ関数出力値生成部６が解析して、スタブ関数の出力値を生成しスタブ関数記憶部１０に記憶させる。なお、スタブ関数出力値生成部６によるスタブ関数の出力値の生成例については、実施の形態２で詳述する。
【００３４】
次に、図３のステップＳ３０４において、スタブ関数Ｉ／Ｆ記憶部９の内容に従い、ソースコード記憶部８の内容をスタブ関数生成部５が解析して、スタブ関数を生成しスタブ関数記憶部１０に記憶させる。
【００３５】
最後に、図３のステップＳ３０５において、入力変数値記憶部１２に記憶されている試験対象関数の入力変数及び入力変数の取り得る値と、スタブ関数記憶部１０に記憶されているスタブ関数の出力変数及び出力変数の取り得る値より、テストケース生成部７がテストケースを作成しテストケース記憶部１１に記憶させる。
【００３６】
以上のようにして、試験対象関数が呼び出す下位関数を模擬するスタブ関数が生成され、下位関数をスタブ関数で置き換えた後に、試験対象関数の単体試験を行うことができる。
【００３７】
本実施の形態の効果について説明する。本実施の形態によれば、スタブ関数を用いたソフトウェアの単体試験において、試験対象関数とこの試験関数が呼び出す下位関数との間のＩ／Ｆを実装したスタブ関数を自動的に生成することができる。これにより、スタブ関数の生成作業の効率が向上し、ソフトウェアの効率的な単体試験が可能となる。また、スタブ関数出力値生成部が、スタブ関数の出力値を生成するので、従来のように単体試験の作業者が出力変数の取り得る値を考慮して入力する場合に比べて、作業効率が向上する。また、テストケース生成部により、試験対象関数の入力変数の取り得る値と、スタブ関数の出力変数の取り得る値とを組み合わせて、テストケースを自動的に生成することができるので、従来のように作業者がこれらのテストケースを与えていた場合に比べて、作業効率が向上する。
【００３８】
実施の形態２．
図７は、本発明にかかる単体試験支援装置の実施の形態２における試験対象関数コードの一例を示す図である。また、図８は、本発明の実施の形態２における試験対象関数コードの別の一例を示す図である。本実施の形態の構成は、図１に示す実施の形態１の構成を備え、さらに、試験対象関数を記述する言語の仕様を定義する言語仕様定義部を備える。本実施の形態においては、スタブ関数出力値生成部の機能を、試験対象関数の具体例をもとに、詳細に説明する。
【００３９】
図７においては、試験対象関数Ｆｕｎｃ１は、関数内部で下位関数ＦｕｎｃＢ１を呼び出しており、下位関数ＦｕｎｃＢ１の戻り値ｉＦｕｎｃＢ_Ｒｅｔはｓｗｉｔｃｈ文における分岐条件として使用されている。このとき、スタブ関数出力値生成部６は、後述する図９に示す方法により、ｓｗｉｔｃｈ文の分岐条件が１、２、若しくは３、又はそれ以外であることを判別し、ｉＦｕｎｃＢ_Ｒｅｔの取り得る値、即ち、ＦｕｎｃＢ１の取り得る値が、１、２、若しくは３、又はそれ以外であることを抽出する。そして、スタブ関数出力値生成部６は、関数Ｆｕｎｃ１の単体試験時には、抽出された値のうち実値である１、２、又は３を、下位関数ＦｕｎｃＢ１を模擬するスタブ関数の取り得る値として生成する。
【００４０】
図９は、試験対象関数コードからスタブ関数の出力値の取り得る値を抽出する手順を示したフローチャートである。図９に示すように、先ず、スタブ関数出力値生成部６は、試験対象関数コードをソースコード記憶部８から読み込む（ステップＳ３１）。そして、スタブ関数出力値生成部６は、ソースコードの一行目をカレント行にセットする（ステップＳ３２）。次に、カレント行で、スタブ関数の出力値を分岐条件にしているかどうかを判別する（ステップＳ３３）。このとき、言語仕様定義部３８に定義された分岐条件識別子、及びスタブ関数Ｉ／Ｆ記憶部９に記憶されたスタブ関数の定義を用いて、分岐条件識別子が使用され且つスタブ関数出力値が分岐条件であるかどうかで判別する。言語仕様定義部３８には、分岐条件識別子として、例えばＣ言語ではｓｗｉｔｃｈ、ｉｆ等を予め登録しておく。カレント行でスタブ関数の出力値を分岐条件にしているときには、試験対象関数内で、条件分岐先を決定することができるかどうかを判別する（ステップＳ３４）。例えば、図７に示す関数例に対しては、ｃａｓｅ及びこれに続く数値、並びにｄｅｆａｕｌｔにより、条件分岐先を決定することができる。そして、条件分岐先を決定できる場合には、分岐条件で使用されている閾値を抽出し、この閾値をスタブ関数の出力値の取り得る値として、スタブ関数出力値生成部６に登録する（ステップＳ３５）。上述のように、図７に示す関数例に対しては、スタブ関数の出力値として、１、２、若しくは３、又はそれ以外であることが抽出される。続いて、カレント行の次の行があるかどうかを判別する（ステップＳ３６）。そして、次の行が存在するときには、次の行をカレント行にセットする（ステップＳ３７）。一方で、ステップＳ３３でスタブ関数の出力値を分岐条件にしていない場合は、ステップＳ３６を実行する。また、ステップＳ３４で分岐条件先を決定できなかった場合にも、同様にステップＳ３６を実行する。さらに、ステップＳ３６で次の行がない場合は、処理を終了する。
【００４１】
以上のようにして、スタブ関数出力値生成部は、試験対象関数が呼び出す下位関数の出力変数が分岐条件として使用されている場合に、下位関数の呼出し後の試験対象関数のコード内容を参照することにより、出力変数の取り得る値を特定し、下位関数を模擬するスタブ関数の出力値を生成する。なお、図７に示す関数例では、条件分岐に使用される下位関数の出力変数が戻り値の場合であるが、条件分岐に使用される下位関数の出力変数が下位関数の出力引数である場合にも同様に適用することができる。
【００４２】
次に、図８においては、試験対象関数Ｆｕｎｃ２は、関数内部で下位関数ＦｕｎｃＢ２を呼び出しており、この下位関数は、後述する図１０に示す方法により、１又は２を戻り値としていることが判別される。図８に示す例では、下位関数が実装されているときに、スタブ関数出力値生成部６が、下位関数を参照してスタブ関数の取り得る値を生成する例である。
【００４３】
図１０は、スタブ関数出力値生成部６が下位関数のコードからスタブ関数の出力値の取り得る値を抽出する手順を示したフローチャートである。図１０に示すように、先ず、スタブ関数出力値生成部６は、試験対象関数コードをソースコード記憶部８から読み込む（ステップＳ４１）。次に、スタブ関数出力値生成部６は、ソースコードの一行目をカレント行にセットする（ステップＳ４２）。続いて、カレント行で、スタブ関数の出力値を設定しているかどうかを判別する（ステップＳ４３）。このとき、言語仕様定義部３８に定義された戻り値識別子、及びスタブ関数Ｉ／Ｆ記憶部９に記憶されたスタブ関数の定義を用いて、スタブ関数の戻り値を設定しているか、又はスタブ関数の出力引数を設定しているか、のいずれかに該当するかで判別する。言語仕様定義部３８には、戻り値識別子として、例えばＣ言語ではｒｅｔｕｒｎを予め登録しておく。そして、カレント行でスタブ関数の出力値を設定している場合には、出力値に設定されている値をスタブ関数の出力値の取り得る値として、スタブ関数出力値生成部６に登録する（ステップＳ４４）。次に、カレント行の次の行があるかどうかを判別する（ステップＳ４５）。次の行が存在する場合には、次の行をカレント行にセットする（ステップＳ４６）。一方で、ステップＳ４３でスタブ関数の出力値を設定していなかった場合は、ステップＳ４５を実行する。また、ステップＳ４５で次の行がない場合は、処理を終了する。
【００４４】
本実施の形態によれば、試験対象関数が呼び出す下位関数の出力変数が試験対象関数内で分岐条件として使用されているときに、スタブ関数出力値生成部６が試験対象関数コードにおける分岐条件識別子を認識することにより、スタブ関数の出力変数の取り得る値を自動的に生成することができる。また、試験対象関数コードにおける下位関数の戻り値識別子を認識することにより、スタブ関数生成部６は、スタブ関数の出力値の取り得る値を自動的に生成することができる。後者は、下位関数が既に実装されている場合でも、実装されている下位関数の代わりにスタブ関数を使用して単体試験を行うときに利用することができる。なお、その他の効果は、実施の形態１の効果と同様である。
【００４５】
実施の形態３．
図１１は、本発明にかかる単体試験支援装置の実施の形態３において、スタブ関数の戻り値及び出力引数に対して、単体試験中又は単体試験前にスタブ関数の出力値として任意の値が設定可能なスタブ関数の例を示す図である。図１１の関数ｓｕｂ_ｆｕｎｃ１_ｓｔｕｂ１は、図６に示す関数ｓｕｂ_ｆｕｎｃ１を模擬するスタブ関数の一例である。本実施の形態の構成は実施の形態１と基本的に同様である。しかしながら、詳細には、スタブ関数出力値生成部６、テストケース生成部７、及びテストケース記憶部１１を含めなくてもよい。つまり、これらの機能は本実施の形態の実施に必須ではないが、これらの機能と組み合わせて使用することもできる。
【００４６】
図１１に示すように、_ＲＥＴ_ＩＮＴ_ｓｕｂ_ｆｕｎｃ１_ｓｔｕｂ１は、スタブ関数の戻り値を試験対象関数の試験前又は試験中に任意設定するための、プログラムの任意の場所でアクセス可能な変数であり、本図示例で使用するＣ言語の場合は、グローバル変数で定義する。図１１においては、_ＲＥＴ_ＩＮＴ_ｓｕｂ_ｆｕｎｃ１_ｓｔｕｂ１は、関数ｓｕｂ_ｆｕｎｃ１_ｓｔｕｂ１の定義前に、グローバル変数として定義されている。この_ＲＥＴ_ＩＮＴ_ｓｕｂ_ｆｕｎｃ１_ｓｔｕｂ１に対して、スタブ関数が呼び出される前に値を設定しておくことで、試験対象関数がスタブ関数を呼び出したときに、利用者が設定した任意の値をスタブ関数の戻り値として返すことが可能である。
【００４７】
同様に、図１１の_ＡＲＧ２_ＩＮＴ_ＯＵＴ_ｓｕｂ_ｆｕｎｃ１_ｓｔｕｂ１及び_ＡＲＧ３_ＩＮＴ_ＯＵＴ_ｓｕｂ_ｆｕｎｃ１_ｓｔｕｂ１は、スタブ関数の出力の引数の値を試験対象関数の試験前又は試験中に任意設定するための、プログラムの任意の場所でアクセス可能な変数であり、本図示例で使用するＣ言語の場合は、グローバル変数で定義する。図１１においては、ＡＲＧ２_ＩＮＴ_ＯＵＴ_ｓｕｂ_ｆｕｎｃ１_ｓｔｕｂ１及び_ＡＲＧ３_ＩＮＴ_ＯＵＴ_ｓｕｂ_ｆｕｎｃ１_ｓｔｕｂ１は、関数ｓｕｂ_ｆｕｎｃ１_ｓｔｕｂ１の定義前に、グローバル変数として定義されている。このＡＲＧ２_ＩＮＴ_ＯＵＴ_ｓｕｂ_ｆｕｎｃ１_ｓｔｕｂ１及び_ＡＲＧ３_ＩＮＴ_ＯＵＴ_ｓｕｂ_ｆｕｎｃ１_ｓｔｕｂ１に対して、スタブ関数が呼び出される前に値を設定しておくことで、試験対象関数がスタブ関数を呼び出したときに、利用者が設定した任意の値をスタブ関数の出力の引数の値として返すことが可能である。利用者による出力変数値の設定は、例えば、ＧＵＩ（Graphical User Interface）等の入出力装置１を利用して行うことができる。
【００４８】
本実施の形態によれば、実施の形態１の効果に加えて、スタブ関数の戻り値及び出力引数の値に任意の値を設定することが可能なスタブ関数を効率的に作成することができ、自由度の高い単体試験が可能になる。
【００４９】
実施の形態４．
図１２は、本発明にかかる単体試験支援装置の実施の形態４において、スタブ関数の入力引数に対して、スタブ関数が呼び出された後に、入力引数の値が期待された値に設定されているかどうかを確認可能なスタブ関数の例を示す図である。図１１の関数ｓｕｂ_ｆｕｎｃ１_ｓｔｕｂ２は、図６に示す関数ｓｕｂ_ｆｕｎｃ１を模擬するスタブ関数の一例である。本実施の形態の構成は実施の形態１と基本的に同様である。しかしながら、詳細には、スタブ関数出力値生成部６、テストケース生成部７、及びテストケース記憶部１１を含めなくてもよい。つまり、これらの機能は本実施の形態の実施に必須ではないが、これらの機能と組み合わせて使用することもできる。
【００５０】
図１２に示すように、_ＡＲＧ２_ＩＮＴ_ＩＮ_ｓｕｂ_ｆｕｎｃ１_ｓｔｕｂ２及び_ＡＲＧ３_ＩＮＴ_ＩＮ_ｓｕｂ_ｆｕｎｃ１_ｓｔｕｂ２は、下位関数が呼び出された後に入力引数の値が期待された値であるかどうかを確認するための、プログラムの任意の場所でアクセス可能な変数であり、本図示例で使用するＣ言語の場合はグローバル変数で定義する。図１２においては、_ＡＲＧ２_ＩＮＴ_ＩＮ_ｓｕｂ_ｆｕｎｃ１_ｓｔｕｂ２及び_ＡＲＧ３_ＩＮＴ_ＩＮ_ｓｕｂ_ｆｕｎｃ１_ｓｔｕｂ２は、ｓｕｂ_ｆｕｎｃ１_ｓｔｕｂ２の定義前に、グローバル変数として定義されている。そして、ａｒｇ_ｉの値及び＊ａｒｇ_ｉｏの値を、それぞれ_ＡＲＧ２_ＩＮＴ_ＩＮ_ｓｕｂ_ｆｕｎｃ１_ｓｔｕｂ２及び_ＡＲＧ３_ＩＮＴ_ＩＮ_ｓｕｂ_ｆｕｎｃ１_ｓｔｕｂ２に代入している。この_ＡＲＧ２_ＩＮＴ_ＩＮ_ｓｕｂ_ｆｕｎｃ１_ｓｔｕｂ２及び_ＡＲＧ３_ＩＮＴ_ＩＮ_ｓｕｂ_ｆｕｎｃ１_ｓｔｕｂ２の値をスタブ関数が呼び出された後に確認することで、試験対象関数がスタブ関数を呼び出したときに、適切な値をスタブ関数に渡して呼び出したかどうかを確認することが可能である。
【００５１】
本実施の形態によれば、実施の形態１の効果に加えて、スタブ関数の入力変数の値が適切な値であるかどうかを確認することが可能なスタブ関数を効率的に作成することができ、自由度の高い単体試験が可能となる。
【００５２】
実施の形態５．
図１３は、本発明にかかる単体試験支援装置の実施の形態５において、スタブ関数の戻り値及び出力引数に対して、単体試験中又は単体試験前にスタブ関数の出力値として任意の値が設定可能であり、且つ、スタブ関数の入力引数に対して、スタブ関数が呼び出された後に、入力引数の値が期待された値に設定されているかどうかを確認可能なスタブ関数の例を示す図である。本実施の形態は、実施の形態３と実施の形態４とがそれぞれ生成するスタブ関数の特徴を併せ持ったスタブ関数を生成するものである。図１３の関数ｓｕｂ_ｆｕｎｃ１_ｓｔｕｂ１は、図６に示す関数ｓｕｂ_ｆｕｎｃ１を模擬するｓｕｂ_ｆｕｎｃ１のスタブ関数の一例である。
【００５３】
図１３に示すように、_ＲＥＴ_ＩＮＴ_ｓｕｂ_ｆｕｎｃ１_ｓｔｕｂは、スタブ関数の戻り値を試験対象関数の試験前又は試験中に任意設定するための変数である。また、_ＡＲＧ２_ＩＮＴ_ＯＵＴ_ｓｕｂ_ｆｕｎｃ１_ｓｔｕｂ及び_ＡＲＧ３_ＩＮＴ_ＯＵＴ_ｓｕｂ_ｆｕｎｃ１_ｓｔｕｂは、出力引数の値を試験対象関数の試験前又は試験中に任意設定するため変数である。さらに、_ＡＲＧ１_ＩＮＴ_ＩＮ_ｓｕｂ_ｆｕｎｃ１_ｓｔｕｂ及び_ＡＲＧ３_ＩＮＴ_ＩＮ_ｓｕｂ_ｆｕｎｃ１_ｓｔｕｂは、試験対象関数が呼び出された後に、入力引数の値が期待された値であるかどうかを確認するための変数である。これらは、いずれもプログラムの任意の場所でアクセス可能な変数であり、本図示例で使用するＣ言語の場合はグローバル変数で定義する。本図示例では、これらのグローバル変数は、図１３のｓｕｂ_ｆｕｎｃ１_ｓｔｕｂが定義される前に、グローバル変数として定義されている。
【００５４】
スタブ関数が呼び出される前に、利用者が_ＲＥＴ_ＩＮＴ_ｓｕｂ_ｆｕｎｃ１_ｓｔｕｂに値を設定しておくことで、試験対象関数がスタブ関数を呼び出したときに、利用者が任意に設定した値をスタブ関数の戻り値として返すことが可能である。
【００５５】
また、スタブ関数が呼び出される前に、利用者が_ＡＲＧ２_ＩＮＴ_ＯＵＴ_ｓｕｂ_ｆｕｎｃ１_ｓｔｕｂ及び_ＡＲＧ３_ＩＮＴ_ＯＵＴ_ｓｕｂ_ｆｕｎｃ１_ｓｔｕｂに値を設定しておくことで、試験対象関数がスタブ関数を呼び出したときに、利用者が任意に設定した値をスタブ関数の出力引数の値として返すことが可能である。
【００５６】
さらに、利用者が_ＡＲＧ１_ＩＮＴ_ＩＮ_ｓｕｂ_ｆｕｎｃ１_ｓｔｕｂ及び_ＡＲＧ３_ＩＮＴ_ＩＮ_ｓｕｂ_ｆｕｎｃ１_ｓｔｕｂの値をスタブ関数が呼び出された後に確認することで、試験対象関数がスタブ関数を呼び出したときに、適切な値をスタブ関数に渡して呼び出したかどうかを確認することが可能である。
【００５７】
実施の形態６．
本実施の形態においては、利用者が入力した入力データから、テストケース生成部７が、試験対象関数の入力変数の取り得る値と、スタブ関数の出力変数の取り得る値との組み合わせから、単体試験時におけるテストケースを生成する。スタブ関数生成部５が生成するスタブ関数としては、例えば、実施の形態３、４、５のスタブ関数である。本実施の形態の構成は、実施の形態１の構成と同様であるが、以下では、テストケースの作成を具体的に説明する。利用者は、図１の入出力装置１を介して、試験対象関数ごとに単体試験の入力条件として、（１）スタブ関数の戻り値、（２）スタブ関数の構成に使用されるグローバル変数の値、（３）試験対象関数の入力変数の取り得る値、を入力する。それらの入力データは、図１の入力変数値記憶部１２において、例えば図１５のようなデータ形式で記憶される。図１５に示すように、各スタブ関数は関数ＩＤを持ち（ＣＯＬ１)、関数ＩＤが１〜４の関数は、変数ＩＤ（ＣＯＬ２）と共に、変数名を保持している（ＣＯＬ３）。各変数の値（ＣＯＬ４）は、値ＩＤを付され、利用者が入力した入力データを保持する。また、入力できる値の個数の上限はシステムの記憶容量のスペックに従う。
【００５８】
図１５のデータ形式で記憶されたデータは、図１４に示すフローチャートに従いテストケース情報となる。図１４は、本発明の実施の形態６において、テストケース生成部がテストケースを生成する際の手順を示すフローチャートである。図１４に示すように、先ず、ステップＳＴ２において、入出力変数記憶部１２をオープンし、入力データを読み込む。例えば、図１５のデータ形式で記憶された入力データを読み込む。次に、ステップＳＴ３において、利用者は組合せ方式を入力する。ここで、利用者の入力は、１又は２の数値とし、入力された数値に応じて異なる組み合わせ方式が選択されるものとする。即ち、「１」を入力すると組合せ方式１（足し算方式）が選択され、「２」を入力すると組合せ方式２（全組合せ方式）が選択される。但し、何も入力されない場合は、自動的に２が選択されるものとする。「１」を入力した場合には、ステップＳＴ５において、組合せ方式１（足し算方式）が選択され、「２」を入力した場合又は何も入力しない場合には、ステップＳＴ６において、組合せ方式２（全組合せ方式）が選択される。なお、組合せ方式１及び組合せ方式２の具体的内容については後述する。
【００５９】
システムが記憶しているスタブ関数の総数をｐとすると、図１４のステップＳＴ７のループにより、システムが記憶しているすべてのスタブ関数に対して、各変数のテストケースを生成する。即ち、選択した組合せ方式でテストケースのデータを作成し（ステップＳＴ８）、組合せデータを図１のテストケース記憶部１１に出力し（ステップＳＴ１０）、さらに、図１の入力変数値記憶部１２をクローズして（ステップＳＴ１１）、処理は終了する。
【００６０】
ここで、組合せ方式１（足し算方式）による組合せ処理について説明する。足し算方式では、一つのスタブ関数における各変数の各値が少なくとも一回テストケースに含まれるように組み合わせる。例として、図１５における関数ＩＤが「２」の関数の変数を抜粋したものを図１６に示して説明する。図１６に示すように、各変数の値を値ＩＤが「１」から順に組み合わせる。組み合わせる値がない変数は、すでに組み合わせた値を繰り返し利用する。図１６の下の表においては、変数ＩＤ「３」（変数名Ｖａｌ）と変数ＩＤ「４」（変数名Ａ）に対して、テストケースＩＤが「３」以降では、それぞれ値ＩＤが「１」「２」の値を繰り返し利用している。
【００６１】
次に、組合せ方式２（全組合せ方式）による組合せ処理について説明する。全組合せ方式では、一つのスタブ関数における各変数の各値のすべての組合せが網羅させるように組み合わせる。例として、図１５における関数ＩＤが「２」の関数の変数を抜粋したものを図１７に示して説明する。図１７に示すように、変数ＩＤ「１」（変数名ｙ）の値の個数は６、変数ＩＤ「２」（変数名ｚ）の値の個数は６、変数ＩＤ「３」（変数名Ｖａｌ）の値の個数は２、変数ＩＤ「４」（変数名Ａ）の値の個数は２であり、全組合せは、６×６×２×２＝１４４個のテストケースとなる。このテストケースの一部を、図１８に示す。
【００６２】
本実施の形態によれば、スタブ関数の出力まで含めた単体試験のテストケースの入力条件の作成が効率的になる。なお、その他の効果は、実施の形態１〜実施の形態５の効果と同様である。
【００６３】
なお、特許文献１に開示された従来技術は、引数情報等を含めて入出力スタブを自動生成はするものの、ハードウェアを制御するソフトウェアの開発を支援するソフトウェア開発支援方法であるため、スタブ関数の対象がハードウェアに特化されているという問題があった。また、特許文献２に開示された従来技術においては、テストドライバの中でスタブ関数を記述すると、テスト実行中にスタブ関数の処理を展開して試験を行うが、この展開内容は試験対象関数が呼び出す下位の関数の代替処理コードとしてテストドライバに予め記載されている。そのため、単体試験中にスタブ関数を自動的に実装するものではない。これらの観点から、本発明は、特許文献１及び２に記載されている従来技術とは明確に異なるものである。
【産業上の利用可能性】
【００６４】
以上のように、本発明にかかるソフトウェアの単体試験支援装置は、高級言語で記述されたプログラムのスタブ関数を用いた単体試験に有用である。
【図面の簡単な説明】
【００６５】
【図１】本発明にかかるソフトウェアの単体試験支援装置の実施の形態１の構成を示す図である。
【図２】本発明の実施の形態１における単体試験対象の関数例を示す図である。
【図３】本発明の実施の形態１において、単体試験を行うまでの標準的な作業手順を表すフローチャートである。
【図４】本発明の実施の形態１において、スタブ関数Ｉ／Ｆ分析部による分析手順を表すフローチャートである。
【図５】本発明の実施の形態１におけるＩ／Ｆの分析例を示す図である。
【図６】本発明の実施の形態１において、図２に示す試験対象関数が呼び出している下位関数の一例を示す図である。
【図７】本発明にかかるソフトウェアの単体試験支援装置の実施の形態２における試験対象関数コードの一例を示す図である。
【図８】本発明の実施の形態２における試験対象関数コードの別の一例を示す図である。
【図９】本発明の実施の形態２において、試験対象関数コードからスタブ関数の出力値の取り得る値を抽出する手順を示したフローチャートである。
【図１０】本発明の実施の形態２において、スタブ関数出力値生成部が下位関数のコードからスタブ関数の出力値の取り得る値を抽出する手順を示したフローチャートである。
【図１１】本発明にかかる単体試験支援装置の実施の形態３において、スタブ関数の戻り値及び出力引数に対して、単体試験中又は単体試験前にスタブ関数の出力値として任意の値が設定可能なスタブ関数の例を示す図である。
【図１２】本発明にかかる単体試験支援装置の実施の形態４において、スタブ関数の入力引数に対して、スタブ関数が呼び出された後に、入力引数の値が期待された値に設定されているかどうかを確認可能なスタブ関数の例を示す図である。
【図１３】本発明にかかる単体試験支援装置の実施の形態５が生成するスタブ関数の例を示す図である。
【図１４】実施の形態６において、テストケース生成部がテストケースを生成する際のステップを示すフローチャートである。
【図１５】実施の形態６において、テストケース生成部が入力変数値記憶部から入力データを読み込む際のデータ形式を示す図である。
【図１６】実施の形態６における組合せ方式１において、図１５に示す関数のＩＤが「２」である関数の変数を抜粋した図である。
【図１７】実施の形態６における組合せ方式２において、図２に示す関数のＩＤが「２」である関数の変数を抜粋した図である。
【図１８】実施の形態６における組合せ方式２において、テストケースの一部を示した図である。
【符号の説明】
【００６６】
１  入出力装置
２  システム制御部
３  スタブ関数Ｉ／Ｆ抽出部
４  スタブ関数Ｉ／Ｆ分析部
５  スタブ関数生成部
６  スタブ関数出力値生成部
７  テストケース生成部
８  ソースコード記憶部
９  スタブ関数Ｉ／Ｆ記憶部
１０  スタブ関数記憶部
１１  テストケース記憶部１１
１２  入力変数値記憶部
２０  単体試験支援装置
３８  言語仕様定義部
【図１】
2008140263.tif 000003
【図２】
2008140263.tif 000004
【図３】
2008140263.tif 000005
【図４】
2008140263.tif 000006
【図５】
2008140263.tif 000007
【図６】
2008140263.tif 000008
【図７】
2008140263.tif 000009
【図８】
2008140263.tif 000010
【図９】
2008140263.tif 000011
【図１０】
2008140263.tif 000012
【図１１】
2008140263.tif 000013
【図１２】
2008140263.tif 000014
【図１３】
2008140263.tif 000015
【図１４】
2008140263.tif 000016
【図１５】
2008140263.tif 000017
【図１６】
2008140263.tif 000018
【図１７】
2008140263.tif 000019
【図１８】
2008140263.tif 000020