(57)【特許請求の範囲】
【請求項１】
第一のプログラムと前記第一のプログラムに対する代用のプログラムである第二のプログラムとのそれぞれについてシンボリック実行を行い、
前記シンボリック実行によって出力される、前記第一のプログラムによる返り値の型の種類と、前記第二のプログラムによる返り値の型の種類とについて、相違の有無を判定し、
前記相違が有る場合に、前記第二のプログラムにおいて返り値を返却する分岐先の定義を変更する、
処理をコンピュータに実行させるソフトウェア変更プログラム。
【請求項２】
前記変更する処理は、前記第一のプログラムは返却し、前記第二のプログラムは返却しない型の返り値を返却する分岐先を、前記第二のプログラムに追加する、
ことを特徴とする請求項１記載のソフトウェア変更プログラム。
【請求項３】
前記変更する処理は、前記第二のプログラムは返却し、前記第一のプログラムは返却しない型の返り値を返却する分岐先を、前記第二のプログラムから削除する、
ことを特徴とする請求項１又は２記載のソフトウェア変更プログラム。
【請求項４】
第一のプログラムと前記第一のプログラムに対する代用のプログラムである第二のプログラムとのそれぞれについてシンボリック実行を行う実行部と、
前記シンボリック実行によって出力される、前記第一のプログラムによる返り値の型の種類と、前記第二のプログラムによる返り値の型の種類とについて、相違の有無を判定する判定部と、
前記相違が有る場合に、前記第二のプログラムにおいて返り値を返却する分岐先の定義を変更する変更部と、
を有することを特徴とするソフトウェア変更装置。
【請求項５】
第一のプログラムと前記第一のプログラムに対する代用のプログラムである第二のプログラムとのそれぞれについてシンボリック実行を行い、
前記シンボリック実行によって出力される、前記第一のプログラムによる返り値の型の種類と、前記第二のプログラムによる返り値の型の種類とについて、相違の有無を判定し、
前記相違が有る場合に、前記第二のプログラムにおいて返り値を返却する分岐先の定義を変更する、
処理をコンピュータが実行するソフトウェア変更方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、ソフトウェア変更プログラム、ソフトウェア変更装置、及びソフトウェア変更方法に関する。
【背景技術】
【０００２】
プログラムのシンボリック実行とは、特別な実行基盤上において、プログラム中の変数に具体的な値を代入せずに、変数を記号（シンボル値）として扱ってプログラムを実行することをいう。
【０００３】
図１は、シンボリック実行の対象のプログラムの処理手順の一例を示す図である。図１には、ｍｅｔｈｏｄ（ｉｎｔ  ａ、ｉｎｔ  ｂ）というメソッドの処理手順が示されている。すなわち、変数ａ及び変数ｂの値は、当該メソッドの引数として与えられる。シンボリック実行では、プログラムのソースコードが参照されるが、図１では、便宜上、ソースコードに記述されている処理手順がフローチャートによって示されている。
【０００４】
図２は、シンボリック実行を説明するための図である。図２に付されているステップ番号は、図１に示されているステップ番号に対応する。
【０００５】
シンボリック実行では、図２に示されるように、実行可能な全てのパスが抽出される。例えば、ステップＳ１１における分岐において「ａ！＝０」が満たされたと仮定されて、ステップＳ１２に進む。ステップＳ１２では「ａ＞５」が満たされたと仮定されて、ステップＳ１３に進む。なお、各分岐条件において満たされた状態は、記憶されている。すなわち、ステップＳ１３の時点において「ａ！＝０」かつ「ａ＞５」であることが記憶されている。したがって、ステップＳ１３において「ａ＝０」が満たされることは無いと判定され、ステップＳ１４は実行できないことが検出される。一方、「ａ！＝０」は満たされるため、ステップＳ１５が実行される。続いて、ステップＳ２１において「ｂ＜＝０」が満たされると仮定されて、ステップＳ２２が実行される。以上で一つのパスが抽出される。
【０００６】
その後、例えば、満たされたことが仮定されていない分岐先が残っている分岐のうちの末端の分岐まで戻り、他方の分岐条件が満たされた状態で、当該分岐以降の処理が実行され、新たなパスが抽出される。具体的には、ステップＳ２１において「ｂ＞０」が満たされたと仮定されて、ステップＳ２３及びＳ２４が実行される。
【０００７】
更に、ステップＳ１２において「ａ＜＝１５」が満たされたと仮定されて、ステップＳ１６以降が実行される。また、ステップＳ１１において「ａ＝０」が満たされたと仮定されて、ステップＳ１８以降が実行される。その結果、６通りのパスが実行可能なパスとして抽出される。以上のようなシンボリック実行により、例えば、図３に示されるような出力情報が得られる。
【０００８】
図３は、シンボリック実行の出力情報の一例を示す図である。図３に示されるように、シンボリック実行では、抽出されたパスごとに、パス条件及び発生エラー等が出力される。なお、「Ｎｏ．」の列は、便宜的に付加されている。
【０００９】
パス条件は、当該パスを通るために変数が取り得る値である。パス条件において、「∧」は、かつ（ＡＮＤ）を意味する。発生エラーは、当該パスにおいてエラーが発生する場合に、その内容を示す情報である。例えば、１番目のパス条件は、「（ａ＝＝０）∧（ｂ＞０）」である。この場合にはステップＳ２３が実行されるが、ステップＳ２３では、ａによる除算が定義されている。したがって、０除算のエラーが発生する。また、５番目のパス条件における（ｂ＋１＜＝０）の項や、６番目のパス条件における（ｂ＋１＞０）の項のように、当該パス中における変数の更新後の状態（ここでは、ステップＳ１６の実行後の状態）に対する条件についても、パス条件に含まれる。なお、シンボリック実行では、パスごとに返り値の型も出力可能であるが、図３では、便宜上、省略されている。
【００１０】
このような出力情報に基づいて、ユーザは、例えば、図３のテスト入力の列に示されるように、テスト時における各変数への入力値を作成することができる。すなわち、それぞれのパスのパス条件を満たす値が、各変数に対する入力値とされる。その結果、プログラム内において実行可能なパスを網羅的にテストすることができる。
【００１１】
他方において、プログラムのテストには、スタブと呼ばれるプログラムが利用される場合が有る。スタブとは、テスト対象のプログラムから呼び出される本来のプログラム（以下、「オリジナルプログラム」という。）の代用プログラムである。例えば、テスト対象のプログラムとオリジナルプログラムとの開発が並行して行われる場合や、オリジナルプログラムを利用するにはデータベースの構築が必要とれる場合等において、スタブの利用は効果的である。
【００１２】
従来、オリジナルプログラムのインタフェース仕様に基づいて、スタブを自動生成する技術が有る。インタフェース仕様とは、引数及び返り値のデータ型をいう。
【００１３】
図４は、インタフェース仕様のみに基づくスタブの自動生成を説明するための図である。図４において左側は、インタフェース仕様の一例を示す。右側は、インタフェース仕様に基づいて自動生成されるスタブの一例を示す。インタフェース仕様に基づくスタブの自動生成技術においては、例えば、返り値のデータ型に従った値を返却するようにスタブが生成される。
【先行技術文献】
【特許文献】
【００１４】
【特許文献１】特開平６−２５０８８４号公報
【特許文献２】特開２０１２−６８８６９号公報
【発明の概要】
【発明が解決しようとする課題】
【００１５】
しかしながら、インタフェース仕様に基づくスタブの自動生成技術では、オリジナルプログラムの内部ロジックは考慮されない。したがって、インタフェース仕様には現れない型の返り値をオリジナルプログラムが返却する可能性が有る場合、インタフェース仕様に基づくスタブの自動生成技術では、オリジナルプログラムの返り値の型の種類を網羅したスタブを生成するのは困難である。
【００１６】
図５は、インタフェース仕様に基づくスタブの自動生成技術では網羅できないオリジナルプログラムの返り値の型の一例を説明するための図である。図５において左側のツリー構造は、オリジナルメソッドがとりうるパスを示す。右側のツリー構造は、スタブメソッドがとりうるパスを示す。
【００１７】
左側のツリー構造によれば、オリジナルメソッドは、変数ｊの値が１００００以下である場合、値がｎｕｌｌでないＬｉｓｔ型の変数ａｒｒａｙを返却するときと、ｎｕｌｌを返却するときとが有ることが示されている。また、変数ｊの値が１００００を超える場合は、Ｅｘｃｅｐｔｉｏｎ型の例外がスローされ、ログが記録されることが示されている。
【００１８】
右側のツリー構造によれば、スタブメソッドは、値がｎｕｌｌでないＬｉｓｔ型の変数ａｒｒａｙを返却する場合と、ｎｕｌｌを返却する場合とが有ることが示されている。しかしながら、スタブメソッドには、Ｅｘｃｅｐｔｉｏｎ型の返り値を返却するパスは無い。インタフェース仕様では、例外のスロー可能性を知るのは困難なためである。
【００１９】
スタブの振る舞いは、スタブを利用するプログラムのテストの妥当性に影響する。特に、スタブを利用してシンボリック実行が行われる場合、スタブによるオリジナルプログラムの返り値の型の種類の網羅度は、シンボリック実行によって抽出されるパスの精度に大きく影響する。
【００２０】
そこで、一側面では、スタブによる返り値の型の種類の網羅度の向上を支援することを目的とする。
【課題を解決するための手段】
【００２１】
一つの案では、ソフトウェア変更プログラムは、第一のプログラムと前記第一のプログラムに対する代用のプログラムである第二のプログラムとのそれぞれについてシンボリック実行を行い、前記シンボリック実行によって出力される、前記第一のプログラムによる返り値の型の種類と、前記第二のプログラムによる返り値の型の種類とについて、相違の有無を判定し、前記相違が有る場合に、前記第二のプログラムにおいて返り値を返却する分岐先の定義を変更する、処理をコンピュータに実行させる。
【発明の効果】
【００２２】
一態様によれば、スタブによる返り値の型の種類の網羅度の向上を支援することができる。
【図面の簡単な説明】
【００２３】
【図１】シンボリック実行の対象のプログラムの処理手順の一例を示す図である。
【図２】シンボリック実行を説明するための図である。
【図３】シンボリック実行の出力情報の一例を示す図である。
【図４】インタフェース仕様のみに基づくスタブの自動生成を説明するための図である。
【図５】インタフェース仕様に基づくスタブの自動生成技術では網羅できないオリジナルプログラムの返り値の型の一例を説明するための図である。
【図６】本発明の実施の形態におけるスタブ編集装置のハードウェア構成例を示す図である。
【図７】本発明の実施の形態におけるスタブ編集装置の機能構成例を示す図である。
【図８】スタブの編集処理の処理手順の一例を説明するためのフローチャートである。
【図９】スタブ及びオリジナルに対するシンボリック実行の出力情報の一例を示す図である。
【図１０】コードテンプレートの一例を示す図である。
【図１１】コードテンプレートにおいて必用な部分の一例を示す図である。
【図１２】コードテンプレートからの必用な部分の抽出結果の一例を示す図である。
【図１３】スタブに対するコードテンプレートの適用例を示す図である。
【図１４】返り値の型の種類の追加後のスタブの一例を示す図である。
【発明を実施するための形態】
【００２４】
以下、図面に基づいて本発明の実施の形態を説明する。図６は、本発明の実施の形態におけるスタブ編集装置のハードウェア構成例を示す図である。図６のスタブ編集装置１０は、それぞれバスＢで相互に接続されているドライブ装置１００、補助記憶装置１０２、メモリ装置１０３、ＣＰＵ１０４、インタフェース装置１０５、表示装置１０６、及び入力装置１０７等を有する。
【００２５】
スタブ編集装置１０での処理を実現するプログラムは、記録媒体１０１によって提供される。プログラムを記録した記録媒体１０１がドライブ装置１００にセットされると、プログラムが記録媒体１０１からドライブ装置１００を介して補助記憶装置１０２にインストールされる。但し、プログラムのインストールは必ずしも記録媒体１０１より行う必要はなく、ネットワークを介して他のコンピュータよりダウンロードするようにしてもよい。補助記憶装置１０２は、インストールされたプログラムを格納すると共に、必要なファイルやデータ等を格納する。
【００２６】
メモリ装置１０３は、プログラムの起動指示があった場合に、補助記憶装置１０２からプログラムを読み出して格納する。ＣＰＵ１０４は、メモリ装置１０３に格納されたプログラムに従ってスタブ編集装置１０に係る機能を実現する。インタフェース装置１０５は、ネットワークに接続するためのインタフェースとして用いられる。表示装置１０６はプログラムによるＧＵＩ（Graphical User Interface）等を表示する。入力装置１０７はキーボード及びマウス等であり、様々な操作指示を入力させるために用いられる。
【００２７】
なお、記録媒体１０１の一例としては、ＣＤ−ＲＯＭ、ＤＶＤディスク、又はＵＳＢメモリ等の可搬型の記録媒体が挙げられる。また、補助記憶装置１０２の一例としては、ＨＤＤ（Hard Disk Drive）又はフラッシュメモリ等が挙げられる。記録媒体１０１及び補助記憶装置１０２のいずれについても、コンピュータ読み取り可能な記録媒体に相当する。
【００２８】
なお、スタブ編集装置１０は、表示装置１０６及び入力装置１０７を有していなくてもよい。例えば、スタブ編集装置１０は、ネットワークを介してスタブ編集装置１０に接続される端末から、遠隔操作されてもよい。
【００２９】
図７は、本発明の実施の形態におけるスタブ編集装置の機能構成例を示す図である。図７において、スタブ編集装置１０は、シンボリック実行部１１、比較部１２、及びスタブ編集部１３等を有する。これら各部は、スタブ編集装置１０にインストールされたプログラムが、ＣＰＵ１０４に実行させる処理により実現される。スタブ編集装置１０は、また、オリジナル記憶部１４、スタブ記憶部１５、及びテンプレート記憶部１６等を利用する。これら各記憶部は、補助記憶装置１０２、又はスタブ編集装置１０にネットワークを介して接続される記憶装置等を用いて実現可能である。
【００３０】
オリジナル記憶部１４は、オリジナルプログラムを記憶する。本実施の形態において、オリジナルプログラムとは、スタブによって代用されるプログラムをいう。以下、オリジナルプログラムを、単に「オリジナル」という。スタブ記憶部１５は、スタブを記憶する。スタブとは、例えば、オリジナルのメソッド等を呼び出すプログラムのテスト等において、オリジナルの代わりに利用されるプログラムをいう。
【００３１】
シンボリック実行部１１は、オリジナルと、当該オリジナルに対応するスタブとのそれぞれについて、シンボリック実行を行う。シンボリック実行とは、図１〜図３において説明したように、プログラム中の変数に具体的な値を代入せずに、変数を記号（シンボル値）として扱ってプログラムを実行することをいう。シンボリック実行によって、オリジナル及びスタブのそれぞれに関して、実行可能なパスごとに、パス条件及び返り値（戻り値）の型（データ型）等が出力される。
【００３２】
比較部１２は、オリジナルに関するシンボリック実行の出力情報と、スタブに関するシンボリック実行の出力情報とを比較して、相違点の有無を判定する。例えば、比較部１２は、オリジナルの返り値の型の種類と、スタブの返り値の型の種類との間における相違点の有無を判定する。
【００３３】
スタブ編集部１３は、比較部１２によって相違点が有ると判定された場合に、当該相違点を解消するように、スタブを編集（変更）する。スタブの編集には、テンプレート記憶部１６に記憶されているコードテンプレートが利用される。コードテンプレートは、スタブの返り値の型の種類を増加させるために予め用意された雛形としてのソースコードである。
【００３４】
以下、スタブ編集装置１０が実行する処理手順について説明する。図８は、スタブの編集処理の処理手順の一例を説明するためのフローチャートである。
【００３５】
ステップＳ１０１において、シンボリック実行部１１は、スタブとオリジナルとのそれぞれについて、シンボリック実行を行う。処理対象のスタブは、スタブ記憶部１５から取得される。処理対象のオリジナルは、オリジナル記憶部１４から取得される。各記憶部から取得されるスタブ又はオリジナルは、例えば、ユーザによる入力に基づいて特定されてもよい。例えば、ユーザによって、スタブ及びオリジナルのファイル名が入力されてもよい。又は、スタブ及びオリジナルに対する共通の識別情報が入力されてもよい。
【００３６】
図９は、スタブ及びオリジナルに対するシンボリック実行の出力情報の一例を示す図である。図９において、スタブ２０及びオリジナル３０は、ステップＳ１０１においてシンボリック実行の対象とされる、メソッドＡに関するスタブ又はオリジナルの一例である。
【００３７】
スタブ２０は、オリジナル３０に対するスタブである。スタブ２０は、ｉｆ２２文とｅｌｓｅ文２４とを一組とする一つの分岐条件を含む。当該分岐条件が満たされる場合、記述２１においてｎｕｌｌが代入された、Ｌｉｓｔ型の変数ｌｉｓｔの値（つまり、ｎｕｌｌ）が、ｒｅｔｕｒｎ文２３によって返却される。当該分岐条件が満たされない場合、記述２４においてｎｕｌｌ以外の値が代入された変数ｌｉｓｔの値が、ｒｅｔｕｒｎ文２６によって返却される。なお、当該分岐条件は、変数＿ｎｕｌｌＬｉｓｔの値がｔｒｕｅである場合に満たされる。変数＿ｎｕｌｌＬｉｓｔは、ｔｒｕｅ又はｆａｌｓｅの値をとる、真偽値型（ｂｏｏｌｅａｎ型）の変数であり、例えば、メソッドＡを呼び出すドライバプログラム内において、スタブ２０内からも参照可能なように定義されている。以下、変数＿ｎｕｌｌＬｉｓｔのように、分岐条件の判定に用いられる変数を、「シンボリック変数」という。シンボリック変数は、シンボリック実行時のパス条件を構成する変数であるともいえる。なお、スタブ２０は、例えば、メソッドＡのインタフェース仕様に基づいて、人手によって作成されてもよいし、公知の技術を利用して自動生成されてもよい。いずれの場合であっても、スタブ２０は、変数＿ｎｕｌｌＬｉｓｔの値に基づく分岐の分岐先ごとに、返り値を返却するように作成される。
【００３８】
このようなスタブ２０に対して、ステップＳ１０１においてシンボリック実行が行われると、例えば、テーブルＴ２０に示されるような情報が出力される。すなわち、シンボリック変数＿ｎｕｌｌＬｉｓｔがｔｕｒｅである場合とそうでない場合との２通りのパス条件が出力され、パス条件ごとに、返り値の型がＬｉｓｔ型であることが出力される。
【００３９】
一方、オリジナル３０は、ｉｆ文３２による一つの分岐条件を含む。当該分岐条件が満たされる場合、ｔｈｒｏｗ文３３によってＥｘｃｅｐｔｉｏｎ型の例外がスローされ、当該分岐条件が満たされない場合、記述３１においてメソッドｘｘ．ｇｅｔＬｉｓｔ（）の返り値が代入された、Ｌｉｓｔ型の変数ｌｉｓｔの値が、ｒｅｔｕｒｎ文３４によって返却される。なお、当該分岐条件は、メソッドｘｘ．ｇｅｔＭａｘＩｎｄｅｘ（）の返り値が１００００を超える場合に満たされる。ｘｘは、ＸＸＸＸＣｌａｓｓ型の変数である。すなわち、オリジナル３０においては、ＸＸＸＸＣｌａｓｓのｇｅｔＭａｘＩｎｄｅｘメソッドの返り値が、シンボリック変数に相当する。
【００４０】
このようなオリジナル３０に対して、ステップＳ１０１においてシンボリック実行が行われると、例えば、テーブルＴ３０に示されるような情報が出力される。すなわち、ＸＸＸＸＣｌａｓｓ．ｇｅｔＭａｘＩｎｄｅｘ（）の返り値が１００００以下である場合と、１００００を超える場合との２通りのパス条件が出力される。また、ＸＸＸＸＣｌａｓｓ．ｇｅｔＭａｘＩｎｄｅｘ（）の返り値が１００００以下である場合の返り値の型は、Ｌｉｓｔ型であり、１００００を超える場合の返り値の型は、Ｅｘｃｅｐｔｉｏｎ型であることが出力される。
【００４１】
続いて、比較部１２は、スタブ２０に対するシンボリック実行の出力情報が示す返り値の型の種類と、オリジナル３０に対するシンボリック実行の出力情報とを比較して、双方の間における相違点の有無を判定する（Ｓ１０２）。
【００４２】
例えば、テーブルＴ２０において、返り値の型はＬｉｓｔ型の１種類である。一方、テーブルＴ３０において、返り値の型の種類は、Ｌｉｓｔ型とＥｘｃｅｐｔｉｏｎ型との２種類である。すなわち、オリジナル３０は、スタブ２０によっては返却されないＥｘｃｅｐｔｉｏｎ型の返り値を返却する。したがって、スタブ２０の返り値の型と、オリジナルの返り値の型との間には相違点が有ると判定される。
【００４３】
このように、本実施の形態では、スタブ２０とオリジナル３０との間における、返り値の型の種類の相違点を検出するために、シンボリック実行が利用される。
【００４４】
該当する相違点が無い場合（Ｓ１０２でＮｏ）、スタブ２０を修正する必用は無いため、図８の処理は終了する。該当する相違点が有る場合（Ｓ１０２でＹｅｓ）、スタブ編集部１３は、変数Ｎに対して、オリジナルの返り値の型の種類の数を代入し、変数Ｍに対して、スタブの返り値の種類の数を代入する（Ｓ１０３）。ここでは、オリジナル３０は、２種類の型の返り値を返却するため、変数Ｎには２が代入される。また、スタブ２０は、１種類の型の返り値を返却するため、変数Ｍには１が代入される。
【００４５】
続いて、スタブ編集部１３は、オリジナル３０には無い種類の型の返り値が、スタブ２０の返り値の型の種類に含まれているか否かを判定する（Ｓ１０４）。例えば、オリジナルの返り値の型の種類が、Ａ、Ｂ、及びＣであり、スタブの返り値の型の種類が、Ａ及びＤである場合、Ｄについては、オリジナルには無い。このような場合、ステップＳ１０４の判定は、肯定的なものとなる。
【００４６】
オリジナル３０には無い種類の型の返り値が、スタブ２０の返り値の型の種類に含まれていない場合（Ｓ１０４でＮｏ）、ステップＳ１０７に進む。本実施の形態では、該当する返り値は無いため、ステップＳ１０７に進む。オリジナル３０には無い種類の型の返り値が、スタブ２０の返り値の型の種類に含まれていない場合（Ｓ１０４でＹｅｓ）、スタブ編集部１３は、スタブ２０から、該当する返り値を返却する分岐先に関する定義を削除する（Ｓ１０５）。この際、当該分岐先の削除によって、プログラミング言語の文法違反に該当する箇所が発生する場合は、当該箇所が修正される。例えば、先頭の分岐先に対応するｉｆ文が削除された場合、当該ｉｆ文に対応するｅｌｓｅ  ｉｆ文が、ｉｆ文に変更される。続いて、スタブ編集部１３は、ステップＳ１０５において削除された返り値の種類の数を、変数Ｍの値から減ずる（Ｓ１０６）。ここで減ぜられる値は、削除された分岐先の数ではなく、削除された分岐先において返却される返り値の型の種類の数である。例えば、２つの分岐先が削除され、各分岐先における返り値の型が同じであれば、変数Ｍからは１が減ぜられる。
【００４７】
続いて、スタブ編集部１３は、変数Ｎの値が、変数Ｍの値より大きいか否かを判定する（Ｓ１０７）。すなわち、オリジナル３０の返り値の型の種類の方が、スタブ２０の返り値の型の種類より多いか否かが判定される。変数Ｎの値が、変数Ｍの値以下である場合（Ｓ１０７でＮｏ）、図１の処理は終了する。この場合、ステップＳ１０５の実行により、スタブ２０とオリジナル３０との間における、返り値の型の種類の相違点は解消されたからである。
【００４８】
変数Ｎの値が変数Ｍの値より大きい場合（Ｓ１０７でＹｅｓ）、スタブ編集部１３は、スタブ２０の返り値の型の種類を増加させるため、テンプレート記憶部１６に記憶されているコードテンプレートから、必用な部分を抽出する（Ｓ１０８）。
【００４９】
図１０は、コードテンプレートの一例を示す図である。図１０において、コードテンプレート５０は、ｎ個のシンボル変数（シンボル変数１〜シンボル変数ｎ）の値の組み合わせ分の分岐先を含む。シンボル変数の値の組み合わせとは、各シンボル変数の値が真である場合と偽である場合とに関して形成される組み合わせをいう。コードテンプレート５０では、分岐先ごとに、相互に異なる返り値（返り値１〜返り値ｚ）が返却されるように定義されている。なお、ｎの値は、例えば、テスト対象の各スタブに対応する各オリジナルの返り値の種類の数の最大値に基づいて決定されてもよい。例えば、テスト対象の各スタブに対応する各オリジナルの返り値の最大値が、５であれば、５個のシンボル変数（シンボル変数１〜シンボル変数５）の値の組み合わせ分の分岐先を含むコードテンプレートが作成されてもよい。
【００５０】
ステップ１０５における必用な部分とは、本実施の形態では、図１１に示される部分に相当する。
【００５１】
図１１は、コードテンプレートにおいて必用な部分の一例を示す図である。コードテンプレート５０において必用な部分とは、シンボリック変数Ｎまでの組み合わせの部分である。本実施の形態において、変数Ｎの値（すなわち、オリジナル３０の返り値の型の種類の数）は２である。したがって、シンボリック変数２までの組み合わせの部分（すなわち、破線Ｃで囲まれた部分）が必用な部分となる。但し、破線Ｌで囲まれた部分までで、シンボリック変数１及び２の値に関して全ての組み合わせが出現している。換言すれば、シンボリック変数１及び２の値の組み合わせに関して、破線Ｌで囲まれていない部分は、既に出現している組み合わせのいずれかと同じ組み合わせである。したがって、破線Ｌで囲まれていない部分は、不要な部分となる。すなわち、返り値の種類に関しては、返り値Ｎ＋１番目まで（すなわち、返り値３まで）が必用な部分とされる。なお、コードテンプレート５０は、シンボル変数１から順に、全ての値の組み合わせが先に出現するように作成されている。
【００５２】
上記より、ステップＳ１０８では、破線Ｃ及び破線Ｌによって囲まれた部分が抽出される。
【００５３】
図１２は、コードテンプレートからの必用な部分の抽出結果の一例を示す図である。図１２に示されるコードテンプレート６０は、コードテンプレート５０から、破線Ｃ及び破線Ｌによって囲まれた部分が抽出された結果である。
【００５４】
続いて、スタブ編集部１３は、スタブ２０に対してコードテンプレート６０を適用して、オリジナル３０に対して不足している返り値の型を返却するための分岐先をスタブ２０に追加する（Ｓ１０９）。
【００５５】
図１３は、スタブに対するコードテンプレートの適用例を示す図である。図１３において、破線で囲まれた部分が、コードテンプレート６０に基づいて追加された部分である。
【００５６】
まず、スタブ２０における各分岐における各シンボリック変数に関する条件が、コードテンプレート６０に対するシンボリック変数１から順に当てはめられる。本実施の形態では、当該条件は、スタブ２０のｉｆ文２２における「＿ｎｕｌｌＬｉｓｔ＝＝ｎｕｌｌ」である。当該条件が、コードテンプレート６０のシンボリック変数１に対して当てはめられる。この際、シンボル変数１の否定（「！シンボル変数１」）に対しては、「＿ｎｕｌｌＬｉｓｔ＝＝ｎｕｌｌ」の否定である「＿ｎｕｌｌＬｉｓｔ！＝ｎｕｌｌ」が当てはめられる。また、スタブ２０の各分岐先におけるｒｅｔｕｒｎ文が、分岐先の順に、コードテンプレート６０のｒｅｔｕｒｎ文に当てはめられる。具体的には、スタブ２０のｒｅｔｕｒｎ文２３、ｒｅｔｕｒｎ文２６が、コードテンプレート６０のｒｅｔｕｒｎ文６１、ｒｅｔｕｒｎ文６２にそれぞれ当てはめられる。
【００５７】
当てはめの後、スタブ２０と、当てはめが行われたコードテンプレート６０との差分が、スタブ２０に転記される。当該差分が、図１３において破線で囲まれた部分である。スタブ２０に対してコードテンプレート６０が適用されることにより、スタブ２０の分岐先が２つから３つに増加する。その結果、新たな返り値を返却するための分岐先が確保される。図１３では、最後の分岐先が、新たな型の返り値を返却するための分岐先に相当する。なお、スタブ２０に対するコードテンプレート６０の適用は、上記以外の手順又は方法によって行われてもよい。
【００５８】
続いて、スタブ編集部１３は、図１３のスタブ２０において、コードテンプレート６０から転記されたｒｅｔｕｒｎ文に関して、式の値を、オリジナル３０とスタブ２０との相違点に係る型（Ｅｘｃｅｐｔｉｏｎ型）の返り値に置き換える（Ｓ１１０）。図１３では、最後の分岐先のｒｅｔｕｒｎ文の式の値が、Ｅｘｃｅｐｔｉｏｎ型の返り値に置き換えられる。その結果、スタブ２０の返り値の型の種類が増加し、返り値の型の種類に関して、オリジナル３０との相違点を解消することができる。
【００５９】
図１４は、返り値の型の種類の追加後のスタブの一例を示す図である。図１４において、破線で囲まれた部分が、ステップＳ１１０において置換された部分である。すなわち、当該部分は、「返り値３」から「Ｅｘｃｅｐｔｉｏｎ（）」に置換されている。
【００６０】
なお、スタブ２０に対する分岐及び返り値の型の追加には、コードテンプレート５０が利用されなくてもよい。例えば、スタブ編集部１３のプログラムロジック内に、コードテンプレート５０に相当する知識が組み込まれていてもよい。
【００６１】
上述したように、本実施の形態によれば、オリジナルとスタブとのそれぞれに対するシンボリック実行によって、それぞれの返り値の型の種類を自動的に得ることができ、双方の種類が相互に異なる場合に、異なる点を解消するためのスタブの変更を自動的に行うことができる。したがって、スタブによる返り値の型の種類の網羅度の向上を支援することができる。
【００６２】
なお、本実施の形態は、初版のオリジナルに対応させるためのスタブの修正のみならず、オリジナルがバージョンアップされた場合に、スタブによる返り値の型の種類について、バージョンアップ後のオリジナルに対する過不足を解消させることを目的として実施されてもよい。
【００６３】
なお、本実施の形態において、スタブ編集装置１０は、ソフトウェア変更装置の一例である。シンボリック実行部１１は、実行部の一例である。比較部１２は、判定部の一例である。スタブ編集部１３は、変更部の一例である。
【００６４】
以上、本発明の実施例について詳述したが、本発明は斯かる特定の実施形態に限定されるものではなく、特許請求の範囲に記載された本発明の要旨の範囲内において、種々の変形・変更が可能である。
【００６５】
以上の説明に関し、更に以下の項を開示する。
（付記１）
第一のプログラムと前記第一のプログラムに対する代用のプログラムである第二のプログラムとのそれぞれについてシンボリック実行を行い、
前記シンボリック実行によって出力される、前記第一のプログラムによる返り値の型の種類と、前記第二のプログラムによる返り値の型の種類とについて、相違の有無を判定し、
前記相違が有る場合に、前記第二のプログラムにおいて返り値を返却する分岐の定義を変更する、
処理をコンピュータに実行させるソフトウェア変更プログラム。
（付記２）
前記変更する処理は、前記第一のプログラムは返却し、前記第二のプログラムは返却しない型の返り値を返却する分岐先を、前記第二のプログラムに追加する、
ことを特徴とする付記１記載のソフトウェア変更プログラム。
（付記３）
前記変更する処理は、前記第二のプログラムは返却し、前記第一のプログラムは返却しない型の返り値を返却する分岐先を、前記第二のプログラムから削除する、
ことを特徴とする付記１又は２記載のソフトウェア変更プログラム。
（付記４）
第一のプログラムと前記第一のプログラムに対する代用のプログラムである第二のプログラムとのそれぞれについてシンボリック実行を行う実行部と、
前記シンボリック実行によって出力される、前記第一のプログラムによる返り値の型の種類と、前記第二のプログラムによる返り値の型の種類とについて、相違の有無を判定する判定部と、
前記相違が有る場合に、前記第二のプログラムにおいて返り値を返却する分岐の定義を変更する変更部と、
を有することを特徴とするソフトウェア変更装置。
（付記５）
前記変更部は、前記第一のプログラムは返却し、前記第二のプログラムは返却しない型の返り値を返却する分岐先を、前記第二のプログラムに追加する、
ことを特徴とする付記４記載のソフトウェア変更装置。
（付記６）
前記変更部は、前記第二のプログラムは返却し、前記第一のプログラムは返却しない型の返り値を返却する分岐先を、前記第二のプログラムから削除する、
ことを特徴とする付記４又は５記載のソフトウェア変更装置。
（付記７）
第一のプログラムと前記第一のプログラムに対する代用のプログラムである第二のプログラムとのそれぞれについてシンボリック実行を行い、
前記シンボリック実行によって出力される、前記第一のプログラムによる返り値の型の種類と、前記第二のプログラムによる返り値の型の種類とについて、相違の有無を判定し、
前記相違が有る場合に、前記第二のプログラムにおいて返り値を返却する分岐の定義を変更する、
処理をコンピュータが実行するソフトウェア変更方法。
（付記８）
前記変更する処理は、前記第一のプログラムは返却し、前記第二のプログラムは返却しない型の返り値を返却する分岐先を、前記第二のプログラムに追加する、
ことを特徴とする付記７記載のソフトウェア変更方法。
（付記９）
前記変更する処理は、前記第二のプログラムは返却し、前記第一のプログラムは返却しない型の返り値を返却する分岐先を、前記第二のプログラムから削除する、
ことを特徴とする付記７又は８記載のソフトウェア変更方法。
【符号の説明】
【００６６】
１０          スタブ編集装置
１１          シンボリック実行部
１２          比較部
１３          スタブ編集部
１４          オリジナル記憶部
１５          スタブ記憶部
１６          テンプレート記憶部
１００        ドライブ装置
１０１        記録媒体
１０２        補助記憶装置
１０３        メモリ装置
１０４        ＣＰＵ
１０５        インタフェース装置
１０６        表示装置
１０７        入力装置
Ｂ            バス
【図１】
0006390217.tif 000002
【図２】
0006390217.tif 000003
【図３】
0006390217.tif 000004
【図４】
0006390217.tif 000005
【図５】
0006390217.tif 000006
【図６】
0006390217.tif 000007
【図７】
0006390217.tif 000008
【図８】
0006390217.tif 000009
【図９】
0006390217.tif 000010
【図１０】
0006390217.tif 000011
【図１１】
0006390217.tif 000012
【図１２】
0006390217.tif 000013
【図１３】
0006390217.tif 000014
【図１４】
0006390217.tif 000015