(57)【特許請求の範囲】
【請求項１】
変更前プログラムに対して実施された複数のテストケースから、変更後プログラムに対して実施すべきテストケースである重要テストケースを選択するテストケース選択装置であって、
前記変更前プログラムに含まれる変更前対象関数と前記変更後プログラムに含まれる関数であり前記変更前対象関数に対応する関数であり前記変更前対象関数と一致しない関数である変更後対象関数との組である対象組を１つ以上示す対象組リストから、前記変更前対象関数と前記変更後対象関数との両方に同じ入力が与えられた場合に前記変更後対象関数の出力が前記変更前対象関数の出力と一致するという条件を満たさない対象組である不等価組を抽出する不等価組抽出部と、
前記複数のテストケースから、前記不等価組に含まれる変更前対象関数が呼び出されるテストケースを前記重要テストケースとして選択するテストケース選択部と
を備えるテストケース選択装置。
【請求項２】
前記テストケース選択装置は、前記対象組リストを生成する対象組リスト生成部を備え、
前記対象組リスト生成部は、
前記変更前プログラムに含まれる１つ以上の変更前関数の中に前記変更後プログラムに含まれる変更後関数に対応する変更前関数が有るか判定し、
前記１つ以上の変更前関数の中に前記変更後関数に対応する変更前関数が有る場合、前記変更後関数のソースコードを前記変更後関数に対応する変更前関数のソースコードと比較し、
前記変更後関数のソースコードが前記変更後関数に対応する変更前関数のソースコードと一致しない場合、前記変更後関数に対応する変更前関数を前記変更前対象関数として含み前記変更後関数を前記変更後対象関数として含む対象組を前記対象組リストに登録する
請求項１に記載のテストケース選択装置。
【請求項３】
前記不等価組抽出部は、前記変更前対象関数において成り立つ変更前論理式を生成し、前記変更後対象関数において成り立つ変更後論理式を生成し、前記変更前論理式と前記変更後論理式とを用いて前記対象組が前記不等価組であるか判定する
請求項１に記載のテストケース選択装置。
【請求項４】
前記テストケース選択部は、前記変更前プログラムが実行された場合に呼び出される変更前関数をテストケース毎に示す呼び出しリストを用いて、前記重要テストケースを選択する
請求項１に記載のテストケース選択装置。
【請求項５】
前記テストケース選択部は、前記呼び出しリストに示される変更前関数のうち対象のテストケースに対応する変更前関数が前記不等価組に含まれる前記変更前対象関数である場合、前記対象のテストケースが前記重要テストケースであると判定する
請求項４に記載のテストケース選択装置。
【請求項６】
前記テストケース選択装置は、前記呼び出しリストを生成する呼び出しリスト生成部を備え、
前記呼び出しリスト生成部は、
それぞれの変更前関数に呼び出しフラグを更新するフラグ更新命令を追加し、
それぞれの変更前関数に前記フラグ更新命令が追加された後の変更前プログラムをテストケース毎に実行し、
更新された呼び出しフラグに対応する変更前関数をテストケース毎に前記呼び出しリストに登録する
請求項４に記載のテストケース選択装置。
【請求項７】
変更前プログラムに対して実施された複数のテストケースから、変更後プログラムに対して実施すべきテストケースである重要テストケースを選択するテストケース選択プログラムであって、
前記変更前プログラムに含まれる変更前対象関数と前記変更後プログラムに含まれる関数であり前記変更前対象関数に対応する関数であり前記変更前対象関数と一致しない関数である変更後対象関数との組である対象組を１つ以上示す対象組リストから、前記変更前対象関数と前記変更後対象関数との両方に同じ入力が与えられた場合に前記変更後対象関数の出力が前記変更前対象関数の出力と一致するという条件を満たさない対象組である不等価組を抽出する不等価組抽出処理と、
前記複数のテストケースから、前記不等価組に含まれる変更前対象関数が呼び出されるテストケースを前記重要テストケースとして選択するテストケース選択処理と
をコンピュータに実行させるためのテストケース選択プログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、変更前プログラムに対して実施された複数のテストケースから変更後プログラムに対して実施すべきテストケースを選択するための技術に関するものである。
【背景技術】
【０００２】
プログラムに変更が加えられた際には、その変更がプログラムに意図しない影響を与えていないか、つまり、プログラムに新たな不具合が生じていないかを確認するために、テストを行う必要がある。
プログラムに新たな不具合が生じていないかを確認する方法として、変更前のプログラムに対して実施された全てのテストケースを変更後のプログラムに対して実施する方法がある。
しかし、ソフトウェアの開発規模が大きければテストケースの数が多いため全てのテストケースを実施するための工数が膨大になってしまう。また、変更された仕様に基づいて各テストケースにおける出力期待値は変更された仕様に基づいて人手で再設定する必要があるため、各テストケースにおける出力期待値を再設定するための工数も膨大になってしまう。
そのため、プログラムの変更に伴う不具合が発見される可能性があるテストケース、すなわち、プログラムの変更前後で実行結果が変わる可能性があるテストケースを選択し、選択されたテストケースだけを実施する方法が用いられることがある。【０００３】
特許文献１には、変更前後のプログラムの差分から出力変数の値に影響を及ぼす命令を抽出し、抽出された命令が実行されるテストケースを選択する技術が開示されている。
特許文献２には、変更前後のプログラムの各々に対してシンボリック実行を行って出力値域の変化を抽出し、値域が変化する出力変数が使用されるテストケースを選択する技術が開示されている。
【先行技術文献】
【特許文献】
【０００４】
【特許文献１】特開２０１６−１６４７２７号公報
【特許文献２】特開２０１５−０９０６１６号公報
【発明の概要】
【発明が解決しようとする課題】
【０００５】
特許文献１に開示された技術では、変更前後のプログラムの差分として変更前後のソースコードの差分がステートメント単位で検出される。そのため、機能的な変更を伴わないリファクタリングに伴う差分も検出され、リファクタリングに伴う差分から出力変数の値に影響を及ぼす命令が抽出されてしまう。そして、プログラムの変更前後で出力が変化しないテストケース、すなわち、実施不要なテストケースも選択されてしまう。その結果、テスト工数が増加してしまう。【０００６】
特許文献２に開示された技術では、変更前後でプログラムの動作は変化したが出力変数の値域は変わらない場合、プログラムの変更に伴う影響を検出することができない。したがって、プログラムの変更前後で出力が変化する可能性があるテストケース、すなわち、再実行が必要なテストケースを見落とす可能性がある。【０００７】
本発明は、変更前プログラムに対して実施された複数のテストケースから変更後プログラムに対して実施すべきテストケースである重要テストケースを選択できるようにすることを目的とする。
【課題を解決するための手段】
【０００８】
本発明のテストケース選択装置は、
変更前プログラムに含まれる変更前対象関数と変更後プログラムに含まれる関数であり前記変更前対象関数に対応する関数であり前記変更前対象関数と一致しない関数である変更後対象関数との組である対象組を１つ以上示す対象組リストから、前記変更前対象関数と前記変更後対象関数との両方に同じ入力が与えられた場合に前記変更後対象関数の出力が前記変更前対象関数の出力と一致するという条件を満たさない対象組である不等価組を抽出する不等価組抽出部と、
前記複数のテストケースから、前記不等価組に含まれる変更前対象関数が呼び出されるテストケースを前記重要テストケースとして選択するテストケース選択部とを備える。
【発明の効果】
【０００９】
本発明によれば、変更前プログラムに対して実施された複数のテストケースから変更後プログラムに対して実施すべきテストケースである重要テストケースを選択することができる。
【図面の簡単な説明】
【００１０】
【図１】実施の形態１におけるテストケース選択装置１００の構成図。
【図２】実施の形態１におけるテストケース選択方法のフローチャート。
【図３】実施の形態１における変更前プログラム２００および変更後プログラム２１０を示す図。
【図４】実施の形態１における対象組リスト生成処理（Ｓ１１０）のフローチャート。
【図５】実施の形態１における変更後関数リスト２２０を示す図。
【図６】実施の形態１における関数対応表２３０を示す図。
【図７】実施の形態１における対象組リスト２４０を示す図。
【図８】実施の形態１における不等価組抽出処理（Ｓ１２０）のフローチャート。
【図９】実施の形態１における関数ｆを示す図。
【図１０】実施の形態１における関数ｇを示す図。
【図１１】実施の形態１における等価性リスト２５０を示す図。
【図１２】実施の形態１における呼び出しリスト生成処理（Ｓ１３０）のフローチャート。
【図１３】実施の形態１における変更前プログラム２６０を示す図。
【図１４】実施の形態１における変更前プログラム２６１を示す図。
【図１５】実施の形態１における呼び出しリスト２７０を示す図。
【図１６】実施の形態１におけるテストケース選択処理（Ｓ１４０）のフローチャート。
【図１７】実施の形態１における判定処理（Ｓ１４２）のフローチャート。
【図１８】実施の形態１における重要テストケースリスト２８０を示す図。
【図１９】実施の形態におけるテストケース選択装置１００のハードウェア構成図。
【発明を実施するための形態】
【００１１】
実施の形態および図面において、同じ要素および対応する要素には同じ符号を付している。同じ符号が付された要素の説明は適宜に省略または簡略化する。図中の矢印はデータの流れ又は処理の流れを主に示している。
【００１２】
実施の形態１．
変更前プログラムに対して実施された複数のテストケースから変更後プログラムに対して実施すべきテストケースを選択する形態について、図１から図１８に基づいて説明する。
【００１３】
＊＊＊構成の説明＊＊＊
図１に基づいて、テストケース選択装置１００の構成を説明する。
テストケース選択装置１００は、プロセッサ９０１とメモリ９０２と補助記憶装置９０３といったハードウェアを備えるコンピュータである。これらのハードウェアは、信号線を介して互いに接続されている。
【００１４】
プロセッサ９０１は、演算処理を行うＩＣ（Ｉｎｔｅｇｒａｔｅｄ  Ｃｉｒｃｕｉｔ）であり、他のハードウェアを制御する。例えば、プロセッサ９０１は、ＣＰＵ（Ｃｅｎｔｒａｌ  Ｐｒｏｃｅｓｓｉｎｇ  Ｕｎｉｔ）、ＤＳＰ（Ｄｉｇｉｔａｌ  Ｓｉｇｎａｌ  Ｐｒｏｃｅｓｓｏｒ）、またはＧＰＵ（Ｇｒａｐｈｉｃｓ  Ｐｒｏｃｅｓｓｉｎｇ  Ｕｎｉｔ）である。
メモリ９０２は揮発性の記憶装置である。メモリ９０２は、主記憶装置またはメインメモリとも呼ばれる。例えば、メモリ９０２はＲＡＭ（Ｒａｎｄｏｍ  Ａｃｃｅｓｓ  Ｍｅｍｏｒｙ）である。メモリ９０２に記憶されたデータは必要に応じて補助記憶装置９０３に保存される。
補助記憶装置９０３は不揮発性の記憶装置である。例えば、補助記憶装置９０３は、ＲＯＭ（Ｒｅａｄ  Ｏｎｌｙ  Ｍｅｍｏｒｙ）、ＨＤＤ（Ｈａｒｄ  Ｄｉｓｋ  Ｄｒｉｖｅ）、またはフラッシュメモリである。補助記憶装置９０３に記憶されたデータは必要に応じてメモリ９０２にロードされる。
【００１５】
テストケース選択装置１００は、対象組リスト生成部１１０と不等価組抽出部１２０と呼び出しリスト生成部１３０とテストケース選択部１４０といったソフトウェア要素を備える。ソフトウェア要素はソフトウェアで実現される要素である。
【００１６】
補助記憶装置９０３には、コンピュータを対象組リスト生成部１１０と不等価組抽出部１２０と呼び出しリスト生成部１３０とテストケース選択部１４０として機能させるためのテストケース選択プログラムが記憶されている。テストケース選択プログラムは、メモリ９０２にロードされて、プロセッサ９０１によって実行される。
さらに、補助記憶装置９０３にはＯＳ（Ｏｐｅｒａｔｉｎｇ  Ｓｙｓｔｅｍ）が記憶されている。ＯＳの少なくとも一部は、メモリ９０２にロードされて、プロセッサ９０１によって実行される。
つまり、プロセッサ９０１は、ＯＳを実行しながら、テストケース選択プログラムを実行する。
テストケース選択プログラムを実行して得られるデータは、メモリ９０２、補助記憶装置９０３、プロセッサ９０１内のレジスタまたはプロセッサ９０１内のキャッシュメモリといった記憶装置に記憶される。
【００１７】
メモリ９０２はデータを記憶する記憶部１９１として機能する。但し、他の記憶装置が、メモリ９０２の代わりに、又は、メモリ９０２と共に、記憶部１９１として機能してもよい。
【００１８】
テストケース選択装置１００は、プロセッサ９０１を代替する複数のプロセッサを備えてもよい。複数のプロセッサは、プロセッサ９０１の役割を分担する。
【００１９】
テストケース選択プログラムは、磁気ディスク、光ディスクまたはフラッシュメモリ等の不揮発性の記憶媒体にコンピュータ読み取り可能に記憶することができる。不揮発性の記憶媒体は、一時的でない有形の媒体である。
【００２０】
＊＊＊動作の説明＊＊＊
テストケース選択装置１００は、変更前プログラムに対して実施された複数のテストケースから、変更後プログラムに対して実施すべきテストケースを選択する。
変更前プログラムは、１つ以上の関数を含んだプログラムである。
変更前プログラムに含まれる１つ以上の関数のそれぞれを変更前関数という。
変更後プログラムは、変更が加えられたプログラムである。
変更後プログラムに含まれる１つ以上の関数のそれぞれを変更後関数という。
テストケースは、プログラムに対するテストの手順を示すデータである。
変更後プログラムに対して実施すべきテストケースを重要テストケースという。
具体的には、重要テストケースは、プログラムの変更前後で実行結果が変化する可能性があるテストケースである。つまり、重要テストケースは、変更後プログラムに対して実施されたときに得られる結果が変更前プログラムに対して実施されたときに得られる結果と異なる可能性があるテストケースである。
【００２１】
テストケース選択装置１００の動作はテストケース選択方法に相当する。また、テストケース選択方法の手順はテストケース選択プログラムの手順に相当する。
【００２２】
図２に基づいて、テストケース選択方法を説明する。
ステップＳ１１０において、対象組リスト生成部１１０は対象組リストを生成する。
対象組リストは、対象組を１つ以上示すリストである。
対象組は、変更前対象関数と変更後対象関数との組である。
変更前対象関数は、変更後対象関数に対応し、且つ、変更後対象関数と一致しない変更前関数である。
変更後対象関数は、変更前対象関数に対応し、且つ、変更前対象関数と一致しない変更後関数である。
対象組リスト生成処理（Ｓ１１０）の詳細については後述する。
【００２３】
ステップＳ１２０において、不等価組抽出部１２０は、対象組リストから不等価組を抽出する。
不等価組は、変更前対象関数と変更後対象関数との両方に同じ入力が与えられた場合に変更後対象関数の出力が変更前対象関数の出力と一致するという条件を満たさない対象組である。
不等価組抽出処理（Ｓ１２０）の詳細については後述する。
【００２４】
ステップＳ１３０において、呼び出しリスト生成部１３０は、呼び出しリストを生成する。
呼び出しリストは、変更前プログラムが実行された場合に呼び出される変更前関数をテストケース毎に示すリストである。
呼び出しリスト生成処理（Ｓ１３０）の詳細については後述する。
【００２５】
ステップＳ１４０において、テストケース選択部１４０は、呼び出しリストを用いて、重要テストケースを選択する。
具体的には、テストケース選択部１４０は、複数のテストケースから、不等価組に含まれる変更前対象関数が呼び出されるテストケースを重要テストケースとして選択する。
テストケース選択処理（Ｓ１４０）の詳細については後述する。
【００２６】
図３に、変更前プログラム２００と変更後プログラム２１０とのそれぞれの構成例を示す。
変更前プログラム２００は、４つの変更前関数（ｆ１、ｆ２、ｆ３、ｆ４）を含んでいる。ｆ２、ｆ３およびｆ４はｆ１から呼び出される関数である。
変更後プログラム２１０は、４つの変更後関数（ｆ１’、ｆ２’、ｆ４’、ｆ５’）を含んでいる。ｆ２’およびｆ４’はｆ１’から呼び出される関数であり、ｆ５’はｆ２’から呼び出される関数である。
以下、変更前プログラム２００および変更後プログラム２１０を例にして説明を行う。
【００２７】
図４に基づいて、対象組リスト生成処理（Ｓ１１０）を説明する。
ステップＳ１１１において、対象組リスト生成部１１０は、変更後プログラムに含まれる１つ以上の変更後関数の中から、未選択の変更後関数を１つ選択する。
具体的には、対象組リスト生成部１１０は、変更後関数リストから、未選択の変更後関数を１つ選択する。
変更後関数リストは、変更後プログラムに含まれる１つ以上の変更後関数を示すリストであり、記憶部１９１に記憶されている。
【００２８】
図５に、変更後関数リスト２２０を示す。
変更後関数リスト２２０は、変更後プログラム２１０に含まれる４つの変更後関数（ｆ１’、ｆ２’、ｆ４’、ｆ５’）のそれぞれの関数名を含んでいる。
例えば、対象組リスト生成部１１０は、変更後関数リスト２２０に含まれる関数名の順番、つまり、ｆ１’、ｆ２’、ｆ４’、ｆ５’の順番で変更後関数を選択する。
【００２９】
図４に戻り、ステップＳ１１２を説明する。ステップＳ１１２からステップＳ１１４までの説明において、選択された変更後関数は、ステップＳ１１１で選択された変更後関数を意味する。
ステップＳ１１２において、対象組リスト生成部１１０は、選択された変更後関数に対応する変更前関数が有るか判定する。
具体的には、対象組リスト生成部１１０は、選択された変更後関数が関数対応表において変更前関数に対応付けられているか判定する。選択された変更後関数が関数対応表において変更前関数に対応付けられている場合、選択された変更後関数に対応する変更前関数が有る。
関数対応表は、変更後関数と変更後関数に対応する変更前関数との組を示す表であり、記憶部１９１に記憶されている。
選択された変更後関数に対応する変更前関数が有る場合、処理はステップＳ１１３に進む。
選択された変更後関数に対応する変更前関数が無い場合、処理はステップＳ１１５に進む。
【００３０】
図６に、関数対応表２３０を示す。
関数対応表２３０において、ハイフンは対応する関数が無いことを意味する。
選択された変更後関数がｆ１’である場合について説明する。関数対応表２３０において、選択された変更後関数ｆ１’は変更前関数ｆ１に対応付けられている。したがって、対象組リスト生成部１１０は、選択された変更後関数ｆ１’に対応する変更前関数ｆ１が有ると判定する。
選択された変更後関数がｆ５’である場合について説明する。関数対応表２３０において、選択された変更後関数ｆ５’は変更前関数に対応付けられていない。したがって、対象組リスト生成部１１０は、選択された変更後関数ｆ５’に対応する変更前関数が無いと判定する。
【００３１】
図４に戻り、ステップＳ１１３を説明する。ステップＳ１１３およびステップＳ１１４の説明において、対応する変更前関数は、選択された変更後関数に対応する変更前関数を意味する。
ステップＳ１１３において、対象組リスト生成部１１０は、選択された変更後関数のソースコードを対応する変更前関数のソースコードと比較することによって、選択された変更後関数のソースコードが対応する変更前関数のソースコードと一致するか判定する。つまり、対象組リスト生成部１１０は、選択された変更後関数が対応する変更前関数とテキストレベルで完全に同一であるか判定する。
それぞれの変更前関数のソースコードおよびそれぞれの変更後関数のソースコードは、記憶部１９１に記憶されている。
選択された変更後関数のソースコードが対応する変更前関数のソースコードと一致する場合、処理はステップＳ１１５に進む。
選択された変更後関数のソースコードが対応する変更前関数のソースコードと一致しない場合、処理はステップＳ１１４に進む。
【００３２】
ステップＳ１１４において、対象組リスト生成部１１０は、対応する変更前関数を変更前対象関数として含み、且つ、選択された変更後関数を変更後対象関数として含む対象組を対象組リストに登録する。
【００３３】
ステップＳ１１５において、対象組リスト生成部１１０は、未選択の変更後関数が有るか判定する。
未選択の変更後関数が有る場合、処理はステップＳ１１１に進む。
未選択の変更後関数が無い場合、対象組リスト生成処理（Ｓ１１０）は終了する。
【００３４】
対象組リスト生成処理（Ｓ１１０）によって、図７の対象組リスト２４０が生成される。
対象組リスト２４０は、（ｆ１，ｆ１’）と（ｆ２，ｆ２’）と（ｆ４，ｆ４’）との３つの対象組を示している。
対象組（ｆ１，ｆ１’）において、変更前関数ｆ１が変更前対象関数であり、変更後関数ｆ１’が変更後対象関数である。
対象組（ｆ２，ｆ２’）において、変更前関数ｆ２が変更前対象関数であり、変更後関数ｆ２’が変更後対象関数である。
対象組（ｆ４，ｆ４’）において、変更前関数ｆ４が変更前対象関数であり、変更後関数ｆ４’が変更後対象関数である。
【００３５】
図８に基づいて、不等価組抽出処理（Ｓ１２０）を説明する。
ステップＳ１２１において、不等価組抽出部１２０は、対象組リストから、未選択の対象組を１つ選択する。
例えば、不等価組抽出部１２０は、図７の対象組リスト２４０に示される対象組の順番、つまり、（ｆ１，ｆ１’）、（ｆ２，ｆ２’）、（ｆ４，ｆ４’）の順番で対象組を選択する。
ステップＳ１２２からステップＳ１２７までの説明において、選択された対象組は、ステップＳ１２１で選択された対象組を意味する。
【００３６】
ステップＳ１２２において、不等価組抽出部１２０は、選択された対象組に示される変更前対象関数の論理式を生成する。変更前対象関数の論理式を変更前論理式という。
変更前論理式は、変更前対象関数において成り立つ論理式である。言い換えると、変更前論理式は、変更前対象関数の実行後に成り立つ条件を表す論理式である。
【００３７】
具体的には、不等価組抽出部１２０は、変更前論理式を以下のように生成する。
まず、不等価組抽出部１２０は、変更前対象関数のソースコードに含まれるステートメント（命令）毎に変換ルールに従ってステートメントをステートメント論理式に変換する。これにより、複数のステートメント論理式が得られる。変換ルールは、ステートメントをステートメント論理式に変換するためのルールである。例えば、変換ルールは、ステートメントのパターン毎にステートメント論理式のパターンを示す。ステートメント論理式は、ステートメントにおいて成り立つ論理式である。
そして、不等価組抽出部１２０は、複数のステートメント論理式を連結ルールに従って連結する。これにより、変更前論理式が得られる。連結ルールは、複数のステートメント論理式を連結するためのルールである。例えば、連結ルールは、ステートメント論理式のパターンの組み合わせ毎に論理式のパターンを示す。
【００３８】
例えば、関数の実行後に成り立つ条件とは以下のような条件である。
（Ａ）関数の実行によって変数ｘに値ｃが代入される。この関数の実行後に成り立つ条件は、ｘ＝ｃである。
（Ｂ）関数の実行によってステートメントＳ１とステートメントＳ２とが順に実行される。この関数の実行後に成り立つ条件は、ステートメントＳ１の実行後に成り立つ条件の下で、ステートメントＳ２を実行した場合に成り立つ条件である。
（Ｃ）関数の実行によって条件Ｂが成り立つ場合にステートメントＳ１が実行され、条件Ｂが成り立たない場合にステートメントＳ２が実行される。この関数の実行後に成り立つ条件は、第１論理積と第２論理積との論理和である。第１論理積は、ステートメントＳ１の実行後に成り立つ条件と条件Ｂとの論理積である。第２論理積は、ステートメントＳ２の実行後に成り立つ条件と条件Ｂの否定との論理積である。
【００３９】
例えば、図９に示す関数ｆの論理式は式（１）で表される。図９は、Ｃ言語で記述された関数ｆのソースコードを示している。
【００４０】
【数１】
0006559376.tif 000002
【００４１】
対象の関数の中で別の関数が呼び出される場合、対象の関数の論理式は以下のように生成される。以下の説明において、対象の関数を呼び出し元関数といい、呼び出される関数を呼び出し先関数という。
（ａ）呼び出し先関数は、プログラムの変更に伴って削除または追加された関数である。つまり、呼び出し先関数は変更前プログラムに含まれるが、呼び出し先関数に対応する関数は変更後プログラムに含まれない。または、呼び出し先関数に対応する関数は変更前プログラムに含まれないが、呼び出し先関数は変更後プログラムに含まれる。これらの場合、呼び出し先関数を呼び出し元関数の中に展開して得られる関数の論理式が生成される。
例えば、図３において、関数ｆ１の中で呼び出される関数ｆ３は変更前プログラム２００に含まれるが、関数ｆ３に対応する関数は変更後プログラム２１０に含まれない。そのため、関数ｆ１において関数ｆ３を呼び出すステートメントが関数ｆ３の中のステートメントに置き換えられた後、関数ｆ１の論理式が生成される。
図１０に示す関数ｇでは、図９に示す関数ｆが呼び出される。関数ｆは、プログラムの変更に伴って削除または追加された関数である。この場合、関数ｇの論理式は式（２）で表される。図１０は、Ｃ言語で記述された関数ｇのソースコードを示している。
【００４２】
【数２】
0006559376.tif 000003
【００４３】
（ｂ）呼び出し先関数は、プログラムの変更に伴って削除または追加された関数ではない。つまり、呼び出し先関数が変更前プログラムに含まれ、呼び出し先関数に対応する関数が変更後プログラムに含まれる。この場合、呼び出し先関数は呼び出し元関数の中に展開されずに、呼び出し元関数の論理式が生成される。そして、「呼び出し先関数が呼び出し先関数に対応する関数と等価であるならば、呼び出し元関数は呼び出し元関数に対応する関数と等価である」という条件が成り立つ。
例えば、図３において、関数ｆ１の中で呼び出される関数ｆ２および関数ｆ４は変更前プログラム２００に含まれる。そして、関数ｆ２に対応する関数ｆ２’および関数ｆ４に対応する関数ｆ４’が変更後プログラム２１０に含まれる。そのため、関数ｆ１において関数ｆ２を呼び出すステートメントおよび関数ｆ４を呼び出すステートメントが関数ｆ２の中のステートメントおよび関数ｆ４の中のステートメントに置き換えられずに、関数ｆ１の論理式が生成される。そして、「関数ｆ２が関数ｆ２’と等価であり、関数ｆ４が関数ｆ４’と等価であるならば、関数ｆ１は関数ｆ１’と等価である」という条件が成り立つ。
図１０に示す関数ｇでは、図９に示す関数ｆが呼び出される。関数ｆは、プログラムの変更に伴って削除または追加された関数ではない。この場合、関数ｇの論理式は式（３）で表される。
【００４４】
【数３】
0006559376.tif 000004
【００４５】
図８に戻り、ステップＳ１２３から説明を続ける。
ステップＳ１２３において、不等価組抽出部１２０は、選択された対象組に示される変更後対象関数の論理式を生成する。変更後対象関数の論理式を変更後論理式という。
変更後論理式は、変更後対象関数において成り立つ論理式である。言い換えると、変更後論理式は、変更後対象関数の実行後に成り立つ条件を表す論理式である。
変更後論理式を生成する方法は、変更前論理式を生成する方法と同様である（ステップＳ１２１参照）。
【００４６】
ステップＳ１２４およびステップＳ１２５において、不等価組抽出部１２０は、変更前論理式と変更後論理式とを用いて、選択された対象組が不等価組であるか判定する。
具体的には、不等価組抽出部１２０は以下のように判定を行う。
【００４７】
ステップＳ１２４において、不等価組抽出部１２０は、変更前論理式と変更後論理式とを用いて、変更前対象関数と変更後対象関数とに対応する等価性論理式を生成する。
等価性論理式は、変更前対象関数と変更後対象関数との等価性を表す論理式である。
【００４８】
関数Ｆと関数Ｇとに対応する等価性論理式は式（４）で表される。
但し、関数Ｆの論理式をＰ１とし、関数Ｆの入力変数をｉ１とし、関数Ｆの出力変数をｏ１とする。また、関数Ｇの論理式をＰ２とし、関数Ｇの入力変数をｉ２とし、関数Ｇの出力変数をｏ２とする。
【００４９】
【数４】
0006559376.tif 000005
【００５０】
式（４）の等価性論理式は、関数Ｆと関数Ｇとの両方に同じ入力が与えられた場合には関数Ｆの出力が関数Ｇの出力と一致することを意味する。
したがって、式（４）の等価性論理式が恒真であるならば、関数Ｆは関数Ｇと等価である。また、式（４）の等価性論理式が恒真でないならば、関数Ｆは関数Ｇと不等価である。
【００５１】
ステップＳ１２５において、不等価組抽出部１２０は、ステップＳ１２４で生成された等価性論理式が恒真であるか判定する。
等価性論理式が恒真であるか否かは、命題論理式の充足可能性判定問題に帰着され、ＳＡＴソルバと呼ばれるツールを用いることによって判定することができる。ＳＡＴはＳａｔｉｓｆｉａｂｉｌｉｔｙ  Ｐｒｏｂｌｅｍの略称である。
ステップＳ１２４で生成された等価性論理式が恒真である場合、処理はステップＳ１２６に進む。
ステップＳ１２４で生成された等価性論理式が恒真でない場合、処理はステップＳ１２７に進む。
【００５２】
ステップＳ１２６において、不等価組抽出部１２０は、選択された対象組を等価性組として等価性組ファイルに登録する。
等価性ファイルは、それぞれの対象組が等価性組であるかを示す。
【００５３】
ステップＳ１２７において、不等価組抽出部１２０は、選択された対象組を不等価組として等価性ファイルに登録する。
【００５４】
ステップＳ１２８において、不等価組抽出部１２０は、未選択の対象組が有るか判定する。
未選択の対象組が有る場合、処理はステップＳ１２１に進む。
未選択の対象組が無い場合、不等価組抽出処理（Ｓ１２０）は終了する。
【００５５】
不等価組抽出処理（Ｓ１２０）によって、例えば、図１１の等価性リスト２５０が生成される。
等価性リスト２５０において、対象組（ｆ１，ｆ１’）および対象組（ｆ２，ｆ２’）は等価組であり、対象組（ｆ４，ｆ４’）は不等価組である。
【００５６】
図１２に基づいて、呼び出しリスト生成処理（Ｓ１３０）を説明する。
ステップＳ１３１において、呼び出しリスト生成部１３０は、それぞれの変更前関数用の呼び出しフラグを変更前プログラムに追加する。
呼び出しフラグは、変更前関数が呼び出されたときに更新されるフラグである。
【００５７】
具体的には、呼び出しリスト生成部１３０は、エントリ関数を除いて変更前関数毎に変更前関数用の大域変数の宣言文を変更前プログラムのソースコードに追加する。大域変数が呼び出しフラグとして機能する。
【００５８】
ステップＳ１３２において、呼び出しリスト生成部１３０は、それぞれの変更前関数にフラグ更新命令を追加する。
フラグ更新命令は、呼び出しフラグを更新する命令である。
【００５９】
具体的には、呼び出しリスト生成部１３０は、エントリ関数を除いて変更前関数毎に変更前関数の先頭に変更前関数用の大域変数に１を足すステートメントを追加する。
【００６０】
ステップＳ１３１およびステップＳ１３２によって図１３の変更前プログラム２６０が加工されると、図１４の変更前プログラム２６１が得られる。
変更前プログラム２６０は、エントリ関数ｍａｉｎを除いて３つの変更前関数（ｓｕｂ１、ｓｕｂ２、ｓｕｂ３）を含んでいる。
変更前プログラム２６１において、「ｉｎｔ  ｇ１，ｇ２，ｇ３；」はｇ１、ｇ２およびｇ３を大域変数として宣言する宣言文である。ｇ１はｓｕｂ１用の呼び出しフラグであり、ｇ２はｓｕｂ２用の呼び出しフラグであり、ｇ３はｓｕｂ３用の呼び出しフラグである。それぞれの呼び出しフラグの初期値は０である。ｇ１＋＋、ｇ２＋＋およびｇ３＋＋は、フラグ更新命令である。ｓｕｂ１が呼び出される度にフラグ更新命令（ｇ１＋＋）によってｇ１に１が足される。ｓｕｂ２が呼び出される度にフラグ更新命令（ｇ２＋＋）によってｇ２に１が足される。ｓｕｂ３が呼び出される度にフラグ更新命令（ｇ３＋＋）によってｇ３に１が足される。
例えば、変更前プログラム２６１が実行された結果、関数ｓｕｂ１が１回も呼び出されなかった場合、呼び出しフラグｇ１の値は更新されず０のままである。つまり、呼び出しフラグｇ１の値が０であれば、呼び出しフラグｇ１に対応する変更前関数ｓｕｂ１は呼び出されていないことになる。
例えば、変更前プログラム２６１が実行された結果、関数ｓｕｂ１がＮ回呼び出された場合、呼び出しフラグｇ１の値はＮに更新される。つまり、呼び出しフラグｇ１の値がＮであれば、呼び出しフラグｇ１に対応する変更前関数ｓｕｂ１はＮ回呼び出されたことになる。
【００６１】
ステップＳ１３３において、呼び出しリスト生成部１３０は、未選択のテストケースを１つ選択する。
【００６２】
ステップＳ１３４からステップＳ１３６までの説明において、テストケースはステップＳ１３３で選択されたテストケースを意味し、変更前プログラムはステップＳ１３２の後の変更前プログラムを意味する。
【００６３】
ステップＳ１３４において、呼び出しリスト生成部１３０は、テストケースに従って変更前プログラムを実行する。
【００６４】
ステップＳ１３５において、呼び出しリスト生成部１３０は、それぞれの変更前関数用の呼び出しフラグを参照し、更新された呼び出しフラグを特定する。
そして、呼び出しリスト生成部１３０は、更新された呼び出しフラグに対応する変更前関数を特定する。
【００６５】
ステップＳ１３６において、呼び出しリスト生成部１３０は、特定された変更前関数を呼び出しリストに登録する。
具体的には、呼び出しリスト生成部１３０は、特定された変更前関数の関数名をテストケースの識別子に対応付けて呼び出しリストに登録する。
【００６６】
ステップＳ１３７において、呼び出しリスト生成部１３０は、未選択のテストケースが有るか判定する。
未選択のテストケースが有る場合、処理はステップＳ１３３に進む。
未選択のテストケースが無い場合、呼び出しリスト生成処理（Ｓ１３０）は終了する。
【００６７】
呼び出しリスト生成処理（Ｓ１３０）によって、例えば、図１５に示す呼び出しリスト２７０が生成される。
呼び出しリスト２７０は、変更前プログラムが実行された場合に呼び出される変数前関数をテストケース毎に以下にように示している。
テストケース（１）が実施された場合、２つの変更前関数（ｆ１、ｆ２）が呼び出される。
テストケース（２）が実施された場合、２つの変更前関数（ｆ１、ｆ４）が呼び出される。
テストケース（３）が実施された場合、２つの変更前関数（ｆ１、ｆ２、ｆ３）が呼び出される。
テストケース（４）が実施された場合、２つの変更前関数（ｆ１、ｆ３、ｆ４）が呼び出される。
【００６８】
図１６に基づいて、テストケース選択処理（Ｓ１４０）を説明する。
テストケース選択処理（Ｓ１４０）において、テストケース選択部１４０は、呼び出しリストに示される変更前関数のうち対象のテストケースに対応する変更前関数が不等価組に含まれる変更前対象関数である場合、対象のテストケースが重要テストケースであると判定する。
【００６９】
ステップＳ１４１において、テストケース選択部１４０は、呼び出しリストから、未選択のテストケースを１つ選択する。
ステップＳ１４２およびステップＳ１４３において、選択されたテストケースは、ステップＳ１４１で選択されたテストケースを意味する。
【００７０】
ステップＳ１４２において、テストケース選択部１４０は、選択されたテストケースが重要テストケースであるか判定する。
【００７１】
図１７に基づいて、判定処理（Ｓ１４２）を説明する。
判定処理（Ｓ１４２）において、テストケース選択部１４０は、選択されたテストケースに対応付けられた変更前関数のいずれかがいずれかの不等価組に含まれる変更前対象関数である場合に、選択されたテストケースが重要テストケースであると判定する。
【００７２】
ステップＳ１４２１において、テストケース選択部１４０は、選択されたテストケースに対応付けられた変更前関数のうち未選択の変更前関数を呼び出しリストから１つ選択する。
【００７３】
Ｓ１４２２、ステップＳ１４２３およびステップＳ１４２５は、ステップＳ１４２１で選択された変更前関数を対象にして実行される。
【００７４】
ステップＳ１４２２において、テストケース選択部１４０は、等価性リストから、未選択の不等価組を１組選択する。
【００７５】
ステップＳ１４２３において、変更前関数はステップＳ１４２１で選択された変更前関数を意味し、不等価組はステップＳ１４２２で選択された不等価組を意味する。
【００７６】
ステップＳ１４２３において、テストケース選択部１４０は、変更前関数が不等価組に含まれる変更前対象関数であるか判定する。
変更前関数が不等価組に含まれる変更前対象関数である場合、処理はステップＳ１４２４に進む。
変更前関数が不等価組に含まれる変更前対象関数でない場合、処理はステップＳ１４２５に進む。
【００７７】
ステップＳ１４２４において、テストケース選択部１４０は、選択されたテストケースが重要テストケースであると判定する。
ステップＳ１４２４の後、判定処理（Ｓ１４２）は終了する。
【００７８】
ステップＳ１４２５において、テストケース選択部１４０は、未選択の不等価組が有るか判定する。
未選択の不等価組が有る場合、処理はステップＳ１４２２に進む。
未選択の不等価組が無い場合、処理はステップＳ１４２６に進む。
【００７９】
ステップＳ１４２６において、テストケース選択部１４０は、未選択の変更前関数が有るか判定する。
未選択の変更前関数が有る場合、処理はステップＳ１４２１に進む。
未選択の変更前関数が無い場合、処理はステップＳ１４２７に進む。
【００８０】
ステップＳ１４２７において、テストケース選択部１４０は、選択されたテストケースは重要テストケースでないと判定する。
ステップＳ１４２７の後、判定処理（Ｓ１４２）は終了する。
【００８１】
図１６に戻り、ステップＳ１４３から説明を続ける。
ステップＳ１４３において、テストケース選択部１４０は、選択されたテストケースを重要テストケースリストに登録する。
重要テストケースリストは、重要テストケースを示すリストである。
【００８２】
ステップＳ１４４において、テストケース選択部１４０は、未選択のテストケースが有るか判定する。
未選択のテストケースが有る場合、処理はステップＳ１４１に進む。
未選択のテストケースが無い場合、テストケース選択処理（Ｓ１４０）は終了する。
【００８３】
テストケース選択処理（Ｓ１４０）によって、例えば、図１８に示す重要テストケースリスト２８０が生成される。
図１１の等価性リスト２５０において、不等価組に含まれる変更前対象関数は関数ｆ４である。
図１５の呼び出しリスト２７０において、関数ｆ４に対応付けられたテストケースはテストケース２およびテストケース４である。
したがって、図１８の重要テストケースリスト２８０は、テストケース２とテストケース４とを重要テストケースとして示している。
【００８４】
＊＊＊実施の形態１の効果＊＊＊
変更前プログラムに対して実施された複数のテストケースを以下の２種類に分けることができる。
テストケース（１）は、プログラムの変更前後で機能的に変化していない等価な関数しか呼び出されないテストケース、すなわち、プログラムの変更前後で実行結果が変わらないテストケースである。
テストケース（２）は、プログラムの変更に伴って機能的に不等価となった関数が呼び出されるテストケース、すなわち、プログラムの変更前後で実行結果が変わる可能性があるテストケースである。実施の形態１における重要テストケースはテストケース（２）である。
【００８５】
実施済みの複数のテストケースを上記の２種類に分けることで、以下のような効果が得られる。
プログラムの変更に伴って予期せぬ不具合が混入していないことを確かめるため、変更前プログラムに対して実施されたテストケースを変更後プログラムに対して実施する場合を考える。
この場合、プログラムの変更前後で出力が変化する可能性のあるテストケース、すなわち、不具合を発見する可能性のあるテストケースのみを選択することができる。選択されたテストケースのみを変更後プログラムに対して実施すれば、変更後プログラムに対して実施されるテストケースの数が削減される。
実施の形態１では、プログラムの変更前後における関数の等価性が検査される。そのため、従来手法では出力が変化すると判定される関数であっても、その関数は、プログラムの変更前後で機能的に同等であれば、出力が変化しない関数であると判定される。その結果、プログラムの変更前後で出力が変化しないテストケースを従来手法よりも多く発見し、変更後プログラムに対して実施すべきテストケースの数を従来手法よりも削減することができる。これによって、変更後プログラムに対するテストにかかるコストを削減できる。さらに、テストケース毎の出力期待値を変更後プログラムの仕様に基づいて変更する作業を削減し、変更後プログラムの開発におけるテスト工程をより効率化することが可能となる。
【００８６】
実施の形態１では、プログラムの変更前後で出力が変化する可能性があるテストケースが選択される。
残りのテストケース、すなわち、プログラムの変更前後で出力が変化しないテストケースを用いることによって、以下のような効果が得られる。
変更後プログラムに対して残りのテストケースを実施することにより、プログラムの変更前後で機能が変化していない部分をテストすることができる。そして、テストケース毎の出力期待値を変更することなく、プログラムの変更前後で出力が変化していないことを確かめることが可能となる。
【００８７】
プログラムの変更前後における関数の等価性の検査結果を用いることによって、以下のような効果が得られる。
不等価関数において、変更前プログラムに対して実施されたテストケースでは網羅できないパスに含まれる命令を実行するためのテストケースを新たに生成することが可能となる。つまり、プログラムの変更部分を網羅的に検証するテストを実施することが可能となる。
【００８８】
＊＊＊他の構成＊＊＊
不等価組抽出処理（Ｓ１２０）で説明したアルゴリズムは、関数の等価性を検査するためのアルゴリズムの一例である。つまり、２つの関数が論理的に等価であるか否かを判定することが可能であれば、等価性検査の手段は問わない。
【００８９】
＊＊＊実施の形態の補足＊＊＊
実施の形態において、テストケース選択装置１００の機能はハードウェアで実現してもよい。
図１９に、テストケース選択装置１００の機能がハードウェアで実現される場合の構成を示す。
テストケース選択装置１００は処理回路９９０を備える。処理回路９９０はプロセッシングサーキットリともいう。
処理回路９９０は、対象組リスト生成部１１０と不等価組抽出部１２０と呼び出しリスト生成部１３０とテストケース選択部１４０と記憶部１９１とを実現する専用の電子回路である。
例えば、処理回路９９０は、単一回路、複合回路、プログラム化したプロセッサ、並列プログラム化したプロセッサ、ロジックＩＣ、ＧＡ、ＡＳＩＣ、ＦＰＧＡまたはこれらの組み合わせである。ＧＡはＧａｔｅ  Ａｒｒａｙの略称であり、ＡＳＩＣはＡｐｐｌｉｃａｔｉｏｎ  Ｓｐｅｃｉｆｉｃ  Ｉｎｔｅｇｒａｔｅｄ  Ｃｉｒｃｕｉｔの略称であり、ＦＰＧＡはＦｉｅｌｄ  Ｐｒｏｇｒａｍｍａｂｌｅ  Ｇａｔｅ  Ａｒｒａｙの略称である。
【００９０】
テストケース選択装置１００は、処理回路９９０を代替する複数の処理回路を備えてもよい。複数の処理回路は、処理回路９９０の役割を分担する。
【００９１】
テストケース選択装置１００の機能は、ソフトウェアとハードウェアとの組み合わせで実現してもよい。つまり、一部の機能がソフトウェアで実現され、残りの機能がハードウェアで実現されてもよい。
【００９２】
実施の形態は、好ましい形態の例示であり、本発明の技術的範囲を制限することを意図するものではない。実施の形態は、部分的に実施してもよいし、他の形態と組み合わせて実施してもよい。フローチャート等を用いて説明した手順は、適宜に変更してもよい。
【符号の説明】
【００９３】
１００  テストケース選択装置、１１０  対象組リスト生成部、１２０  不等価組抽出部、１３０  呼び出しリスト生成部、１４０  テストケース選択部、１９１  記憶部、２００  変更前プログラム、２１０  変更後プログラム、２２０  変更後関数リスト、２３０  関数対応表、２４０  対象組リスト、２５０  等価性リスト、２６０  変更前プログラム、２６１  変更前プログラム、２７０  呼び出しリスト、２８０  重要テストケースリスト、９０１  プロセッサ、９０２  メモリ、９０３  補助記憶装置、９９０  処理回路。
【図１】
0006559376.tif 000006
【図２】
0006559376.tif 000007
【図３】
0006559376.tif 000008
【図４】
0006559376.tif 000009
【図５】
0006559376.tif 000010
【図６】
0006559376.tif 000011
【図７】
0006559376.tif 000012
【図８】
0006559376.tif 000013
【図９】
0006559376.tif 000014
【図１０】
0006559376.tif 000015
【図１１】
0006559376.tif 000016
【図１２】
0006559376.tif 000017
【図１３】
0006559376.tif 000018
【図１４】
0006559376.tif 000019
【図１５】
0006559376.tif 000020
【図１６】
0006559376.tif 000021
【図１７】
0006559376.tif 000022
【図１８】
0006559376.tif 000023
【図１９】
0006559376.tif 000024