(57)【要約】【課題】  ソフトウェアモジュールのテスト又は検証を支援し得る方法及びシステムを提供する。【解決手段】  一実施形態において、ソフトウェアモジュールの１つ以上の入力変数に対応する１つ以上の変数セットが構築される。各変数セットに関して、該変数セットによって影響される平均分岐深さが計算され、前記１つ以上の変数セットのうち最小の平均分岐深さを有する第１変数セットが選択される。第１変数セットの入力変数に第１記号値を割り当ててソフトウェアモジュールが記号的に実行され、第１変数セットに対する第１テストケースセットが生成される。必要に応じて、冗長テストケースを除去し、且つ第１テストケースセットのうち、全ての条件付き分岐点をカバーする最小のサブセットを選択することにより、第１テストケースセットが圧縮される。第１テストケースセットを用いてソフトウェアモジュールが検証される。【選択図】  図２
2011248887.tif 000002
【特許請求の範囲】
【請求項１】
１つ以上の計算装置によって実行される方法であって、
ソフトウェアモジュールにアクセスするステップであり、
前記ソフトウェアモジュールは、
１つ以上の入力変数と、
１つ以上の中間変数であり、各中間変数の値が前記入力変数のうちの少なくとも１つの入力変数の値に直接的あるいは間接的に依存する、１つ以上の中間変数と、
１つ以上の条件付き分岐点であり、各条件付き分岐点が、前記入力変数及び前記中間変数のうちの少なくとも１つの入力変数及び／又は中間変数によって規定される分岐条件を有し、該分岐条件が満たされるかが、前記少なくとも１つの入力変数及び／又は中間変数の値に依存する、１つ以上の条件付き分岐点と、を有し、且つ
前記ソフトウェアモジュールの実行中に、前記条件付き分岐点の各々において、前記ソフトウェアモジュールは、該条件付き分岐点の分岐条件が満たされるかに応じて異なる経路に進む、アクセスするステップと、
前記１つ以上の入力変数に対応する１つ以上の変数セットを構築するステップであり、各変数セットが、前記入力変数のうちの１つと、前記入力変数のうちの該１つの値に直接的あるいは間接的に依存する値を有する中間変数とを含む、構築するステップと、
各変数セットに関して、該変数セットの前記入力変数及び前記中間変数によって影響される平均分岐深さを計算するステップと、
前記１つ以上の変数セットのうち最小の平均分岐深さを有する第１変数セットを選択するステップと、
前記第１変数セットの前記入力変数に第１記号値を割り当てるステップと、
前記第１記号値を有する前記第１変数セットの前記入力変数を用いて、前記ソフトウェアモジュールを記号的に実行し、前記第１変数セットの前記入力変数及び前記中間変数に関する第１テストケースセットを生成するステップと、
前記第１テストケースセットを用いて前記ソフトウェアモジュールを検証するステップと、
を有する方法。
【請求項２】
前記入力変数の各々に関して、前記中間変数のうちの何れが該入力変数の値に直接的あるいは間接的に依存する値を有するかを、関連性分析を用いて決定するステップ、を更に有する請求項１に記載の方法。
【請求項３】
前記ソフトウェアモジュールは１以上の分岐階層を有し、
前記分岐階層の各々は、前記条件付き分岐点のうちの少なくとも１つを有し、
各変数セットに関して、該変数セットの前記入力変数及び前記中間変数によって影響される前記平均分岐深さを計算する前記ステップは、
該変数セットの前記入力変数に関して、分岐条件が該入力変数に依存する条件付き分岐点を有する分岐階層の数を計算するステップと、
該変数セットの前記中間変数の各々に関して、分岐条件が該中間変数に依存する条件付き分岐点を有する分岐階層の数を計算するステップと、
これらの分岐階層の数の平均を、該変数セットの前記平均分岐深さとして計算するステップと
を有する、
請求項１又は２に記載の方法。
【請求項４】
最小の平均分岐深さを有する前記第１変数セットを選択するとき、最小の平均分岐深さを有する変数セットが複数存在する場合、前記第１変数セットとして、最小の平均分岐深さを有する変数セットのうちの１つをランダムに選択する、請求項１乃至３の何れか一項に記載の方法。
【請求項５】
前記１つ以上の変数セットのうち、次に最小の平均分岐深さを有する第２変数セットを選択するステップと、
前記第２変数セットの前記入力変数に第２記号値を割り当てるステップと、
前記第２記号値を有する前記第２変数セットの前記入力変数を用いて、前記ソフトウェアモジュールを記号的に実行し、前記第２変数セットの前記入力変数及び前記中間変数に関する第２テストケースセットを生成するステップと、
前記第２テストケースセットを用いて前記ソフトウェアモジュールを検証するステップと、
を更に有する請求項１乃至４の何れか一項に記載の方法。
【請求項６】
１つ以上の計算装置によって実行される方法であって、
ソフトウェアモジュール及び該ソフトウェアモジュール用の複数のテストケースにアクセスするステップであり、
前記ソフトウェアモジュールは、
１つ以上の変数と、
１つ以上の条件付き分岐点であり、各条件付き分岐点が、前記変数のうちの少なくとも１つの変数によって規定される分岐条件を有し、該分岐条件が満たされるかが、前記少なくとも１つの変数の値に依存する、１つ以上の条件付き分岐点と、を有し、
前記ソフトウェアモジュールの実行中に、前記条件付き分岐点の各々において、前記ソフトウェアモジュールは、該条件付き分岐点の分岐条件が満たされるかに応じて異なる経路に進み、
前記テストケースの各々は、前記条件付き分岐点のうちの少なくとも１つをカバーし、且つ前記条件付き分岐点のうちの前記少なくとも１つの分岐条件を規定する前記少なくとも１つの変数に関する少なくとも１つのテスト値を有する、アクセスするステップと、
前記条件付き分岐点の各々に関して、前記複数のテストケースのうちに、該条件付き分岐点をカバーし且つ前記ソフトウェアモジュールを実行中に同一の経路に進ませるテストケースが複数存在する場合に、該条件付き分岐点をカバーし且つ前記ソフトウェアモジュールを実行中に同一の経路に進ませるテストケースのうち１つを除く全てを、前記複数のテストケースから除去するステップと、
残りのテストケースから１つ以上の第１テストケースを選択するステップであり、各第１テストケースは、前記条件付き分岐点のうちの少なくとも１つが該第１テストケースによってのみカバーされるテストケースである、選択するステップと、
前記条件付き分岐点の全てが前記第１テストケース及び第２テストケースのうちの少なくとも１つのテストケースによってカバーされるまで、残りのテストケースから１つ以上の第２テストケースを繰り返し選択するステップであり、各繰り返しにおいて選択される第２テストケースは、該繰り返しにおいて最も多数の条件付き分岐点をカバーするテストケースである、選択するステップと、
選択された前記第１テストケース及び前記第２テストケースのみを用いて、前記ソフトウェアモジュールをテストするステップと、
を有する方法。
【請求項７】
前記ソフトウェアモジュールの前記変数は、１つ以上の入力変数と１つ以上の中間変数とを有し、各中間変数の値は、前記入力変数のうちの少なくとも１つの入力変数の値に直接的あるいは間接的に依存する、請求項６に記載の方法。
【請求項８】
前記入力変数と前記入力変数に関する前記テストケースからの前記テスト値とを表すグラフを構築するステップを更に有し、
前記グラフは、
各階層が前記入力変数のうちの１つに関連付けられた、前記１つ以上の入力変数に対応する１つ以上の階層と、
前記階層の各々の１つ以上のノードと、
１つ以上のエッジであり、各エッジが、隣接する２つの階層からの２つのノードを結び付け、且つ前記隣接する２つの階層のうちの高い側の階層に関連付けられた入力変数の前記テスト値のうちの１つを表す、１つ以上のエッジと、
を有する、
請求項７に記載の方法。
【請求項９】
前記テストケースと前記条件付き分岐点とを表す二部グラフを構築するステップを更に有し、
前記二部グラフは、
各第１ノードが前記テストケースのうちの１つを表す、前記複数のテストケースに対応する複数の第１ノードと、
各第２ノードが前記条件付き分岐点のうちの１つを表す、前記１つ以上の条件付き分岐点に対応する１つ以上の第２ノードと、
各エッジが前記第１ノードのうちの１つと前記第２ノードのうちの１つとを結び付ける複数のエッジであり、前記第１ノードのうちの該１つによって表されるテストケースが、前記第２ノードのうちの該１つによって表される条件付き分岐点をカバーする、複数のエッジと
を有する、
請求項６乃至８の何れか一項に記載の方法。
【請求項１０】
１つ以上のプロセッサによって実行可能な命令を有するメモリと、
前記メモリに結合され、前記命令を実行するよう動作する１つ以上のプロセッサと
を有するシステムであって、
前記１つ以上のプロセッサは、前記命令を実行するとき、
−  ソフトウェアモジュールにアクセスし、
前記ソフトウェアモジュールは、
１つ以上の入力変数と、
１つ以上の中間変数であり、各中間変数の値が前記入力変数のうちの少なくとも１つの入力変数の値に直接的あるいは間接的に依存する、１つ以上の中間変数と、
１つ以上の条件付き分岐点であり、各条件付き分岐点が、前記入力変数及び前記中間変数のうちの少なくとも１つの入力変数及び／又は中間変数によって規定される分岐条件を有し、該分岐条件が満たされるかが、前記少なくとも１つの入力変数及び／又は中間変数の値に依存する、１つ以上の条件付き分岐点と、を有し、且つ
前記ソフトウェアモジュールの実行中に、前記条件付き分岐点の各々において、前記ソフトウェアモジュールは、該条件付き分岐点の分岐条件が満たされるかに応じて異なる経路に進み、
−  前記１つ以上の入力変数に対応する１つ以上の変数セットを構築し、各変数セットは、前記入力変数のうちの１つと、前記入力変数のうちの該１つの値に直接的あるいは間接的に依存する値を有する中間変数とを含み、
−  各変数セットに関して、該変数セットの前記入力変数及び前記中間変数によって影響される平均分岐深さを計算し、
−  前記１つ以上の変数セットのうち最小の平均分岐深さを有する第１変数セットを選択し、
−  前記第１変数セットの前記入力変数に第１記号値を割り当て、
−  前記第１記号値を有する前記第１変数セットの前記入力変数を用いて、前記ソフトウェアモジュールを記号的に実行することで、前記第１変数セットの前記入力変数及び前記中間変数に関する第１テストケースセットを生成し、
−  前記第１テストケースセットを用いて前記ソフトウェアモジュールを検証する、
よう動作する、システム。
【請求項１１】
１つ以上のプロセッサによって実行可能な命令を有するメモリと、
前記メモリに結合され、前記命令を実行するよう動作する１つ以上のプロセッサと
を有するシステムであって、
前記１つ以上のプロセッサは、前記命令を実行するとき、
−  ソフトウェアモジュール及び該ソフトウェアモジュール用の複数のテストケースにアクセスし、
前記ソフトウェアモジュールは、
１つ以上の変数と、
１つ以上の条件付き分岐点であり、各条件付き分岐点が、前記変数のうちの少なくとも１つの変数によって規定される分岐条件を有し、該分岐条件が満たされるかが、前記少なくとも１つの変数の値に依存する、１つ以上の条件付き分岐点と、を有し、
前記ソフトウェアモジュールの実行中に、前記条件付き分岐点の各々において、前記ソフトウェアモジュールは、該条件付き分岐点の分岐条件が満たされるかに応じて異なる経路に進み、
前記テストケースの各々は、前記条件付き分岐点のうちの少なくとも１つをカバーし、且つ前記条件付き分岐点のうちの前記少なくとも１つの分岐条件を規定する前記少なくとも１つの変数に関する少なくとも１つのテスト値を有し、
−  前記条件付き分岐点の各々に関して、前記複数のテストケースのうちに、該条件付き分岐点をカバーし且つ前記ソフトウェアモジュールを実行中に同一の経路に進ませるテストケースが複数存在する場合に、該条件付き分岐点をカバーし且つ前記ソフトウェアモジュールを実行中に同一の経路に進ませるテストケースのうち１つを除く全てを、前記複数のテストケースから除去し、
−  残りのテストケースから１つ以上の第１テストケースを選択し、各第１テストケースは、前記条件付き分岐点のうちの少なくとも１つが該第１テストケースによってのみカバーされるテストケースであり、
−  前記条件付き分岐点の全てが前記第１テストケース及び第２テストケースのうちの少なくとも１つのテストケースによってカバーされるまで、残りのテストケースから１つ以上の第２テストケースを繰り返し選択し、各繰り返しにおいて選択される第２テストケースは、該繰り返しにおいて最も多数の条件付き分岐点をカバーするテストケースであり、
−  選択された前記第１テストケース及び前記第２テストケースのみを用いて、前記ソフトウェアモジュールをテストする、
よう動作する、システム。
【請求項１２】
プログラムを格納したコンピュータ読み取り可能記憶媒体であって、前記プログラムは、１つ以上の計算装置によって実行されるとき、該１つ以上の計算装置に、
−  ソフトウェアモジュールにアクセスさせ、
前記ソフトウェアモジュールは、
１つ以上の入力変数と、
１つ以上の中間変数であり、各中間変数の値が前記入力変数のうちの少なくとも１つの入力変数の値に直接的あるいは間接的に依存する、１つ以上の中間変数と、
１つ以上の条件付き分岐点であり、各条件付き分岐点が、前記入力変数及び前記中間変数のうちの少なくとも１つの入力変数及び／又は中間変数によって規定される分岐条件を有し、該分岐条件が満たされるかが、前記少なくとも１つの入力変数及び／又は中間変数の値に依存する、１つ以上の条件付き分岐点と、を有し、且つ
前記ソフトウェアモジュールの実行中に、前記条件付き分岐点の各々において、前記ソフトウェアモジュールは、該条件付き分岐点の分岐条件が満たされるかに応じて異なる経路に進み、
−  前記１つ以上の入力変数に対応する１つ以上の変数セットを構築させ、各変数セットは、前記入力変数のうちの１つと、前記入力変数のうちの該１つの値に直接的あるいは間接的に依存する値を有する中間変数とを含み、
−  各変数セットに関して、該変数セットの前記入力変数及び前記中間変数によって影響される平均分岐深さを計算させ、
−  前記１つ以上の変数セットのうち最小の平均分岐深さを有する第１変数セットを選択させ、
−  前記第１変数セットの前記入力変数に第１記号値を割り当てさせ、
−  前記第１記号値を有する前記第１変数セットの前記入力変数を用いて、前記ソフトウェアモジュールを記号的に実行させて、前記第１変数セットの前記入力変数及び前記中間変数に関する第１テストケースセットを生成させ、
−  前記第１テストケースセットを用いて前記ソフトウェアモジュールを検証させる、
コンピュータ読み取り可能記憶媒体。
【請求項１３】
プログラムを格納したコンピュータ読み取り可能記憶媒体であって、前記プログラムは、１つ以上の計算装置によって実行されるとき、該１つ以上の計算装置に、
−  ソフトウェアモジュール及び該ソフトウェアモジュール用の複数のテストケースにアクセスさせ、
前記ソフトウェアモジュールは、
１つ以上の変数と、
１つ以上の条件付き分岐点であり、各条件付き分岐点が、前記変数のうちの少なくとも１つの変数によって規定される分岐条件を有し、該分岐条件が満たされるかが、前記少なくとも１つの変数の値に依存する、１つ以上の条件付き分岐点と、を有し、
前記ソフトウェアモジュールの実行中に、前記条件付き分岐点の各々において、前記ソフトウェアモジュールは、該条件付き分岐点の分岐条件が満たされるかに応じて異なる経路に進み、
前記テストケースの各々は、前記条件付き分岐点のうちの少なくとも１つをカバーし、且つ前記条件付き分岐点のうちの前記少なくとも１つの分岐条件を規定する前記少なくとも１つの変数に関する少なくとも１つのテスト値を有し、
−  前記条件付き分岐点の各々に関して、前記複数のテストケースのうちに、該条件付き分岐点をカバーし且つ前記ソフトウェアモジュールを実行中に同一の経路に進ませるテストケースが複数存在する場合に、該条件付き分岐点をカバーし且つ前記ソフトウェアモジュールを実行中に同一の経路に進ませるテストケースのうち１つを除く全てを、前記複数のテストケースから除去させ、
−  残りのテストケースから１つ以上の第１テストケースを選択させ、各第１テストケースは、前記条件付き分岐点のうちの少なくとも１つが該第１テストケースによってのみカバーされるテストケースであり、
−  前記条件付き分岐点の全てが前記第１テストケース及び第２テストケースのうちの少なくとも１つのテストケースによってカバーされるまで、残りのテストケースから１つ以上の第２テストケースを繰り返し選択させ、各繰り返しにおいて選択される第２テストケースは、該繰り返しにおいて最も多数の条件付き分岐点をカバーするテストケースであり、
−  選択された前記第１テストケース及び前記第２テストケースのみを用いて、前記ソフトウェアモジュールをテストさせる、
コンピュータ読み取り可能記憶媒体。
【請求項１４】
ソフトウェアモジュールにアクセスする手段であり、
前記ソフトウェアモジュールは、
１つ以上の入力変数と、
１つ以上の中間変数であり、各中間変数の値が前記入力変数のうちの少なくとも１つの入力変数の値に直接的あるいは間接的に依存する、１つ以上の中間変数と、
１つ以上の条件付き分岐点であり、各条件付き分岐点が、前記入力変数及び前記中間変数のうちの少なくとも１つの入力変数及び／又は中間変数によって規定される分岐条件を有し、該分岐条件が満たされるかが、前記少なくとも１つの入力変数及び／又は中間変数の値に依存する、１つ以上の条件付き分岐点と、を有し、且つ
前記ソフトウェアモジュールの実行中に、前記条件付き分岐点の各々において、前記ソフトウェアモジュールは、該条件付き分岐点の分岐条件が満たされるかに応じて異なる経路に進む、アクセスする手段と、
前記１つ以上の入力変数に対応する１つ以上の変数セットを構築する手段であり、各変数セットが、前記入力変数のうちの１つと、前記入力変数のうちの該１つの値に直接的あるいは間接的に依存する値を有する中間変数とを含む、構築する手段と、
各変数セットに関して、該変数セットの前記入力変数及び前記中間変数によって影響される平均分岐深さを計算する手段と、
前記１つ以上の変数セットのうち最小の平均分岐深さを有する第１変数セットを選択する手段と、
前記第１変数セットの前記入力変数に第１記号値を割り当てる手段と、
前記第１記号値を有する前記第１変数セットの前記入力変数を用いて、前記ソフトウェアモジュールを記号的に実行し、前記第１変数セットの前記入力変数及び前記中間変数に関する第１テストケースセットを生成する手段と、
前記第１テストケースセットを用いて前記ソフトウェアモジュールを検証する手段と、
を有するシステム。
【請求項１５】
ソフトウェアモジュール及び該ソフトウェアモジュール用の複数のテストケースにアクセスする手段であり、
前記ソフトウェアモジュールは、
１つ以上の変数と、
１つ以上の条件付き分岐点であり、各条件付き分岐点が、前記変数のうちの少なくとも１つの変数によって規定される分岐条件を有し、該分岐条件が満たされるかが、前記少なくとも１つの変数の値に依存する、１つ以上の条件付き分岐点と、を有し、
前記ソフトウェアモジュールの実行中に、前記条件付き分岐点の各々において、前記ソフトウェアモジュールは、該条件付き分岐点の分岐条件が満たされるかに応じて異なる経路に進み、
前記テストケースの各々は、前記条件付き分岐点のうちの少なくとも１つをカバーし、且つ前記条件付き分岐点のうちの前記少なくとも１つの分岐条件を規定する前記少なくとも１つの変数に関する少なくとも１つのテスト値を有する、アクセスする手段と、
前記条件付き分岐点の各々に関して、前記複数のテストケースのうちに、該条件付き分岐点をカバーし且つ前記ソフトウェアモジュールを実行中に同一の経路に進ませるテストケースが複数存在する場合に、該条件付き分岐点をカバーし且つ前記ソフトウェアモジュールを実行中に同一の経路に進ませるテストケースのうち１つを除く全てを、前記複数のテストケースから除去する手段と、
残りのテストケースから１つ以上の第１テストケースを選択する手段であり、各第１テストケースは、前記条件付き分岐点のうちの少なくとも１つが該第１テストケースによってのみカバーされるテストケースである、選択する手段と、
前記条件付き分岐点の全てが前記第１テストケース及び第２テストケースのうちの少なくとも１つのテストケースによってカバーされるまで、残りのテストケースから１つ以上の第２テストケースを繰り返し選択する手段であり、各繰り返しにおいて選択される第２テストケースは、該繰り返しにおいて最も多数の条件付き分岐点をカバーするテストケースである、選択する手段と、
選択された前記第１テストケース及び前記第２テストケースのみを用いて、前記ソフトウェアモジュールをテストする手段と、
を有するシステム。
【発明の詳細な説明】
【技術分野】
【０００１】
この開示は概して、ソフトウェアモジュールのテスト及び検証を行うことに関する。
【背景技術】
【０００２】
ソフトウェアアプリケーションは幾つもの数のモジュールを含むことができ、各モジュールが個々にテストあるいは検証されている。ソフトウェアモジュールは、手動あるいは自動的にテストあるいは検証され得る。手動の場合、人（例えば、ソフトウェアテストエンジニア）が、ソフトウェアモジュールのテストケースを該モジュールの設計仕様に基づいて手作業で設計し、該テストケースの下で該モジュールを実行し、テストケースに合致しないモジュール挙動又は出力を調べる。自動の場合、コンピュータソフトウェア又はハードウェアとして実装されたソフトウェアテストツールが、テスト対象のソフトウェアモジュールのテストケースを自動生成し、テストケースをシミュレートしながらその被テストモジュールを実行し、テストケースに合致しないモジュール挙動又は出力を調べ得る。
【発明の概要】
【発明が解決しようとする課題】
【０００３】
ソフトウェアモジュールのテスト又は検証を支援し得る方法及びシステムが開示される。
【課題を解決するための手段】
【０００４】
特定の一態様によれば、１つ以上の計算装置によって実行される方法は、ソフトウェアモジュールにアクセスすることを含む。前記ソフトウェアモジュールは、１つ以上の入力変数と、１つ以上の中間変数と、１つ以上の条件付き分岐点とを有する。各中間変数の値は、前記入力変数のうちの少なくとも１つの入力変数の値に直接的あるいは間接的に依存する。各条件付き分岐点は、前記入力変数及び前記中間変数のうちの少なくとも１つの入力変数及び／又は中間変数によって規定される分岐条件を有し、該分岐条件が満たされるかは、前記少なくとも１つの入力変数及び／又は中間変数の値に依存する。前記ソフトウェアモジュールの実行中、前記条件付き分岐点の各々において、前記ソフトウェアモジュールは、該条件付き分岐点の分岐条件が満たされるかに応じて異なる経路に進む。当該方法はまた、前記１つ以上の入力変数に対応する１つ以上の変数セットを構築することを含む。各変数セットは、前記入力変数のうちの１つと、前記入力変数のうちの該１つの値に直接的あるいは間接的に依存する値を有する中間変数とを含む。当該方法はまた、各変数セットに関して、該変数セットの前記入力変数及び前記中間変数によって影響される平均分岐深さを計算し、前記１つ以上の変数セットのうち最小の平均分岐深さを有する第１変数セットを選択することを含む。当該方法は更に、前記第１変数セットの前記入力変数に第１記号値を割り当て、前記第１記号値を有する前記第１変数セットの前記入力変数を用いて、前記ソフトウェアモジュールを記号的に実行し、前記第１変数セットの前記入力変数及び前記中間変数に関する第１テストケースセットを生成することを含み、前記第１テストケースセットを用いて前記ソフトウェアモジュールが検証される。
【０００５】
特定の他の一態様によれば、１つ以上の計算装置によって実行される方法は、ソフトウェアモジュール及び該ソフトウェアモジュール用の複数のテストケースにアクセスすることを含む。前記ソフトウェアモジュールは、１つ以上の変数と１つ以上の条件付き分岐点とを有する。各条件付き分岐点は、前記変数のうちの少なくとも１つの変数によって規定される分岐条件を有し、該分岐条件が満たされるかは、前記少なくとも１つの変数の値に依存する。前記ソフトウェアモジュールの実行中、前記条件付き分岐点の各々において、前記ソフトウェアモジュールは、該条件付き分岐点の分岐条件が満たされるかに応じて異なる経路に進む。前記テストケースの各々は、前記条件付き分岐点のうちの少なくとも１つをカバーし、且つ前記条件付き分岐点のうちの前記少なくとも１つの分岐条件を規定する前記少なくとも１つの変数に関する少なくとも１つのテスト値を有する。当該方法はまた、前記条件付き分岐点の各々に関して、前記複数のテストケースのうちに、該条件付き分岐点をカバーし且つ前記ソフトウェアモジュールを実行中に同一の経路に進ませるテストケースが複数存在する場合に、該条件付き分岐点をカバーし且つ前記ソフトウェアモジュールを実行中に同一の経路に進ませるテストケースのうち１つを除く全てを、前記複数のテストケースから除去することを含む。当該方法はまた、残りのテストケースから１つ以上の第１テストケースを選択することを含み、各第１テストケースは、前記条件付き分岐点のうちの少なくとも１つが該第１テストケースによってのみカバーされるテストケースである。当該方法は更に、前記条件付き分岐点の全てが前記第１テストケース及び第２テストケースのうちの少なくとも１つのテストケースによってカバーされるまで、残りのテストケースから１つ以上の第２テストケースを繰り返し選択することを含み、各繰り返しにおいて選択される第２テストケースは、該繰り返しにおいて最も多数の条件付き分岐点をカバーするテストケースである。選択された前記第１テストケース及び前記第２テストケースのみを用いて、前記ソフトウェアモジュールがテストされる。
【図面の簡単な説明】
【０００６】
【図１】一例に係るソフトウェアモジュール上で記号的実行を行うステップを表す実行フロー例を示す図である。
【図２】ソフトウェアモジュールの入力変数を記号的に実行する順序を決定する方法例を示す図である。
【図３】ソフトウェアモジュールの入力変数を記号的に実行する順序を決定するシステム例を示す図である。
【図４】複数レベルのネスト化された条件付き分岐を有する一例に係るソフトウェアモジュールの実行経路を示す図である。
【図５】テストケースセットのサイズを縮小する方法例を示す図である。
【図６】テストケースセットのサイズを縮小するシステム例を示す図である。
【図７】一例に係るソフトウェアモジュールの入力変数の例のテスト値の例を表すグラフ例を示す図である。
【図８】一例に係るソフトウェアモジュールの実行経路上でのテスト網羅率を示す二部グラフ例を示す図である。
【図９】一例に係るネットワーク環境を示す図である。
【図１０】一例に係るコンピュータシステムを示す図である。
【発明を実施するための形態】
【０００７】
以下、図面に示す幾つかの実施形態を参照して詳細に説明する。以下の説明においては、この開示の十分な理解を提供するため、数多くの具体的詳細事項を説明する。しかしながら、ここで開示される事項は、それら具体的詳細事項の一部又は全てを用いずして実施されることもある。また、この開示をいたずらに不明瞭にしないよう、周知の処理ステップ及び／又は構造は詳細には説明しない。さらに、ここでは特定の実施形態との関連で説明するが、理解されるように、ここでの説明は、本開示をそのような実施形態に限定することを意図するものではない。逆に、ここでの説明は、添付の請求項により定められる本開示の精神及び範囲に含まれ得る代替例、変形例及び均等例に及ぶものである。
【０００８】
ソフトウェアモジュールをテストあるいは検証するため、典型的に、例えば該モジュールの設計仕様又はその他の種類の要求（例えば、機能上、挙動上若しくは性能上の要求）に基づいて、該モジュールのためのテストケースが生成される。その後、テストケースの下でソフトモジュールが実行され、該モジュールの挙動又は出力がテストケースに対して検証される。特定の実施形態において、各テストケースは、一組の入力値と、該入力値に関連してソフトウェアモジュール上で実行される具体的なテストを記述する情報とを含み得る。特定の実施形態において、入力値は、ソフトモジュールがテストされているときに該モジュールの入力変数に割り当てられ得る。各入力値は、モジュールに特定の応答（例えば、特定の出力値を提供する）をさせるように選択され得る。テスト情報は、ソフトウェアモジュールのどのような特定の機能がテストされるか、どのような状況下でどのように入力値がソフトウェアモジュールの入力変数に適用されるか、ソフトウェアモジュールが入力値に応答して提供すべき正しい挙動又は出力値は何か、等々を記述し得る。
【０００９】
ソフトウェアモジュールに関するテストケースは、手動（例えば、人によって）あるいは自動（例えば、コンピュータハードウェア又はソフトウェアとして実装されたテストケース生成ツールによって）の何れかで生成され得る。しばしば、手動生成されるテストケースは、テスト対象のソフトウェアモジュールのソースコードの様々な部分で比較的乏しい網羅率（カバレッジ）を有し、また、テストケースを手動生成する実処理は、時間を消費し且つコストのかかるものとなる。一方、自動生成されるテストケースは、より良好なテスト網羅率を提供するとともに、より少ない時間及び人的労力のみを必要とする。
【００１０】
特定の実施形態において、テストケースの入力値は、テスト対象ソフトウェアモジュール上で記号的実行（symbolic  execution）を行うことによって取得され得る。しかしながら、この手法は幾つかの欠点を有することがある。記号的実行は、ＣＰＵ時間及びその他の種類のコンピュータリソースの点で非常に高くつき、ソフトウェアモジュール上で、典型的に、一度に該ソフトウェアモジュールの１つの入力変数のみを記号的にすることによって実行される。ソフトウェアモジュールが２つ以上の入力変数を有する場合、記号的実行が該ソフトウェアモジュール上で何度も実行される必要がある。また、複数の入力変数のうち、何れの１つが最初に記号的に実行され、何れの１つが２番目に記号的に実行されるかに依存して、記号的実行から得られる入力値は、異なり得るとともに異なったテスト網羅率をもたらし得る。第２に、ソフトウェアモジュールが比較的多数の入力変数を有する場合、記号的実行から得られる入力変数の数、ひいては、生成されるテストケースの数は、テストケース・イクスプロージョン（爆発）といえるほどに非常に大きいものとなり得る。テストケース爆発は、テストケース群が例えばテスト集合（テストスイート）に統合されるときに多大な回帰テスト時間を生じさせ得る。
【００１１】
これらの欠点を解消するため、複数の入力変数を有するソフトウェアモジュール上で記号的実行を行うとき、特定の実施形態は、それら入力変数を記号的に実行する順序を、入力変数が影響する分岐深さに基づいて知的に決定し得る。また、記号的実行の結果としてテストケースが生成された後、特定の実施形態は、ソフトウェアモジュールをテストするために最終的に使用されるテストケースの数を削減するため、重複あるいは過分なテスト網羅率をもたらすテストケースを排除し得る。
【００１２】
コンピュータサイエンスの分野において、記号的実行は、抽象解釈として実際の値ではなく記号的な値を追跡することによるソフトウェアプログラムの分析を意味する。これは、ソフトウェアモジュールへの入力を記号変数として扱うノンエクスプリシット状態モデル検査技術である。記号的実行は、記号変数を用いてソフトウェアモジュール内の限定された経路を実行することによって複雑な数学的方程式を作成し、ソルバーを用いて該複雑な方程式を解く（典型的に、決定手順として知られる）ことで、もしあれば、誤ったシナリオを得る。エクスプリシット状態モデル検査と異なり、記号的実行は、分析対象のソフトウェアモジュールの全ての入力変数の、全ての取り得る入力値及び全ての取り得るユースケースを分析することができる。
【００１３】
記号的実行の更なる説明のため、以下の“ｆｏｏ”という名のソフトウェアモジュール例を考える。
（外１）
2011248887.tif 000003
【００１４】
ソフトウェアモジュール“ｆｏｏ”は、２つの入力変数“ａ”及び“ｂ”と、２つの中間変数“ｃ”及び“ｄ”とを有している。特定の実施形態において、ソフトウェアモジュールの中間変数は、そのソフトウェアモジュールにローカルな変数であり、そのソフトウェアモジュールのコンテキスト内にのみ存在する。中間変数はまた、局所的な範囲を有するのみであり、且つその中間変数が宣言されたソフトウェアモジュール内からのみアクセス可能であるので、ローカル変数とも呼ばれる。中間変数の値は、直接的あるいは間接的に、ソフトウェアモジュールの１つ以上の入力変数の値に依存し得る。例えば、モジュール“ｆｏｏ”では、中間変数“ｃ”の値は、上記コードの第３行にて指し示されるように、入力変数“ａ”及び“ｂ”の値に直接的に依存し、中間変数“ｄ”の値は、上記コードの第５行にて指し示されるように、中間変数“ｃ”を介して間接的に入力変数“ａ”及び“ｂ”の値に依存する。また、モジュール“ｆｏｏ”は、上記コードの第４行に、“ｉｆ−ｅｌｓｅ”命令文によって引き起こされる条件付き分岐点を含んでいる。第４行の条件付き分岐点は、分岐条件“！（ｃ．ｅｑｕａｌｓ（“ｑｒｓ”））”に関連付けられている。この分岐条件が満足される、あるいは成立するかに応じて、すなわち、中間変数“ｃ”が“ｑｒｓ”に等しいかに応じて、モジュール“ｆｏｏ”はそれ以降、異なる実行経路へと進み、モジュール“ｆｏｏ”のコードの異なる部分が実際に実行される。より具体的には、中間変数“ｃ”が“ｑｒｓ”に等しくない場合には、上記コードの第５及び６行にて指し示されるように、中間変数“ｄ”の値が計算されて返される。一方、中間変数“ｃ”が“ｑｒｓ”に等しい場合には、上記コードの第８行にて指し示されるように、中間変数“ｃ”の値が返される。
【００１５】
モジュール“ｆｏｏ”上で記号的実行が行われるとき、その入力変数及び中間変数の各々に、実際値に代えて記号値が割り当てられる。図１は、モジュール“ｆｏｏ”上で記号的実行を行うステップを表す一例に係る実行フロー１００を示している。この例において、入力変数“ａ”は記号値“ｘ”を割り当てられ、入力変数“ｂ”は記号値“ｙ”を割り当てられ、中間変数“ｃ”は記号値“ｚ”を割り当てられ、中間変数“ｄ”は記号値“ｗ”を割り当てられている。変数“ａ”、“ｂ”、“ｃ”及び“ｄ”は“ｓｔｒｉｎｇ”型であるので、記号値“ｘ”、“ｙ”、“ｚ”及び“ｗ”は各々、任意の文字列を表す。
【００１６】
また、“Φ”は、実行経路に沿った様々な点での記号的実行の結果を表す記号表現である。より具体的には、上記コードの第２行に対応する１０２において、変数“ａ”、“ｂ”、“ｃ”及び“ｄ”にそれぞれの記号値“ｘ”、“ｙ”、“ｚ”及び“ｗ”が割り当てられ、“Φ”は当初、エンプティすなわちヌル表現を有する。この実行が更に進むとき、どのコードが実行されたかに応じて“Φ”に表現が追加される。上記コードの第３行に対応する１０４において、“Φ”は表現“ｚ＝ｃｏｎｃａｔ（ｘ、ｙ）”を有している。これは、上記コードの第３行が“ｃ＝ａ．ｃｏｎｃａｔ（ｂ）”であり、“ｘ”、“ｙ”及び“ｚ”がそれぞれ変数“ａ”、“ｂ”及び“ｃ”に割り当てられた記号値であるからである。次いで、上記コードの第４行は条件付き分岐点であり、それ以降、この実行が進み得る２つの取り得る実行経路が存在する。故に、記号的実行も１０４から下に、上記コードの第５及び６行に対応する１０６及び１０８を含む第１経路“ＰＡＴＨ１”と、上記コードの第８行に対応する１１０を含む第２経路“ＰＡＴＨ２”という２つの異なる経路に進み得る。
【００１７】
ＰＡＴＨ１を進めるには、変数“ｃ”は“ｑｒｓ”に等しくなく、これは記号値“ｚ”が“ｑｒｓ”に等しくないことを意味する。故に、１０６にて、表現“ｚ！＝“ｑｒｓ””が“Φ”に追加される。逆に、ＰＡＴＨ２を進めるには、変数“ｃ”は“ｑｒｓ”に等しく、これは記号値“ｚ”が“ｑｒｓ”に等しいことを意味する。故に、１１０にて、表現“ｚ＝“ｑｒｓ””が“Φ”に追加される。ＰＡＴＨ１に沿うとき、変数“ｄ”の値は上記コードの第５行にて決定され、これが１０８に対応する。故に、１０８にて、表現“ｗ＝ｃｏｎｃａｔ（ｚ，“ｔ”）”が“Φ”に追加される。なお、“ｚ＝ｃｏｎｃａｔ（ｘ、ｙ）”であるので、“ｗ”の表現は“ｗ＝ｃｏｎｃａｔ（ｃｏｎｃａｔ（ｘ、ｙ），“ｔ”）”に書き直され得る。１０８はＰＡＴＨ１の終点であるので、１０８における“Φ”の表現は、ＰＡＴＨ１の終点に到達するために満足される必要がある条件を記号の形態で表している。同様に、１１０はＰＡＴＨ２の終点であるので、１１０における“Φ”の表現は、ＰＡＴＨ２の終点に到達するために満足される必要がある条件を記号の形態で表している。
【００１８】
特定の実施形態において、１０８での“Φ”の表現の値を求めることは、モジュール“ｆｏｏ”をＰＡＴＨ１の終点まで到達させた入力変数“ａ”及び“ｂ”の実際値を提供し、また、１１０での“Φ”の表現の値を求めることは、モジュール“ｆｏｏ”をＰＡＴＨ２の終点まで到達させた入力変数“ａ”及び“ｂ”の実際値を提供し得る。特定の実施形態において、これらの実際値は、その後、モジュール“ｆｏｏ”をテストするときに入力変数“ａ”及び“ｂ”に割り当てられ得るテスト値として使用され得る。これらのテスト値は、ＰＡＴＨ１の終点及びＰＡＴＨ２の終点の双方にモジュール“ｆｏｏ”を到達させる入力変数“ａ”及び“ｂ”の実際値を含むので、これらのテスト値が適用される場合、モジュール“ｆｏｏ”の全ての取り得る実行経路がテストされることが保証され得る。
【００１９】
上述のように、記号的実行は高くつくので、通常、一度に１つの入力変数のみが記号的にされて記号的に実行される。ソフトウェアモジュールが複数の入力変数を有する場合、記号的実行は、一度に１つずつ全ての入力変数にわたって繰り返し実行される必要がある。記号的にされるように複数の入力変数が選択される順序は、最終的な網羅率の点で、自動生成されるテストセットの品質に多大な影響を有し得る。例えば、以下のコードセグメントを考える。
（外２）
2011248887.tif 000004
【００２０】
“ａ”及び“ｂ”は入力変数であるとする。入力変数“ａ”が最初に記号的にされる場合、記号的実行を行うことは、例えば、第１行の条項“（ａ＞５）”に対応する変数“ａ”の２つの具体値（すなわち、実際値）６及び４を生じさせ得る。６及び４である“ａ”の具体値を用いて“ｂ”が２番目に記号的にされる場合、記号的実行を行うことによって２つの更なる“ｂ”の具体値１及び３がもたらされ得る。入力値の対（ａ，ｂ）＝｛（６，１），（６，３），（４，１），（４，３）｝は、上記コードセグメント中の全ての取り得る実行経路をカバーすることが保証される。
【００２１】
一方、入力変数“ａ”が最初に記号的にされることに代えて、入力変数“ｂ”が最初に記号的にされるように選択されるとする。記号的実行において、入力変数“ａ”について何らかの具体値が仮定される必要があるため、“ａ”にランダム値が割り当てられ得る。“ａ”の値が５未満であるように仮定される場合、記号的実行は、第３及び４行にある“ｉｆ”ブロックを完全に見落とすことになる。結果として、記号的実行は変数“ｂ”について有意義な値を生成することができない。最終的に得られるテストセットは、入力変数“ｂ”について生成された何らかのランダム値を用いてその後に計算された、“ａ”の２つの値のみを有することになる。得られるテストセットは、（ａ，ｂ）＝｛（６，７），（４，７）｝のようなものに見えることになる。ただし、７は、入力変数“ｂ”に割り当てられたランダム値である。この第２のテストセットは、第１のテストセットから得られるコード網羅率より遙かに劣悪なコード網羅率をもたらすテスト入力値を生じさせることになる。従って、記号的実行の目的で入力変数が記号的にされる順序は、自動生成されるテストセットによって得られる最終的なコード網羅率のレベルに多大なる影響を及ぼし得る。
【００２２】
この可能性ある問題を解決するため、特定の実施形態は、ソフトウェアモジュールの複数の入力変数を記号的に実行する順序を知的に決定し得る。図２は、ソフトウェアモジュールの入力変数を記号的に実行する順序を決定する一例に係る方法を示し、図３は、ソフトウェアモジュールの入力変数を記号的に実行する順序を決定する一例に係るシステム３００を示している。図２及び３を互いに関連付けて説明する。
【００２３】
特定の実施形態において、ソフトウェアモジュールは任意の数の入力変数と任意の数の中間変数とを有し得る。特定の実施形態において、各中間変数の値は、直接的あるいは間接的に、少なくとも１つの入力変数の値に依存し得る。すなわち、入力変数の値に対する変化は、その入力変数に直接的あるいは間接的に依存する中間変数の値に対する変化を生じさせる。当然ながら、１つの中間変数が複数の入力変数に依存することがあり、また、複数の中間変数が同一の入力変数に依存することがある。特定の実施形態は、図２のステップ２０２に示すように、入力変数の関連性分析を実行することによって、何れの中間変数が直接的あるいは間接的にソフトウェアモジュールの何れの入力変数に依存するかを決定し得る。特定の実施形態において、ステップ２０２は、図３に示すシステム３００の構成要素３０２によって実行され得る。構成要素３０２は、ソフトウェアモジュール３１２を入力として用いて、ソフトウェアモジュール３１２の入力変数について関連性分析を実行するものである。
【００２４】
特定の実施形態において、関連性分析は、一組の記号変数に関連するソフトウェアモジュールの変数の組を計算し得る。特定の実施形態は、一組の記号入力が与えられたときに変数が記号値を格納する場合に、その変数を関連あるものと見なし得る。これは、ソフトウェア解析は抽象解釈のモデル検査と見なされ得るという洞察に基づく。結果として、ソフトウェア解析は、抽象解釈による健全性保証と、モデル検査による自動化の利益とを享受する。特定の実施形態において、ソフトウェアモジュール３１２上で実行される関連性分析は、重み付けプッシュダウンモデル検査技術に基づき得る。関連性分析は、２００９年２月２７日に出願された“Efficient  Symbolic  Execution  of  Software  Using  Static  Analysis”なるタイトルの米国特許出願第１２／３９５５１５号、及び２００９年３月１９日に出願された“Environmental  Data  Refinement  Based  on  Static  Analysis  and  Symbolic  Execution”なるタイトルの米国特許出願第１２／４０７６９５号に更に詳細に説明されている。
【００２５】
何れの変数がソフトウェアモジュールの何れの入力変数に依存するかが決定されると、特定の実施形態は、図２のステップ２０４に示すように、各入力変数に対する変数セットを構築し得る。変数セットは、入力変数自体と、関連性分析の結果に従った、該入力変数に直接的あるいは間接的に依存する全ての中間変数とを含む。斯くして構築される変数セットの数は、ソフトウェアモジュールが有する入力変数の数に等しい。なお、中間変数は複数の入力変数に依存し得るので、１つの中間変数が複数の変数セットに属することがあり得る。
【００２６】
各変数セットに対し、特定の実施形態は、図２のステップ２０６に示すように、該セットからの入力変数及び中間変数によって到達される平均分岐深さを計算し得る。特定の実施形態において、ステップ２０６は、図３に示すシステム３００の構成要素３０４によって実行され得る。特定の実施形態において、ソフトウェアモジュールは如何なる数の条件付き分岐点（例えば、“ｉｆ”条項）を有していてもよく、各条件付き分岐点は、少なくとも１つの入力変数又は中間変数によって規定される分岐条件を有する。分岐条件が満たされるかに応じて、ソフトウェアモジュールはそれ以降、異なる実行経路を進み得る。例えば、以下のコードセグメントを考える。
（外３）
2011248887.tif 000005
【００２７】
第１行に条件付き分岐点が存在し、その分岐条件は“ｍ＞ｎ  ＆＆  ｋ＜＝１０”である。なお、１つの分岐条件が複数の副（サブ）条件（例えば、“ｍ＞ｎ”及び“ｋ＜＝１０”）を含んでいてもよい。第１行の分岐条件が満足される（すなわち、成立する）には、変数“ｍ”の値が変数“ｎ”の値より大きい必要があり、且つ変数“ｋ”の値が１０以下である必要がある。第１行の分岐条件が満たされる場合、第２−１１行の間のコードが実行される。それ以外の場合（すなわち、第１行の分岐条件が満たされない場合）には、第１３行にあるコードが実行される。第３行に別の条件付き分岐点が存在し、その分岐条件は“ｋ＞２”である。第３行の分岐条件が満足されるには、変数“ｋ”の値が２より大きい必要がある。同様に、第３行の分岐条件が満たされる場合、第４行にあるコードが実行される。それ以外の場合には、第６−１１行の間のコードが実行される。第６行に第３の条件付き分岐点が存在し、その分岐条件は、複数の副条件（例えば、“ｎ＝＝ｋ”及び“ｎ＝＝ｍ”）を含む“ｎ＝＝ｋ｜｜ｎ＝＝ｍ”である。第６行の分岐条件が満足されるには、変数“ｎ”の値が変数“ｋ”の値又は変数“ｍ”の値の何れかに等しい必要がある。第６行の分岐条件が満たされる場合、第７行にあるコードが実行される。それ以外の場合には、第９行にあるコードが実行される。
【００２８】
また、第３行の条件付き分岐点は第１行の条件付き分岐点内に入れ子にされ（ネスト化され）ており、さらに、第６行の条件付き分岐点は第３行の条件付き分岐点内にネスト化されている。第１行の条件付き分岐点に関する分岐条件が満たされない場合、第３行の条件付き分岐点は、そのコードの実行中に到達されることはない。しかしながら、第３行の条件付き分岐点に関する分岐条件が満たされない場合、第６行の条件付き分岐点は、そのコードの実行中に到達される。実際には、第６行の条件付き分岐点に到達するためには、第１行の分岐条件は満たされる必要があるが、第３行の分岐条件は満たされることができない。
【００２９】
図４は、複数レベルのネスト化された条件付き分岐を有する一例に係るソフトウェアモジュールの実行経路を示している。条件付き分岐点４０２において、“条件１”が満たされる場合、実行経路は処理ステップ４１２に進み、“条件１”が満たされない場合、実行経路は処理ステップ４１４に進む。条件付き分岐点４０２内にネスト化された条件付き分岐点４０４において、“条件２”が満たされる場合、実行経路は処理ステップ４１６に進み、“条件２”が満たされない場合、実行経路は終了する。やはり条件付き分岐点４０２内にネスト化された条件付き分岐点４０６において、“条件３”が満たされる場合、実行経路は終了し、“条件３”が満たされない場合、実行経路は条件付き分岐点４０８に進む。そして、条件付き分岐点４０６内に更にネスト化された条件付き分岐点４０８において、“条件４”が満たされる場合、実行経路は処理ステップ４１８に進み、“条件４”が満たされない場合、実行経路は処理ステップ４２２に進む。図４においては、全部で３階層のネスト化された条件付き分岐が存在している。
【００３０】
複数の変数セットのうちの１つからの入力変数及び中間変数によって到達される平均分岐深さを計算するため、該セットからの入力変数及び各中間変数に対し、特定の実施形態は、その入力変数又はその中間変数によって到達される分岐深さを計算し得る。その後、特定の実施形態は、全ての個々の入力変数及び中間変数について計算された分岐深さの平均を取って、該変数セットの平均分岐深さを決定し得る。該変数セットからの複数の変数のうちの１つによって到達される分岐深さを計算するため、特定の実施形態は、ソフトウェアモジュール内の条件付き分岐点の各々を、最も外側の条件付き分岐点から始めて、徐々に内部のネスト化された条件付き分岐点へと進みながら調べ得る。その変数が、或る条件付き分岐点に関連付けられた分岐条件に影響を及ぼす場合、特定の実施形態は、その変数の分岐深さを１だけ増大させ得る。上述のコードセグメント例においては、第１行の条件付き分岐点に関する分岐条件は変数“ｍ”、“ｎ”及び“ｋ”に影響される。一緒になって該分岐条件を形成する副条件に、３つ全ての変数が関与しているからである。一方、第３行の条件付き分岐点に関する分岐条件は、変数“ｋ”のみが該分岐条件に関与しているため、変数“ｋ”によって影響されるのみである。
【００３１】
全ての変数セットに関して、平均分岐深さが斯くして計算されると、特定の実施形態は、図２のステップ２０８に示すように、最小の平均分岐深さを有する変数セットを選択し得る。同一の最小平均分岐深さを有する変数セットが複数存在する場合、特定の実施形態は、最小平均分岐深さを有する複数の変数セットのうちの１つをランダムに選択してもよい。
【００３２】
特定の実施形態は、図２のステップ２１０に示すように、選択された変数セットからの入力変数について記号的実行を行って、ソフトウェアモジュールのテストケースを生成し得る。特定の実施形態において、ステップ２１０は、図３に示したシステム３００の構成要素３０６によって実行され得る。構成要素３０６は、出力として一組のテストケース３１４を提供するものである。図１に関連して上述したように、特定の実施形態は、選択された変数セットからの入力変数に記号値を割り当て、ソフトウェアモジュール上で記号的実行を行い、異なる実行経路の終点で得られる記号表現（例えば、“Φ”）を解くことで、選択された変数セットからの入力変数に関する実際値を取得し得る。これら実際値は、後にソフトウェアモジュールがテストされるときに入力変数に適用されるべきテスト値として使用され得るものである。入力変数に関するこれらの実際値は、ソフトウェアモジュールのテストケースを生成するために使用され得る。特定の実施形態は、毎回別の変数セットを選択して、この処理を複数回繰り返し得る。例えば、第２の繰り返しにおいて、２番目に小さい平均分岐深さを有する変数セットが選択され、記号値を有するこの第２の変数セットからの入力変数を用いて、ソフトウェアモジュール上で記号的実行が行われ得る。この記号的実行の結果に基づいて、この入力変数に関する実際値が決定され得る。この場合も、複数の変数セットが、同一の、この繰り返しにおける平均分岐深さを有する場合、それらの変数セットのうちの１つがランダムに選択され得る。第３の繰り返しにおいて、３番目に小さい平均分岐深さを有する変数セットが選択され、記号値を有するこの第３の変数セットからの入力変数を用いて、ソフトウェアモジュール上で記号的実行が行われ得る。そして、ソフトウェアモジュールに対して十分なテストケースが得られるまで、同様に繰り返される。換言すれば、各繰り返しにおいて最小の平均分岐深さを有する変数セットが該繰り返しのために選択され、選択された変数セットからの入力変数に関して実際値が決定される。
【００３３】
図２に示した処理又はその他の好適な手段の何れかを介してソフトウェアモジュールに対して一組のテストケース（テストケースセット）が生成されるとき、時にして、該セットからの全てのテストケースがソフトウェアモジュールについて価値あるテストカバレッジを提供するわけでないことがあり、また、ソフトウェアモジュールをテストするためにこれら全てのテストケースを適用すると、多大なリソース（例えば、コンピュータリソースの点で）を必要とすることがある。特定の実施形態は、上記テストケースセットからの個々のテストケースのカバレッジ値を調べ、ソフトウェアモジュールをテストするために、それらテストケースのうちの部分集合（サブセット）のみを選択してもよい。図５は、テストケースセットのサイズを縮小するための一例に係る方法を示し、図６は、テストケースセットのサイズを縮小する一例に係るシステム６００を示している。図５及び６を互いに関連付けて説明する。
【００３４】
上述のように、特定の実施形態において、ソフトウェアモジュールは、任意の数の入力変数と、それら入力変数のうちの少なくとも１つに各々が直接的あるいは間接的に依存する任意の数の中間変数と、任意の数の条件付き分岐点とを有し得る。各条件付き分岐点は、入力変数又は中間変数のうちの少なくとも１つに影響される分岐条件に関連付けられる。特定の実施形態において、所与の１つの入力変数に関し、該入力変数自体によって、あるいは該入力変数に直接的あるいは間接的に依存する何れかの中間変数によって、の何れかで影響を受ける分岐条件を有する全ての条件付き分岐点が、該入力変数に影響されるものと見なされる。例えば、中間変数“ｊ”が入力変数“ｉ”に依存すると仮定する。さらに、１つの条件付き分岐点が、入力変数“ｉ”に影響を受ける分岐条件を有し、且つ別の１つの条件付き分岐点が、中間変数“ｊ”に影響を受ける分岐条件を有すると仮定する。この場合、中間変数“ｊ”は入力変数“ｉ”に依存しているので、双方の条件付き分岐点が、入力変数“ｉ”に影響されるものと見なされる。
【００３５】
特定の実施形態において、上述のテストケースセットにおいて、該セットからの各テストケースは、ソフトウェアモジュールのテスト中にテスト入力値としてソフトウェアモジュールの入力変数に適用され得る実際値の組み合わせを含み得る。例えば、ソフトウェアモジュールが、“ｉｎｔｅｇｅｒ”型の３つの入力変数“ａ”、“ｂ”及び“ｃ”を有すると仮定する。さらに、入力変数“ａ”は実際値２及び７を有し、入力変数“ｂ”は実際値５及び１１を有し、入力変数“ｃ”は実際値５２、９及び２７を有することが決定されていると仮定する。３つの入力変数のこれらの実際値から、ソフトウェアモジュールに対して、１２個の取り得るテストケースを含むセットが生成され得る。何故なら、これら３組の実際値には１２個の固有の組み合わせ：
【表１】
2011248887.tif 000006
が存在するからである。
【００３６】
特定の実施形態は、図５のステップ５０２に示すように、ソフトウェアモジュールに対して生成されたテストケースセットを分析し得る。特定の実施形態において、ステップ５０２は、図６に示したシステム６００の構成要素６０２によって実行され得る。構成要素６０２は、分析のためにテストケースセット６１２を入力として取り、テストケースセット６１２から冗長なテストケースを除去することによって、テストケースセット６１２のサイズを縮小することを試みる。
【００３７】
ソフトウェアモジュールの個々の条件付き分岐点は、入力変数に影響される。すなわち、或る入力変数にテスト値として割り当てられる相異なる実際値は、ソフトウェアモジュールを、該入力変数に影響される或る条件付き分岐点から通じる相異なる実行経路に進ませ得る。上述の例において、入力変数“ａ”は条件付き分岐点“ｃｂｐ１”に影響を及ぼすと仮定する。条件付き分岐点“ｃｂｐ１”から、ソフトウェアモジュールは下方に、２つの異なる実行経路に進み得る。より具体的には、入力変数“ａ”にテスト値２が割り当てられる場合、ソフトウェアモジュールは一方の実行経路に進み、入力変数“ａ”にテスト値７が割り当てられる場合、ソフトウェアモジュールは他方の実行経路に進み得る。この場合、入力変数“ａ”の値が２である全てのテストケースは第１の実行経路を対象とし、上述の例では、そのようなテストケースが６個存在する。同様に、入力変数“ａ”の値が７である全てのテストケースは第２の実行経路を対象とし、上述の例では、そのようなテストケースがやはり６個存在する。
【００３８】
特定の実施形態は、個々の入力変数に割り当てられ得るテストケースセットからのテスト値を表すグラフを構築し得る。図７は、入力変数“ａ”、“ｂ”及び“ｃ”を有する上述の例で構築される一例に係るグラフ７００を示している。グラフ７００内の各エッジは１つの入力変数を表し、グラフ７００内の各ノードは、例示した１２個のテストケースからの或る入力変数に関して取り得る１つのテスト値を表している。グラフ７００の異なる実行経路に沿って進むことは、最終的に、異なるテストケースにつながる。特定の実施形態において、このようなグラフは、何れのテストケースがソフトウェアモジュールの何れの実行経路をカバーするかを特定する助けとなり得る。特定の実施形態において、同一の実行経路を対象とする複数のテストケースが存在する場合、図５のステップ５０４に示すように、冗長なテストケースのうち１つを残して全てがテストケースセットから除去され得る。そのような追加的なテストケースは、実際には、ソフトウェアモジュールに対して如何なる追加のテストカバレッジをも提供しないからである。これにより、テストケースセットのサイズが縮小され得る。例えば、図７の場合、ノード７０２及び７０４において、ノード７０２及び７０４からのグラフ７００のその後の分岐はソフトウェアモジュールの実行経路に、ノード７０６、７０８及び７１２の位置のテストケースによってカバーされていないような新たなテストカバレッジを提供するものでないことが決定され得る。故に、ノード７０２及び７０４より下の全てのテストケースが、テストケースセットから除去され得る。
【００３９】
図７に示したグラフ７００のようなグラフを用いることでは、テストケースセットから全ての冗長テストケースを除去することができないことがある。特定の実施形態は、図８に一例を示すような二部（bipartite）グラフに基づいて、テストケースセットのサイズを更に縮小し得る（例えば、テストセット圧縮を更に実行する）。特定の実施形態において、例えば図８に示したものなどの二部グラフが、図６に示したシステム６００の構成要素６０４によって、ソフトウェアモジュールのテストケース及び条件付き分岐に対して構築され得る。特定の実施形態において、二部グラフ（例えば、二部グラフ８００）は２つの部分を含み得る。１つの部分（例えば８１０）はテストケースセットからの残存テストケースを表し、各ノードが残存テストケースのうちの１つを表す。もう１つの部分（例えば８２０）はソフトウェアモジュールの全ての取り得る条件付き分岐を表し、各ノードが条件付き分岐のうちの１つを表す。或るテストケースが或る条件付き分岐をカバーする場合、１つの有向エッジが、そのテストケースを表す部分８１０内のノードを、その条件付き分岐を表す部分８２０内のノードに結び付ける。或る１つの条件付き分岐が、如何なる利用可能なテストケースによってもカバーされない（例えば、ノード８２２）、唯一のテストケースによってカバーされる（例えば、ノード８２４）、あるいは複数のテストケースによってカバーされる（例えば、ノード８２６）の何れもが可能である。
【００４０】
斯くして二部グラフ（例えば、二部グラフ８００）が構築されると、特定の実施形態は、図５のステップ５０６及び５０８に示すように、欲張り（グリーディ）アルゴリズムを用いて反復的にテストケースを選択し得る。特定の実施形態において、ステップ５０６及び５０８は、図６に示したシステム６００の構成要素６０６によって実行され得る。構成要素６０６は、テストケースセット６１２から選択されたテストケースのサブセット６１４を出力として提供する。特定の実施形態は、先ず、図５のステップ５０６に示すように、条件付き分岐のうちの少なくとも１つを単独でカバーする二部グラフ内の不可欠なテストケースの全てを選択し得る。すなわち、選択される不可欠なテストケースの各々は、或る特定の条件付き分岐をカバーする唯一のテストケースである。例えば、図８において、ノード８１２は、ノード８２４及び８２８によって表される条件付き分岐をカバーする唯一のテストケースであるので、不可欠なテストケースを表している。同様に、ノード８１４も不可欠なテストケースを表している。これらのテストケースは最初に選択される。しかしながら、ノード８１６は、如何なる条件付き分岐も単独ではカバーしていないので、不可欠なテストケースを表しておらず、故に、このテストケースはこの時点では選択されない。
【００４１】
不可欠なテストケースが全て選択されると、それらは二部グラフから除去され得る。また、不可欠なテストケースがカバーする条件付き分岐も二部グラフから除去され得る。次に、二部グラフ内に残ったテストケースから、特定の実施形態は、図５のステップ５０８に示すように、利用可能なテストケースによってカバーされる全ての条件付き分岐が、選択されたテストケースによってカバーされるまで、反復的に、一度に最も多数の条件付き分岐をカバーするテストケースを選択し、選択したテストケースを二部グラフから除去し得る。利用可能なテストケースの何れにもカバーされていない条件付き分岐（例えば、図８のノード８２２によって表される条件付き分岐）が存在する場合、特定の実施形態は、この欲張りアルゴリズムの目的上それを無視し得る。その後、特定の実施形態は、図５のステップ５１０に示すように、選択されたテストケースのみを用いてソフトウェアモジュールをテストし得る。
【００４２】
特定の実施形態において、図３及び６に示した構成要素は、コンピュータハードウェア又はソフトウェアとして実装され得る。特定の実施形態は、ネットワーク環境内に実装され得る。図９は、サービスとしてソフトウェアの検証を提供するのに好適な、一例に係るネットワーク環境９００を示している。ネットワーク環境９００は、１つ以上のサーバ９２０と１つ以上のクライアント９３０とを相互に結合するネットワーク９１０を含んでいる。特定の実施形態において、ネットワーク９１０は、インターネット、エクストラネット、仮想プライベートネットワーク（ＶＰＮ）、ローカルエリアネットワーク（ＬＡＮ）、無線ＬＡＮ（ＷＬＡＮ）、ワイドエリアネットワーク（ＷＡＮ）、メトロポリタンエリアネットワーク（ＭＡＮ）、インターネットの一部、若しくはその他のネットワーク、又は２つ以上のこれらネットワークの組み合わせである。この開示は、如何なる好適なネットワーク９１０をも意図している。
【００４３】
１つ以上のリンク９５０が、サーバ９２０又はクライアント９３０をネットワーク９１０に結合する。特定の実施形態において、１つ以上のリンク９５０は各々、１つ以上の有線リンク、無線リンク、又は光リンクを含む。特定の実施形態において、１つ以上のリンク９５０は各々、イントラネット、エクストラネット、ＶＰＮ、ＬＡＮ、ＷＬＡＮ、ＷＡＮ、ＭＡＮ、インターネットの一部、若しくはその他のリンク、又は２つ以上のこれらリンクの組み合わせを含む。この開示は、サーバ９２０及びクライアント９３０をネットワーク９１０に結合する如何なる好適なリンク９５０をも意図している。
【００４４】
特定の実施形態において、各サーバ９２０は、単一のサーバであってもよいし、複数のコンピュータ又は複数のデータセンターに跨る分散サーバであってもよい。サーバ９２０は、例えば、ウェブサーバ、ニュースサーバ、メイルサーバ、メッセージサーバ、広告サーバ、ファイルサーバ、アプリケーションサーバ、交換サーバ、データベースサーバ、又はプロキシサーバなど、様々な種類のサーバとし得る。特定の実施形態において、各サーバ９２０は、そのサーバ９２０によって実現あるいは支援される適切な機能を実行するための、ハードウェア、ソフトウェア、若しくは埋込ロジック要素、又は２つ以上のこれら要素の組み合わせを含み得る。例えば、ウェブサーバは一般的に、ウェブページ、又はウェブページの特定の要素、を含むウェブサイトのホストを務めることが可能である。より具体的には、ウェブサーバは、ＨＴＭＬファイル又はその他のファイルタイプのホストとなることができ、あるいは要求を受けてファイルを動的に作成あるいは構成して、クライアント９３０からのＨＴＴＰ又はその他の要求に応答して該ファイルをクライアント９３０に通信することができる。メイルサーバは一般的に、様々なクライアント９３０に電子メイルサービスを提供することができる。データベースサーバは一般的に、１つ以上のデータ庫に格納されたデータを管理するためのインタフェースを提供することができる。
【００４５】
特定の実施形態において、１つ以上のサーバ９２０に、１つ以上のリンク９５０を介して、１つ以上のデータストレージ９４０が通信可能に結合され得る。特定の実施形態において、データストレージ９４０は、様々な種類の情報を保管するために使用され得る。特定の実施形態において、データストレージ９４０に格納される情報は、特定のデータ構造に従って編成され得る。特定の実施形態において、各データストレージ９４０はリレーショナルデータベースとし得る。特定の実施形態は、サーバ９２０又はクライアント９３０が、データストレージ９４０に格納された情報を管理する（例えば、検索、修正、追加あるいは消去する）ことを可能にするインタフェースを提供し得る。
【００４６】
特定の実施形態において、各クライアント９３０は、ハードウェア、ソフトウェア、若しくは埋込ロジック要素、又は２つ以上のこれら要素の組み合わせを含み、クライアント９３０によって実現あるいは支援される適切な機能を実行することが可能である。例えば、クライアント９３０は、以下に限られないが、デスクトップ型コンピュータシステム、ノート型コンピュータシステム、ネットブック型コンピュータシステム、手持ち式電子機器、又は携帯電話とし得る。この開示は、如何なる好適なクライアント９３０をも意図している。クライアント９３０は、クライアント９３０の位置のネットワークユーザがネットワーク９１０にアクセスすることを可能にし得る。クライアント９３０は、そのユーザが、その他のクライアント９３０の他ユーザと通信することを可能にしてもよい。
【００４７】
クライアント９３０は、例えば、マイクロソフト・インターネットエクスプローラ、グーグル・クローム又はモジラ・ファイアフォックスなどのウェブブラウザ９３２を有することができ、また、１つ以上のアドオン、プラグイン、又は例えばツールバー若しくはヤフー・ツールバーなどのその他のエクステンションを有していてもよい。クライアント９３０のユーザは、ＵＲＬ又はウェブブラウザ９３２をサーバ９２０に導くその他のアドレスを入力することができ、ウェブブラウザ９３２は、ハイパーテキスト転送プロトコル（ＨＴＴＰ）要求を生成して、該ＨＴＴＰ要求をサーバ９２０に通信し得る。サーバ９２０は、ＨＴＴＰ要求を受理し、該ＨＴＴＰ要求に応じた１つ以上のハイパーテキスト・マークアップ言語（ＨＴＭＬ）ファイルをクライアント９３０に通信し得る。クライアント９３０は、サーバ９２０からのＨＴＭＬファイルに基づいて、ユーザへの提示にためにウェブページを表示し得る。この開示は、如何なる好適なウェブページファイルをも意図している。非限定的な一例として、ウェブページは、具体的なニーズに従って、ＨＴＭＬファイル、拡張可能ハイパーテキスト・マークアップ言語（ＸＨＴＭＬ）ファイル、又は拡張マークアップ言語（ＸＭＬ）ファイルから表示を行い得る。このようなページはまた、例えば、以下に限られないが、ＪＡＶＡスクリプト、ＪＡＶＡ、マイクロソフト・シルバーライトで記述されたものなどのスクリプト、例えばＡＪＡＸ（Asynchronous  JavaScript  and  XML）などのマークアップ言語とスクリプトとの組み合わせ、及びこれらに類するものを実行し得る。ここでは、適宜、ウェブページへの言及は、（ブラウザがウェブページを表示するために使用する）１つ以上の対応するウェブページファイルを包含し、その逆も然りである。
【００４８】
特定の実施形態は、１つ以上のコンピュータシステム上で実現され得る。図１０は、一例に係るコンピュータシステム１０００を示している。特定の実施形態において、１つ以上のコンピュータシステム１０００が、ここに記載あるいは図示した１つ以上の方法の１つ以上のステップを実行する。特定の実施形態において、１つ以上のコンピュータシステム１０００が、ここに記載あるいは図示した機能を提供する。特定の実施形態において、１つ以上のコンピュータシステム１０００上で起動されるソフトウェアが、ここに記載あるいは図示した１つ以上の方法の１つ以上のステップを実行し、あるいは、ここに記載あるいは図示した機能を提供する。特定の実施形態は、１つ以上のコンピュータシステム１０００の１つ以上の部分を含む。
【００４９】
この開示は、如何なる好適な数のコンピュータシステム１０００をも意図している。この開示は、如何なる物理形態を採るコンピュータシステム１０００をも意図している。非限定的な一例として、コンピュータシステム１０００は、組込型コンピュータシステム、システム・オン・チップ（ＳＯＣ）、シングルボード・コンピュータシステム（ＳＢＣ）（例えば、コンピュータ・オン・モジュール（ＣＯＭ）若しくはシステム・オン・モジュール（ＳＯＭ）など）、デスクトップ型コンピュータシステム、ラップトップ型又はノート型のコンピュータシステム、対話式キオスク端末、メインフレーム、メッシュ状コンピュータシステム、携帯電話、携帯情報端末（ＰＤＡ）、サーバ、又はこれらの２つ以上の組み合わせとし得る。必要に応じて、コンピュータシステム１０００は、単一あるいは分散型の；複数の位置にまたがる；複数の機械にまたがる；あるいはクラウド（１つ以上のネットワーク内に１つ以上のクラウド要素を含み得る）内の；１つ以上のコンピュータシステム１０００を含んでいてもよい。必要に応じて、１つ以上のコンピュータシステム１０００は、ここに記載あるいは図示した１つ以上の方法の１つ以上のステップを、空間的あるいは時間的な実質的な制約なく実行し得る。非限定的な一例として、１つ以上のコンピュータシステム１０００は、ここに記載あるいは図示した１つ以上の方法の１つ以上のステップを、リアルタイムあるいはバッチモードで実行し得る。必要に応じて、１つ以上のコンピュータシステム１０００は、相異なる時点で、あるいは相異なる位置で、ここに記載あるいは図示した１つ以上の方法の１つ以上のステップを実行してもよい。
【００５０】
特定の実施形態において、コンピュータシステム１０００は、プロセッサ１００２、メモリ１００４、ストレージ１００６、入力／出力（Ｉ／Ｏ）インタフェース１００８、通信インタフェース１０１０、及びバス１０１２を含んでいる。この開示は、特定の構成にされた特定数の特定の構成要素を有する特定のコンピュータシステムを図示して説明しているが、この開示は、如何なる好適配置にされた如何なる好適数の如何なる好適構成要素を有する如何なる好適なコンピュータシステムをも意図している。
【００５１】
特定の実施形態において、プロセッサ１００２は、例えばコンピュータプログラムを構築する命令などの命令を実行するハードウェアを含む。非限定的な一例として、命令を実行するために、プロセッサ１００２は、内部レジスタ、内部キャッシュ、メモリ１００４、又はストレージ１００６から命令を取り出し（すなわち、フェッチし）；それを復号化して実行し；その後、１つ以上の結果を内部レジスタ、内部キャッシュ、メモリ１００４、又はストレージ１００６に書き込み得る。特定の実施形態において、プロセッサ１００２は、データ、命令又はアドレス用の１つ以上の内部キャッシュを含み得る。この開示は、プロセッサ１００２が必要に応じて、如何なる好適数の如何なる好適な内部キャッシュを含むことも意図している。非限定的な一例として、プロセッサ１００２は、１つ以上の命令キャッシュと、１つ以上のデータキャッシュと、１つ以上のトランスレーション・ルックアサイド・バッファ（ＴＬＢ）とを含み得る。命令キャッシュ内の命令は、メモリ１００４又はストレージ１００６内の命令の複製としてもよく、命令キャッシュは、プロセッサ１００２によるこれら命令の取り出しを高速化し得る。データキャッシュ内のデータは、メモリ１００４又はストレージ１００６内の、プロセッサ１００２にて実行されている命令が処理すべきデータの複製；プロセッサ１００２にて実行される後続の命令によるアクセスのための、あるいはメモリ１００４又はストレージ１００６に書き込むための、プロセッサ１００２にて実行された以前の命令の結果；又はその他の好適データとし得る。データキャッシュは、プロセッサ１００２による読み出し処理又は書き込み処理を高速化し得る。ＴＬＢは、プロセッサ１００２のために仮想アドレス変換を高速化し得る。特定の実施形態において、プロセッサ１００２は、データ、命令又はアドレス用の１つ以上の内部レジスタを含み得る。この開示は、プロセッサ１００２が適宜、如何なる好適数の如何なる好適な内部レジスタを含むことをも意図している。必要に応じて、プロセッサ１００２は、１つ以上の演算論理ユニット（ＡＬＵ）を含んでいてもよく；マルチコアプロセッサであってもよく；あるいは１つ以上のプロセッサ１００２を含んでいてもよい。この開示は特定のプロセッサを図示して説明しているが、この開示は如何なる好適なプロセッサをも意図している。
【００５２】
特定の実施形態において、メモリ１００４は、プロセッサ１００２が実行する命令、又はプロセッサ１００２が処理するデータを格納するメインメモリを含む。非限定的な一例として、コンピュータシステム１０００はストレージ１００６又は別のソース（例えば、別のコンピュータシステム１０００など）からメモリ１００４に命令をロードし得る。その後、プロセッサ１００２は、メモリ１００４から内部レジスタ又は内部キャッシュに命令をロードし得る。命令を実行するため、プロセッサ１００２は、内部レジスタ又は内部キャッシュから命令を取り出し、取り出した命令を復号化する。命令の実行中又は実行後、プロセッサ１００２は、１つ以上の結果（中間結果又は最終結果とし得る）を内部レジスタ又は内部キャッシュに書き込み得る。そして、プロセッサ１００２は、それらの結果のうちの１つ以上をメモリ１００４に書き込み得る。特定の実施形態において、プロセッサ１００２は、１つ以上の内部レジスタ若しくは内部キャッシュ又はメモリ１００４内の命令のみを実行してもよく（ストレージ１００６又はその他の場所の命令を実行するのとは異なる）、また、１つ以上の内部レジスタ若しくは内部キャッシュ又はメモリ１００４内のデータのみを処理してもよい（ストレージ１００６又はその他の場所のデータを処理するのとは異なる）。１つ以上のメモリバス２１２（各々がアドレスバス及びデータバスを含み得る）が、プロセッサ１００２をメモリ１００４に結合してもよい。バス１０１２は、後述のように、１つ以上のメモリバスを含み得る。特定の実施形態において、１つ以上のメモリ管理装置（ＭＭＵ）が、プロセッサ１００２とメモリ１００４との間に存在し、プロセッサ１００２により要求されるメモリ１００４へのアクセスを容易にし得る。特定の実施形態において、メモリ１００４は、ランダムアクセスメモリ（ＲＡＭ）を含む。このＲＡＭは、適当であれば、揮発性メモリであってもよい。必要に応じて、このＲＡＭはダイナミックＲＡＭ（ＤＲＡＭ）又はスタティックＲＡＭ（ＳＲＡＭ）にされ得る。また、必要に応じて、このＲＡＭは、シングルポート又はマルチポートのＲＡＭにされ得る。この開示は、如何なる好適なＲＡＭをも意図している。メモリ１００４は、必要に応じて、１つ以上のメモリ１００４を含んでいてもよい。この開示は特定のメモリを図示して説明しているが、この開示は如何なる好適なメモリをも意図している。
【００５３】
特定の実施形態において、ストレージ１００６は、データ又は命令用の大容量記憶装置を含む。非限定的な一例として、ストレージ１００６は、ＨＤＤ、フロッピーディスク（登録商標）ドライブ、フラッシュメモリ、光ディスク、磁気光ディスク、磁気テープ、若しくはユニバーサル・シリアル・バス（ＵＳＢ）ドライブ、又はこれらの２つ以上の組み合わせを含み得る。ストレージ１００６は、必要に応じて、リムーバブル（取り外し可能）あるいは非リムーバブル（すなわち、固定）のメディアを含み得る。ストレージ１００６は、必要に応じて、コンピュータシステム１０００の内部にあってもよいし、外部にあってもよい。特定の実施形態において、ストレージ１００６は、不揮発性のソリッドステートメモリである。特定の実施形態において、ストレージ１００６は、読み出し専用メモリ（ＲＯＭ）を含む。必要に応じて、このＲＯＭは、マスクプログラムされたＲＯＭ、プログラマブルＲＯＭ（ＰＲＯＭ）、消去可能ＰＲＯＭ（ＥＰＲＯＭ）、電気的消去可能ＰＲＯＭ（ＥＥＰＲＯＭ）、電気的消去再書込可能ＲＯＭ（ＥＡＲＯＭ）、若しくはフラッシュメモリ、又はこれらの２つ以上の組み合わせとし得る。この開示は、如何なる好適な物理形態を有する大容量記憶装置１００６をも意図している。ストレージ１００６は、必要に応じて、プロセッサ１００２とストレージ１００６との間での通信を容易にする１つ以上のストレージ制御装置を含み得る。この開示は特定のストレージを図示して説明しているが、この開示は如何なる好適なストレージをも意図している。
【００５４】
特定の実施形態において、Ｉ／Ｏインタフェース１００８は、コンピュータシステム１０００と１つ以上のＩ／Ｏ装置との間での通信のための１つ以上のインタフェースを提供するハードウェア、ソフトウェア、又はこれら双方を含む。コンピュータシステム１０００は、必要に応じて、これらＩ／Ｏ装置のうちの１つ以上を含んでいてもよい。これらＩ／Ｏ装置のうちの１つ以上は、個人とコンピュータシステム１０００との間での通信を可能にし得る。非限定的な一例として、Ｉ／Ｏ装置は、キーボード、キーパッド、マイク、モニタ、マウス、プリンタ、スキャナ、スピーカ、スチルカメラ、スタイラスペン、タブレット、タッチスクリーン、トラックボール、ビデオカメラ、その他の好適なＩ／Ｏ装置、又はこれらの２つ以上の組み合わせを含み得る。Ｉ／Ｏ装置は、１つ以上のセンサを含んでいてもよい。この開示は、如何なる好適なＩ／Ｏ装置、及びそれ用の如何なる好適なＩ／Ｏインタフェース１００８をも意図している。必要に応じて、Ｉ／Ｏインタフェース１００８は、プロセッサ１００２がこれらのＩ／Ｏ装置のうちの１つ以上を駆動することを可能にする１つ以上の装置又はソフトウェアドライバを含んでいてもよい。Ｉ／Ｏインタフェース１００８は、必要に応じて、１つ以上のインタフェース１００８を含んでいてもよい。この開示は特定のＩ／Ｏインタフェースを図示して説明しているが、この開示は如何なる好適なＩ／Ｏインタフェースをも意図している。
【００５５】
特定の実施形態において、通信インタフェース１０１０は、コンピュータシステム１０００と、１つ以上のその他のコンピュータシステム若しくは１つ以上のネットワークとの間での通信（例えば、パケットベースの通信など）のための１つ以上のインタフェースを提供するハードウェア、ソフトウェア、又はこれら双方を含む。非限定的な一例として、通信インタフェース１０１０は、イーサネット若しくはその他のワイヤベースのネットワークと通信するためのネットワークインタフェースコントローラ（ＮＩＣ）若しくはネットワークアダプタ、又は例えばＷｉ−Ｆｉネットワークなどの無線ネットワークと通信するための無線ＮＩＣ（ＷＮＩＣ）若しくは無線アダプタを含み得る。この開示は、如何なる好適なネットワーク及びそれ用の如何なる好適な通信インタフェース１０１０をも意図している。非限定的な一例として、コンピュータシステム１０００は、アドホックネットワーク、パーソナルエリアネットワーク（ＰＡＮ）、ローカルエリアネットワーク（ＬＡＮ）、ワイドエリアネットワーク（ＷＡＮ）、メトロポリタンエリアネットワーク（ＭＡＮ）、若しくはインターネットの１つ以上の部分、又はこれらの２つ以上の組み合わせと通信し得る。これらのネットワークのうちの１つ以上の１つ以上の部分は、有線であってもよいし、無線であってもよい。一例として、コンピュータシステム１０００は、無線ＰＡＮ（ＷＰＡＮ）（例えば、ブルートゥースＷＰＡＮなど）、Ｗｉ−Ｆｉネットワーク、Ｗｉ−ＭＡＸネットワーク、携帯電話ネットワーク（例えば、グローバル・システム・フォー・モバイル・コミュニケーションズ（ＧＳＭ）ネットワークなど）、若しくはその他の好適な無線ネットワーク、又はこれらの２つ以上の組み合わせと通信し得る。コンピュータシステム１０００は、必要に応じて、これらのネットワークの何れかのための如何なる好適なインタフェース１０１０を含んでいてもよい。この開示は特定の通信インタフェースを図示して説明しているが、この開示は如何なる好適な通信インタフェースをも意図している。
【００５６】
特定の実施形態において、バス１０１２は、コンピュータシステム１０００の構成要素を相互に結合するための、ハードウェア、ソフトウェア、又はこれら双方を含む。非限定的な一例として、バス１０１２は、アクセラレーテッド・グラフィクス・ポート（ＡＧＰ）若しくはその他のグラフィック専用バス、ＥＩＳＡ（Extended  Industry  Standard  Architecture）バス、フロントサイドバス（ＦＳＢ）、ハイパートランスポート（ＨＴ）インターコネクト、業界標準アーキテクチャ（ＩＳＡ）バス、インフィニバンド・インターコネクト、ＬＰＣ（low-pin-count）バス、メモリバス、マイクロ・チャネル・アーキテクチャ（ＭＣＡ）バス、コンピュータ用拡張バスアーキテクチャ（ＰＣＩ）バス、ＰＣＩエクスプレス（ＰＣＩ−Ｘ）バス、シリアルＡＴＡ（ＳＡＴＡ）バス、ＶＬＢ（Video  Electronics  Standards  Association  local）バス、若しくはその他の好適なバス、又はこれらの２つ以上の組み合わせを含み得る。バス１０１２は、必要に応じて、１つ以上のバス１０１２を含んでいてもよい。この開示は特定のバスを図示して説明しているが、この開示は如何なる好適なバス又はインターコネクトをも意図している。
【００５７】
ここで、コンピュータ読み取り可能記憶媒体への言及は、１つ以上の一過性でない有形のコンピュータ読み取り可能記憶媒体保有構造をも包含するものである。非限定的な一例として、コンピュータ読み取り可能記憶媒体は、必要に応じて、半導体ベースあるいはその他の集積回路（ＩＣ）（例えば、フィールド・プログラマブル・ゲート・アレイ（ＦＰＧＡ）、又は特定用途向けＩＣ（ＡＳＩＣ）など）、ハードディスク、ＨＤＤ、ハイブリッド式ハードドライブ（ＨＨＤ）、光ディスク、光ディスクドライブ（ＯＤＤ）、磁気光ディスク、磁気光ドライブ、フロッピーディスク（登録商標）、フロッピーディスクドライブ（ＦＤＤ）、磁気テープ、ホログラフィック記憶媒体、ソリッドステートドライブ（ＳＳＤ）、ＲＡＭドライブ、セキュアデジタル（ＳＤ）カード、セキュアデジタルドライブ、若しくはその他の好適なコンピュータ読み取り可能記憶媒体、又はこれらの２つ以上の組み合わせを含み得る。
【００５８】
この開示は、何らかの好適なストレージを実現する１つ以上のコンピュータ読み取り可能記憶媒体を意図している。特定の実施形態において、コンピュータ読み取り可能記憶媒体は、必要に応じて、プロセッサ１００２の１つ以上の部分（例えば、１つ以上の内部レジスタ若しくはキャッシュなど）、メモリ１００４の１つ以上の部分、ストレージ１００６の１つ以上の部分、又はこれらの組み合わせを実現してもよい。特定の実施形態において、コンピュータ読み取り可能記憶媒体はＲＡＭ又はＲＯＭを実現する。特定の実施形態において、コンピュータ読み取り可能記憶媒体は揮発性あるいは永続的なメモリを実現する。特定の実施形態において、１つ以上のコンピュータ読み取り可能記憶媒体がソフトウェアを具現化する。ここで、ソフトウェアへの言及は適宜、１つ以上のアプリケーション、バイトコード、１つ以上のコンピュータプログラム、１つ以上の実行ファイル、１つ以上の命令、ロジック、機械語、１つ以上のスクリプト、又はソースコードを包含するものであり、この逆もまた然りである。特定の実施形態において、ソフトウェアは、１つ以上のアプリケーション・プログラミング・インタフェース（ＡＰＩ）を含む。この開示は、如何なる好適なプログラミング言語又は複数のプログラミング言語の組み合わせで書き込まれ、あるいはその他の方法で表現された、如何なる好適なソフトウェアをも意図している。特定の実施形態において、ソフトウェアはソースコード又はオブジェクトコードとして表現され得る。特定の実施形態において、ソフトウェアは、例えばＣ、Ｐｅｒｌ又はこれらの好適な拡張版など、より高級（高水準）なプログラミング言語で表現される。特定の実施形態において、ソフトウェアは、例えばアセンブリ言語（又は機械語）など、より低水準のプログラミング言語で表現される。特定の実施形態において、ソフトウェアはＪＡＶＡで表現される。特定の実施形態において、ソフトウェアはハイパーテキスト・マークアップ言語（ＨＴＭＬ）、拡張マークアップ言語（ＸＭＬ）、又はその他の好適なマークアップ言語で表現される。
【００５９】
この開示は、ここで例示した実施形態への、当業者が理解されるであろう全ての変更、代用、変形、改変及び改良を包含するものである。同様に、添付の請求項は適宜、ここで例示した実施形態への当業者が理解されるであろう全ての変更、代用、変形、改変及び改良を包含するものである。
【００６０】
以上の説明に関し、更に以下の付記を開示する。
（付記１）
１つ以上の計算装置によって実行される方法であって、
ソフトウェアモジュールにアクセスするステップであり、
前記ソフトウェアモジュールは、
１つ以上の入力変数と、
１つ以上の中間変数であり、各中間変数の値が前記入力変数のうちの少なくとも１つの入力変数の値に直接的あるいは間接的に依存する、１つ以上の中間変数と、
１つ以上の条件付き分岐点であり、各条件付き分岐点が、前記入力変数及び前記中間変数のうちの少なくとも１つの入力変数及び／又は中間変数によって規定される分岐条件を有し、該分岐条件が満たされるかが、前記少なくとも１つの入力変数及び／又は中間変数の値に依存する、１つ以上の条件付き分岐点と、を有し、且つ
前記ソフトウェアモジュールの実行中に、前記条件付き分岐点の各々において、前記ソフトウェアモジュールは、該条件付き分岐点の分岐条件が満たされるかに応じて異なる経路に進む、アクセスするステップと、
前記１つ以上の入力変数に対応する１つ以上の変数セットを構築するステップであり、各変数セットが、前記入力変数のうちの１つと、前記入力変数のうちの該１つの値に直接的あるいは間接的に依存する値を有する中間変数とを含む、構築するステップと、
各変数セットに関して、該変数セットの前記入力変数及び前記中間変数によって影響される平均分岐深さを計算するステップと、
前記１つ以上の変数セットのうち最小の平均分岐深さを有する第１変数セットを選択するステップと、
前記第１変数セットの前記入力変数に第１記号値を割り当てるステップと、
前記第１記号値を有する前記第１変数セットの前記入力変数を用いて、前記ソフトウェアモジュールを記号的に実行し、前記第１変数セットの前記入力変数及び前記中間変数に関する第１テストケースセットを生成するステップと、
前記第１テストケースセットを用いて前記ソフトウェアモジュールを検証するステップと、
を有する方法。
（付記２）
前記入力変数の各々に関して、前記中間変数のうちの何れが該入力変数の値に直接的あるいは間接的に依存する値を有するかを、関連性分析を用いて決定するステップ、を更に有する付記１に記載の方法。
（付記３）
前記ソフトウェアモジュールは１以上の分岐階層を有し、
前記分岐階層の各々は、前記条件付き分岐点のうちの少なくとも１つを有し、
各変数セットに関して、該変数セットの前記入力変数及び前記中間変数によって影響される前記平均分岐深さを計算する前記ステップは、
該変数セットの前記入力変数に関して、分岐条件が該入力変数に依存する条件付き分岐点を有する分岐階層の数を計算するステップと、
該変数セットの前記中間変数の各々に関して、分岐条件が該中間変数に依存する条件付き分岐点を有する分岐階層の数を計算するステップと、
これらの分岐階層の数の平均を、該変数セットの前記平均分岐深さとして計算するステップと
を有する、
付記１又は２に記載の方法。
（付記４）
最小の平均分岐深さを有する前記第１変数セットを選択するとき、最小の平均分岐深さを有する変数セットが複数存在する場合、前記第１変数セットとして、最小の平均分岐深さを有する変数セットのうちの１つをランダムに選択する、付記１乃至３の何れか一に記載の方法。
（付記５）
前記１つ以上の変数セットのうち、次に最小の平均分岐深さを有する第２変数セットを選択するステップと、
前記第２変数セットの前記入力変数に第２記号値を割り当てるステップと、
前記第２記号値を有する前記第２変数セットの前記入力変数を用いて、前記ソフトウェアモジュールを記号的に実行し、前記第２変数セットの前記入力変数及び前記中間変数に関する第２テストケースセットを生成するステップと、
前記第２テストケースセットを用いて前記ソフトウェアモジュールを検証するステップと、
を更に有する付記１乃至４の何れか一に記載の方法。
（付記６）
１つ以上の計算装置によって実行される方法であって、
ソフトウェアモジュール及び該ソフトウェアモジュール用の複数のテストケースにアクセスするステップであり、
前記ソフトウェアモジュールは、
１つ以上の変数と、
１つ以上の条件付き分岐点であり、各条件付き分岐点が、前記変数のうちの少なくとも１つの変数によって規定される分岐条件を有し、該分岐条件が満たされるかが、前記少なくとも１つの変数の値に依存する、１つ以上の条件付き分岐点と、を有し、
前記ソフトウェアモジュールの実行中に、前記条件付き分岐点の各々において、前記ソフトウェアモジュールは、該条件付き分岐点の分岐条件が満たされるかに応じて異なる経路に進み、
前記テストケースの各々は、前記条件付き分岐点のうちの少なくとも１つをカバーし、且つ前記条件付き分岐点のうちの前記少なくとも１つの分岐条件を規定する前記少なくとも１つの変数に関する少なくとも１つのテスト値を有する、アクセスするステップと、
前記条件付き分岐点の各々に関して、前記複数のテストケースのうちに、該条件付き分岐点をカバーし且つ前記ソフトウェアモジュールを実行中に同一の経路に進ませるテストケースが複数存在する場合に、該条件付き分岐点をカバーし且つ前記ソフトウェアモジュールを実行中に同一の経路に進ませるテストケースのうち１つを除く全てを、前記複数のテストケースから除去するステップと、
残りのテストケースから１つ以上の第１テストケースを選択するステップであり、各第１テストケースは、前記条件付き分岐点のうちの少なくとも１つが該第１テストケースによってのみカバーされるテストケースである、選択するステップと、
前記条件付き分岐点の全てが前記第１テストケース及び第２テストケースのうちの少なくとも１つのテストケースによってカバーされるまで、残りのテストケースから１つ以上の第２テストケースを繰り返し選択するステップであり、各繰り返しにおいて選択される第２テストケースは、該繰り返しにおいて最も多数の条件付き分岐点をカバーするテストケースである、選択するステップと、
選択された前記第１テストケース及び前記第２テストケースのみを用いて、前記ソフトウェアモジュールをテストするステップと、
を有する方法。
（付記７）
前記ソフトウェアモジュールの前記変数は、１つ以上の入力変数と１つ以上の中間変数とを有し、各中間変数の値は、前記入力変数のうちの少なくとも１つの入力変数の値に直接的あるいは間接的に依存する、付記６に記載の方法。
（付記８）
前記入力変数と前記入力変数に関する前記テストケースからの前記テスト値とを表すグラフを構築するステップを更に有し、
前記グラフは、
各階層が前記入力変数のうちの１つに関連付けられた、前記１つ以上の入力変数に対応する１つ以上の階層と、
前記階層の各々の１つ以上のノードと、
１つ以上のエッジであり、各エッジが、隣接する２つの階層からの２つのノードを結び付け、且つ前記隣接する２つの階層のうちの高い側の階層に関連付けられた入力変数の前記テスト値のうちの１つを表す、１つ以上のエッジと、
を有する、
付記７に記載の方法。
（付記９）
前記テストケースと前記条件付き分岐点とを表す二部グラフを構築するステップを更に有し、
前記二部グラフは、
各第１ノードが前記テストケースのうちの１つを表す、前記複数のテストケースに対応する複数の第１ノードと、
各第２ノードが前記条件付き分岐点のうちの１つを表す、前記１つ以上の条件付き分岐点に対応する１つ以上の第２ノードと、
各エッジが前記第１ノードのうちの１つと前記第２ノードのうちの１つとを結び付ける複数のエッジであり、前記第１ノードのうちの該１つによって表されるテストケースが、前記第２ノードのうちの該１つによって表される条件付き分岐点をカバーする、複数のエッジと
を有する、
付記６乃至８の何れか一に記載の方法。
（付記１０）
１つ以上のプロセッサによって実行可能な命令を有するメモリと、
前記メモリに結合され、前記命令を実行するよう動作する１つ以上のプロセッサと
を有するシステムであって、
前記１つ以上のプロセッサは、前記命令を実行するとき、
−  ソフトウェアモジュールにアクセスし、
前記ソフトウェアモジュールは、
１つ以上の入力変数と、
１つ以上の中間変数であり、各中間変数の値が前記入力変数のうちの少なくとも１つの入力変数の値に直接的あるいは間接的に依存する、１つ以上の中間変数と、
１つ以上の条件付き分岐点であり、各条件付き分岐点が、前記入力変数及び前記中間変数のうちの少なくとも１つの入力変数及び／又は中間変数によって規定される分岐条件を有し、該分岐条件が満たされるかが、前記少なくとも１つの入力変数及び／又は中間変数の値に依存する、１つ以上の条件付き分岐点と、を有し、且つ
前記ソフトウェアモジュールの実行中に、前記条件付き分岐点の各々において、前記ソフトウェアモジュールは、該条件付き分岐点の分岐条件が満たされるかに応じて異なる経路に進み、
−  前記１つ以上の入力変数に対応する１つ以上の変数セットを構築し、各変数セットは、前記入力変数のうちの１つと、前記入力変数のうちの該１つの値に直接的あるいは間接的に依存する値を有する中間変数とを含み、
−  各変数セットに関して、該変数セットの前記入力変数及び前記中間変数によって影響される平均分岐深さを計算し、
−  前記１つ以上の変数セットのうち最小の平均分岐深さを有する第１変数セットを選択し、
−  前記第１変数セットの前記入力変数に第１記号値を割り当て、
−  前記第１記号値を有する前記第１変数セットの前記入力変数を用いて、前記ソフトウェアモジュールを記号的に実行することで、前記第１変数セットの前記入力変数及び前記中間変数に関する第１テストケースセットを生成し、
−  前記第１テストケースセットを用いて前記ソフトウェアモジュールを検証する、
よう動作する、システム。
（付記１１）
前記１つ以上のプロセッサは更に、前記命令を実行するとき、前記入力変数の各々に関して、前記中間変数のうちの何れが該入力変数の値に直接的あるいは間接的に依存する値を有するかを、関連性分析を用いて決定するよう動作する、付記１０に記載のシステム。
（付記１２）
前記ソフトウェアモジュールは１以上の分岐階層を有し、
前記分岐階層の各々は、前記条件付き分岐点のうちの少なくとも１つを有し、
各変数セットに関して、該変数セットの前記入力変数及び前記中間変数によって影響される前記平均分岐深さを計算することは、
該変数セットの前記入力変数に関して、分岐条件が該入力変数に依存する条件付き分岐点を有する分岐階層の数を計算し、
該変数セットの前記中間変数の各々に関して、分岐条件が該中間変数に依存する条件付き分岐点を有する分岐階層の数を計算し、
これらの分岐階層の数の平均を、該変数セットの前記平均分岐深さとして計算する
ことを有する、
付記１０又は１１に記載のシステム。
（付記１３）
最小の平均分岐深さを有する前記第１変数セットを選択するとき、最小の平均分岐深さを有する変数セットが複数存在する場合、前記第１変数セットとして、最小の平均分岐深さを有する変数セットのうちの１つをランダムに選択する、付記１０乃至１２の何れか一に記載のシステム。
（付記１４）
前記１つ以上のプロセッサは更に、前記命令を実行するとき、
前記１つ以上の変数セットのうち、次に最小の平均分岐深さを有する第２変数セットを選択し、
前記第２変数セットの前記入力変数に第２記号値を割り当て、
前記第２記号値を有する前記第２変数セットの前記入力変数を用いて、前記ソフトウェアモジュールを記号的に実行することで、前記第２変数セットの前記入力変数及び前記中間変数に関する第２テストケースセットを生成し、
前記第２テストケースセットを用いて前記ソフトウェアモジュールを検証する、
よう動作する、付記１０乃至１３の何れか一に記載のシステム。
（付記１５）
１つ以上のプロセッサによって実行可能な命令を有するメモリと、
前記メモリに結合され、前記命令を実行するよう動作する１つ以上のプロセッサと
を有するシステムであって、
前記１つ以上のプロセッサは、前記命令を実行するとき、
−  ソフトウェアモジュール及び該ソフトウェアモジュール用の複数のテストケースにアクセスし、
前記ソフトウェアモジュールは、
１つ以上の変数と、
１つ以上の条件付き分岐点であり、各条件付き分岐点が、前記変数のうちの少なくとも１つの変数によって規定される分岐条件を有し、該分岐条件が満たされるかが、前記少なくとも１つの変数の値に依存する、１つ以上の条件付き分岐点と、を有し、
前記ソフトウェアモジュールの実行中に、前記条件付き分岐点の各々において、前記ソフトウェアモジュールは、該条件付き分岐点の分岐条件が満たされるかに応じて異なる経路に進み、
前記テストケースの各々は、前記条件付き分岐点のうちの少なくとも１つをカバーし、且つ前記条件付き分岐点のうちの前記少なくとも１つの分岐条件を規定する前記少なくとも１つの変数に関する少なくとも１つのテスト値を有し、
−  前記条件付き分岐点の各々に関して、前記複数のテストケースのうちに、該条件付き分岐点をカバーし且つ前記ソフトウェアモジュールを実行中に同一の経路に進ませるテストケースが複数存在する場合に、該条件付き分岐点をカバーし且つ前記ソフトウェアモジュールを実行中に同一の経路に進ませるテストケースのうち１つを除く全てを、前記複数のテストケースから除去し、
−  残りのテストケースから１つ以上の第１テストケースを選択し、各第１テストケースは、前記条件付き分岐点のうちの少なくとも１つが該第１テストケースによってのみカバーされるテストケースであり、
−  前記条件付き分岐点の全てが前記第１テストケース及び第２テストケースのうちの少なくとも１つのテストケースによってカバーされるまで、残りのテストケースから１つ以上の第２テストケースを繰り返し選択し、各繰り返しにおいて選択される第２テストケースは、該繰り返しにおいて最も多数の条件付き分岐点をカバーするテストケースであり、
−  選択された前記第１テストケース及び前記第２テストケースのみを用いて、前記ソフトウェアモジュールをテストする、
よう動作する、システム。
（付記１６）
前記ソフトウェアモジュールの前記変数は、１つ以上の入力変数と１つ以上の中間変数とを有し、各中間変数の値は、前記入力変数のうちの少なくとも１つの入力変数の値に直接的あるいは間接的に依存する、付記１５に記載のシステム。
（付記１７）
前記１つ以上のプロセッサは更に、前記命令を実行するとき、前記入力変数と前記入力変数に関する前記テストケースからの前記テスト値とを表すグラフを構築するよう動作し、
前記グラフは、
各階層が前記入力変数のうちの１つに関連付けられた、前記１つ以上の入力変数に対応する１つ以上の階層と、
前記階層の各々の１つ以上のノードと、
１つ以上のエッジであり、各エッジが、隣接する２つの階層からの２つのノードを結び付け、且つ前記隣接する２つの階層のうちの高い側の階層に関連付けられた入力変数の前記テスト値のうちの１つを表す、１つ以上のエッジと、
を有する、
付記１６に記載のシステム。
（付記１８）
前記１つ以上のプロセッサは更に、前記命令を実行するとき、前記テストケースと前記条件付き分岐点とを表す二部グラフを構築するよう動作し、
前記二部グラフは、
各第１ノードが前記テストケースのうちの１つを表す、前記複数のテストケースに対応する複数の第１ノードと、
各第２ノードが前記条件付き分岐点のうちの１つを表す、前記１つ以上の条件付き分岐点に対応する１つ以上の第２ノードと、
各エッジが前記第１ノードのうちの１つと前記第２ノードのうちの１つとを結び付ける複数のエッジであり、前記第１ノードのうちの該１つによって表されるテストケースが、前記第２ノードのうちの該１つによって表される条件付き分岐点をカバーする、複数のエッジと
を有する、
付記１５乃至１７の何れか一に記載のシステム。
（付記１９）
プログラムを格納したコンピュータ読み取り可能記憶媒体であって、前記プログラムは、１つ以上の計算装置によって実行されるとき、該１つ以上の計算装置に、
−  ソフトウェアモジュールにアクセスさせ、
前記ソフトウェアモジュールは、
１つ以上の入力変数と、
１つ以上の中間変数であり、各中間変数の値が前記入力変数のうちの少なくとも１つの入力変数の値に直接的あるいは間接的に依存する、１つ以上の中間変数と、
１つ以上の条件付き分岐点であり、各条件付き分岐点が、前記入力変数及び前記中間変数のうちの少なくとも１つの入力変数及び／又は中間変数によって規定される分岐条件を有し、該分岐条件が満たされるかが、前記少なくとも１つの入力変数及び／又は中間変数の値に依存する、１つ以上の条件付き分岐点と、を有し、且つ
前記ソフトウェアモジュールの実行中に、前記条件付き分岐点の各々において、前記ソフトウェアモジュールは、該条件付き分岐点の分岐条件が満たされるかに応じて異なる経路に進み、
−  前記１つ以上の入力変数に対応する１つ以上の変数セットを構築させ、各変数セットは、前記入力変数のうちの１つと、前記入力変数のうちの該１つの値に直接的あるいは間接的に依存する値を有する中間変数とを含み、
−  各変数セットに関して、該変数セットの前記入力変数及び前記中間変数によって影響される平均分岐深さを計算させ、
−  前記１つ以上の変数セットのうち最小の平均分岐深さを有する第１変数セットを選択させ、
−  前記第１変数セットの前記入力変数に第１記号値を割り当てさせ、
−  前記第１記号値を有する前記第１変数セットの前記入力変数を用いて、前記ソフトウェアモジュールを記号的に実行させて、前記第１変数セットの前記入力変数及び前記中間変数に関する第１テストケースセットを生成させ、
−  前記第１テストケースセットを用いて前記ソフトウェアモジュールを検証させる、
コンピュータ読み取り可能記憶媒体。
（付記２０）
前記プログラムは更に、前記１つ以上の計算装置によって実行されるとき、前記１つ以上の計算装置に、前記入力変数の各々に関して、前記中間変数のうちの何れが該入力変数の値に直接的あるいは間接的に依存する値を有するかを、関連性分析を用いて決定させる、付記１９に記載のコンピュータ読み取り可能記憶媒体。
（付記２１）
前記ソフトウェアモジュールは１以上の分岐階層を有し、
前記分岐階層の各々は、前記条件付き分岐点のうちの少なくとも１つを有し、
各変数セットに関して、該変数セットの前記入力変数及び前記中間変数によって影響される前記平均分岐深さを計算させることは、
該変数セットの前記入力変数に関して、分岐条件が該入力変数に依存する条件付き分岐点を有する分岐階層の数を計算させ、
該変数セットの前記中間変数の各々に関して、分岐条件が該中間変数に依存する条件付き分岐点を有する分岐階層の数を計算させ、
これらの分岐階層の数の平均を、該変数セットの前記平均分岐深さとして計算させる
ことを有する、
付記１９又は２０に記載のコンピュータ読み取り可能記憶媒体。
（付記２２）
最小の平均分岐深さを有する前記第１変数セットを選択させるとき、最小の平均分岐深さを有する変数セットが複数存在する場合、前記第１変数セットとして、最小の平均分岐深さを有する変数セットのうちの１つをランダムに選択させる、付記１９乃至２１の何れか一に記載のコンピュータ読み取り可能記憶媒体。
（付記２３）
前記プログラムは更に、前記１つ以上の計算装置によって実行されるとき、前記１つ以上の計算装置に、
前記１つ以上の変数セットのうち、次に最小の平均分岐深さを有する第２変数セットを選択させ、
前記第２変数セットの前記入力変数に第２記号値を割り当てさせ、
前記第２記号値を有する前記第２変数セットの前記入力変数を用いて、前記ソフトウェアモジュールを記号的に実行させて、前記第２変数セットの前記入力変数及び前記中間変数に関する第２テストケースセットを生成させ、
前記第２テストケースセットを用いて前記ソフトウェアモジュールを検証させる、
付記１９乃至２２の何れか一に記載のコンピュータ読み取り可能記憶媒体。
（付記２４）
プログラムを格納したコンピュータ読み取り可能記憶媒体であって、前記プログラムは、１つ以上の計算装置によって実行されるとき、該１つ以上の計算装置に、
−  ソフトウェアモジュール及び該ソフトウェアモジュール用の複数のテストケースにアクセスさせ、
前記ソフトウェアモジュールは、
１つ以上の変数と、
１つ以上の条件付き分岐点であり、各条件付き分岐点が、前記変数のうちの少なくとも１つの変数によって規定される分岐条件を有し、該分岐条件が満たされるかが、前記少なくとも１つの変数の値に依存する、１つ以上の条件付き分岐点と、を有し、
前記ソフトウェアモジュールの実行中に、前記条件付き分岐点の各々において、前記ソフトウェアモジュールは、該条件付き分岐点の分岐条件が満たされるかに応じて異なる経路に進み、
前記テストケースの各々は、前記条件付き分岐点のうちの少なくとも１つをカバーし、且つ前記条件付き分岐点のうちの前記少なくとも１つの分岐条件を規定する前記少なくとも１つの変数に関する少なくとも１つのテスト値を有し、
−  前記条件付き分岐点の各々に関して、前記複数のテストケースのうちに、該条件付き分岐点をカバーし且つ前記ソフトウェアモジュールを実行中に同一の経路に進ませるテストケースが複数存在する場合に、該条件付き分岐点をカバーし且つ前記ソフトウェアモジュールを実行中に同一の経路に進ませるテストケースのうち１つを除く全てを、前記複数のテストケースから除去させ、
−  残りのテストケースから１つ以上の第１テストケースを選択させ、各第１テストケースは、前記条件付き分岐点のうちの少なくとも１つが該第１テストケースによってのみカバーされるテストケースであり、
−  前記条件付き分岐点の全てが前記第１テストケース及び第２テストケースのうちの少なくとも１つのテストケースによってカバーされるまで、残りのテストケースから１つ以上の第２テストケースを繰り返し選択させ、各繰り返しにおいて選択される第２テストケースは、該繰り返しにおいて最も多数の条件付き分岐点をカバーするテストケースであり、
−  選択された前記第１テストケース及び前記第２テストケースのみを用いて、前記ソフトウェアモジュールをテストさせる、
コンピュータ読み取り可能記憶媒体。
（付記２５）
前記ソフトウェアモジュールの前記変数は、１つ以上の入力変数と１つ以上の中間変数とを有し、各中間変数の値は、前記入力変数のうちの少なくとも１つの入力変数の値に直接的あるいは間接的に依存する、付記２４に記載のコンピュータ読み取り可能記憶媒体。
（付記２６）
前記プログラムは更に、前記１つ以上の計算装置によって実行されるとき、前記１つ以上の計算装置に、前記入力変数と前記入力変数に関する前記テストケースからの前記テスト値とを表すグラフを構築させ、
前記グラフは、
各階層が前記入力変数のうちの１つに関連付けられた、前記１つ以上の入力変数に対応する１つ以上の階層と、
前記階層の各々の１つ以上のノードと、
１つ以上のエッジであり、各エッジが、隣接する２つの階層からの２つのノードを結び付け、且つ前記隣接する２つの階層のうちの高い側の階層に関連付けられた入力変数の前記テスト値のうちの１つを表す、１つ以上のエッジと、
を有する、
付記２５に記載のコンピュータ読み取り可能記憶媒体。
（付記２７）
前記プログラムは更に、前記１つ以上の計算装置によって実行されるとき、前記１つ以上の計算装置に、前記テストケースと前記条件付き分岐点とを表す二部グラフを構築させ、
前記二部グラフは、
各第１ノードが前記テストケースのうちの１つを表す、前記複数のテストケースに対応する複数の第１ノードと、
各第２ノードが前記条件付き分岐点のうちの１つを表す、前記１つ以上の条件付き分岐点に対応する１つ以上の第２ノードと、
各エッジが前記第１ノードのうちの１つと前記第２ノードのうちの１つとを結び付ける複数のエッジであり、前記第１ノードのうちの該１つによって表されるテストケースが、前記第２ノードのうちの該１つによって表される条件付き分岐点をカバーする、複数のエッジと
を有する、
付記２４乃至２６の何れか一に記載のシステム。
（付記２８）
ソフトウェアモジュールにアクセスする手段であり、
前記ソフトウェアモジュールは、
１つ以上の入力変数と、
１つ以上の中間変数であり、各中間変数の値が前記入力変数のうちの少なくとも１つの入力変数の値に直接的あるいは間接的に依存する、１つ以上の中間変数と、
１つ以上の条件付き分岐点であり、各条件付き分岐点が、前記入力変数及び前記中間変数のうちの少なくとも１つの入力変数及び／又は中間変数によって規定される分岐条件を有し、該分岐条件が満たされるかが、前記少なくとも１つの入力変数及び／又は中間変数の値に依存する、１つ以上の条件付き分岐点と、を有し、且つ
前記ソフトウェアモジュールの実行中に、前記条件付き分岐点の各々において、前記ソフトウェアモジュールは、該条件付き分岐点の分岐条件が満たされるかに応じて異なる経路に進む、アクセスする手段と、
前記１つ以上の入力変数に対応する１つ以上の変数セットを構築する手段であり、各変数セットが、前記入力変数のうちの１つと、前記入力変数のうちの該１つの値に直接的あるいは間接的に依存する値を有する中間変数とを含む、構築する手段と、
各変数セットに関して、該変数セットの前記入力変数及び前記中間変数によって影響される平均分岐深さを計算する手段と、
前記１つ以上の変数セットのうち最小の平均分岐深さを有する第１変数セットを選択する手段と、
前記第１変数セットの前記入力変数に第１記号値を割り当てる手段と、
前記第１記号値を有する前記第１変数セットの前記入力変数を用いて、前記ソフトウェアモジュールを記号的に実行し、前記第１変数セットの前記入力変数及び前記中間変数に関する第１テストケースセットを生成する手段と、
前記第１テストケースセットを用いて前記ソフトウェアモジュールを検証する手段と、
を有するシステム。
（付記２９）
ソフトウェアモジュール及び該ソフトウェアモジュール用の複数のテストケースにアクセスする手段であり、
前記ソフトウェアモジュールは、
１つ以上の変数と、
１つ以上の条件付き分岐点であり、各条件付き分岐点が、前記変数のうちの少なくとも１つの変数によって規定される分岐条件を有し、該分岐条件が満たされるかが、前記少なくとも１つの変数の値に依存する、１つ以上の条件付き分岐点と、を有し、
前記ソフトウェアモジュールの実行中に、前記条件付き分岐点の各々において、前記ソフトウェアモジュールは、該条件付き分岐点の分岐条件が満たされるかに応じて異なる経路に進み、
前記テストケースの各々は、前記条件付き分岐点のうちの少なくとも１つをカバーし、且つ前記条件付き分岐点のうちの前記少なくとも１つの分岐条件を規定する前記少なくとも１つの変数に関する少なくとも１つのテスト値を有する、アクセスする手段と、
前記条件付き分岐点の各々に関して、前記複数のテストケースのうちに、該条件付き分岐点をカバーし且つ前記ソフトウェアモジュールを実行中に同一の経路に進ませるテストケースが複数存在する場合に、該条件付き分岐点をカバーし且つ前記ソフトウェアモジュールを実行中に同一の経路に進ませるテストケースのうち１つを除く全てを、前記複数のテストケースから除去する手段と、
残りのテストケースから１つ以上の第１テストケースを選択する手段であり、各第１テストケースは、前記条件付き分岐点のうちの少なくとも１つが該第１テストケースによってのみカバーされるテストケースである、選択する手段と、
前記条件付き分岐点の全てが前記第１テストケース及び第２テストケースのうちの少なくとも１つのテストケースによってカバーされるまで、残りのテストケースから１つ以上の第２テストケースを繰り返し選択する手段であり、各繰り返しにおいて選択される第２テストケースは、該繰り返しにおいて最も多数の条件付き分岐点をカバーするテストケースである、選択する手段と、
選択された前記第１テストケース及び前記第２テストケースのみを用いて、前記ソフトウェアモジュールをテストする手段と、
を有するシステム。
【符号の説明】
【００６１】
３００  システム
３０２  関連性分析部
３０４  分岐深さ計算部
３０６  記号的実行部
３１２  ソフトウェアモジュール
３１４  テストケースセット
６００  システム
６０２  動的テストケース生成部
６０４  二部グラフ構築部
６０６  テストケース選択部
６１２  テストケースセット
６１４  選択されたテストケース
７００  グラフ
７０２、７０４、７０６、７０８、７１０  ノード
８００  二部グラフ
８１２、８１４、８１６  ノード（テストケース）
８２２、８２４、８２６、８２８  ノード（条件付き分岐点）
９００  ネットワーク環境
９１０  ネットワーク
９２０  サーバ
９３０  クライアント
９３２  ブラウザ
９４０  データストレージ
９５０  リンク
１０００  コンピュータシステム
１００２  プロセッサ
１００４  メモリ
１００６  ストレージ
１００８  Ｉ／Ｏインタフェース
１０１０  通信インタフェース
１０１２  バス
【図１】
2011248887.tif 000007
【図２】
2011248887.tif 000008
【図３】
2011248887.tif 000009
【図４】
2011248887.tif 000010
【図５】
2011248887.tif 000011
【図６】
2011248887.tif 000012
【図７】
2011248887.tif 000013
【図８】
2011248887.tif 000014
【図９】
2011248887.tif 000015
【図１０】
2011248887.tif 000016