(57)【要約】【課題】ソフトウェアプログラムが全ての所定の要件を満たしているか否かを判定するためのテストケースの開発は、困難であるとともに時間を浪費する。【解決手段】テスト対象関数用のテストプロキシにおいて、ヒューマンフレンドリーなテストコンテキストを生成するための方法は、テスト対象関数の初期テストコンテキストを生成することを含んでもよい。また、方法は、新しいコンテキスト機能拡張とともに現在のテストコンテキストを増強することを含んでもよい。また、方法は、ヒントを現在のテストコンテキストに追加することを含んでもよい。現在のテストコンテキストは、初期テストコンテキストを含んでもよく、或いは、初期テストコンテキストから導出されてもよい。【選択図】図３
2015146178.tif 000002
【特許請求の範囲】
【請求項１】
テスト対象関数用のテストプロキシにおいて、ヒューマンフレンドリーなテストコンテキストを生成するための方法であって、前記方法は、
前記テスト対象関数の初期テストコンテキストを生成し、
新しいコンテキスト機能拡張とともに現在のテストコンテキストを増強し、
ヒントを前記現在のテストコンテキストに追加することを含み、
前記現在のテストコンテキストは、前記初期テストコンテキストを含むか、又は、前記初期テストコンテキストから導出される方法。
【請求項２】
前記現在のテストコンテキストを使用することにより、前記テスト対象関数の拡張シンボリック実行を実施し、前記新しいコンテキスト機能拡張及び前記ヒントを識別することをさらに含む、請求項１に記載の方法。
【請求項３】
前記現在のテストコンテキストを使用することにより、前記テスト対象関数の拡張シンボリック実行を実施することは、
前記テスト対象関数の分岐に到達するまで前記テスト対象関数をシンボリックに実行し、
前記分岐に到達するまでシンボリックに実行される前記テスト対象関数の一部分に含まれる実体変数の依存関係をトレースし、
前記分岐に到達するまでシンボリックに実行される前記テスト対象関数の前記一部分の制約を解決し、
前記制約及び前記現在のテストコンテキストに基づいて前記分岐が実行可能ではないと判定し、
前記分岐が実行可能ではなく、且つ、前記実体変数が従属実体変数であることを判定することに応答して、前記実体変数をシンボリック変数としてマーキングし、
前記シンボリック変数が前記テスト対象関数に対してアクセス可能であることを判定することに応答して、前記シンボリック変数を前記新しいコンテキスト機能拡張として識別することを含み、
前記新しいコンテキスト機能拡張とともに前記現在のテストコンテキストを増強することは、前記現在のテストコンテキストにおいて、前記実体変数をシンボリックにすることを含む、請求項２に記載の方法。
【請求項４】
前記分岐に到達するまでシンボリックに実行される前記テスト対象関数の前記一部分の制約を解決することは、前記分岐の経路条件を満たす前記実体変数の値を識別することを含み、
前記制約及び前記現在のテストコンテキストに基づいて前記分岐が実行可能ではないと判定することは、前記経路条件を満たす前記実体変数の前記値が、前記現在のテストコンテキストにおいて、前記の特定された実体変数の値と等しくないこと又は前記の特定された実体変数の値と矛盾していることを判定することを含む、請求項３に記載の方法。
【請求項５】
前記現在のテストコンテキストを使用することにより、前記テスト対象関数の拡張シンボリック実行を実施することは、前記シンボリック変数の１つ又は複数の事前条件を判定することをさらに含み、
前記新しいコンテキスト機能拡張とともに前記現在のテストコンテキストを増強することは、前記シンボリック変数の前記１つ又は複数の事前条件を前記現在のテストテキストに追加することをさらに含む、請求項３に記載の方法。
【請求項６】
前記現在のテストコンテキストを使用することにより、前記テスト対象関数の拡張シンボリック実行を実施することは、前記シンボリック変数としてマーキングされた前記実体変数が前記テスト対象関数に対してアクセス可能ではないことを判定することに応答して、前記シンボリック変数としてマーキングされた前記実体変数を前記ヒントとして識別することをさらに含み、
前記ヒントを前記現在のテストコンテキストに追加することは、ユーザが前記現在のテストコンテキストにおいて、前記シンボリック変数としてマーキングされた前記実体変数をシンボリックとするための示唆を、前記現在のテストコンテキストに追加することを含む、請求項３に記載の方法。
【請求項７】
前記現在のテストコンテキストを使用することにより、前記テスト対象関数の拡張シンボリック実行を実施することは、前記シンボリック変数としてマーキングされた前記実体変数が、前記現在のテストコンテキストにおいて、ユーザによって特定された変数を含むことを判定することに応答して、前記シンボリック変数としてマーキングされないように、前記シンボリック変数としてマーキングされた前記実体変数をマーキング解除することをさらに含む、請求項３に記載の方法。
【請求項８】
前記ヒントは、ユーザが前記現在のテストコンテキストを修正するための示唆を含み、前記方法は、
前記現在のテストコンテキストにおけるユーザによって特定された変数の指定によって前記現在のテストコンテキストを増強するために有効であるユーザ入力を受信し、
前記現在のテストコンテキストにおいて、前記ユーザによって特定された変数を識別し、
前記現在のテストコンテキストに対する後続の自動的な機能拡張によって前記ユーザによって特定された変数が上書きされないように、前記ユーザによって特定された変数を優先することをさらに含む、請求項１に記載の方法。
【請求項９】
前記現在のテストコンテキストにおいて、前記ユーザによって特定された変数を識別することは、前記ユーザによって特定された変数の前記指定の前に存在している直前のテストコンテキストと、前記ユーザによって特定された変数の前記指定の後に存在している前記現在のテストコンテキストとの間におけるテキストの差分を判定することを含む、請求項８に記載の方法。
【請求項１０】
前記テスト対象関数の前記初期テストコンテキストを生成することは、前記初期テストコンテキストにおいて、前記テスト対象関数の関数引数を一定値に等しくなるように設定することを含む、請求項１に記載の方法。
【請求項１１】
プロセッサと、前記プロセッサに通信可能に結合され、コンピュータ命令を格納して有する非一時的なコンピュータ読み取り可能な媒体とを有する装置であって、
前記コンピュータ命令は、
テスト対象関数の初期テストコンテキストを生成し、
新しいコンテキスト機能拡張とともに現在のテストコンテキストを増強し、
ヒントを前記現在のテストコンテキストに追加するように前記プロセッサが実行可能であるテストコンテキストモジュールを含み、
前記現在のテストコンテキストは、前記初期テストコンテキストを含むか、又は、前記初期テストコンテキストから導出される装置。
【請求項１２】
前記コンピュータ命令は、前記現在のテストコンテキストを使用することにより、前記テスト対象関数の拡張シンボリック実行を実施し、前記新しいコンテキスト機能拡張及び前記ヒントを識別するように前記プロセッサが実行可能である拡張シンボリック実行モジュールをさらに含み、
前記拡張シンボリック実行モジュールは、
前記テスト対象関数の分岐に到達するまで前記テスト対象関数をシンボリックに実行し、
前記分岐に到達するまでシンボリックに実行される前記テスト対象関数の一部分に含まれた実体変数の依存関係をトレースし、
前記分岐に到達するまでシンボリックに実行される前記テスト対象関数の前記一部分の制約を解決し、
前記制約及び前記現在のテストコンテキストに基づいて前記分岐が実行可能ではないと判定し、
前記分岐が実行可能ではないという判定と、前記実体変数が従属実体変数であるという判定とに応答して、前記実体変数をシンボリック変数としてマーキングし、
前記シンボリック変数が前記テスト対象関数に対してアクセス可能であるという判定に応答して、前記シンボリック変数を前記新しいコンテキスト機能拡張として識別するように前記プロセッサが実行可能であることにより、前記現在のテストコンテキストを使用し、前記テスト対象関数の拡張シンボリック実行を実行するように前記プロセッサが実行可能であり、
前記テストコンテキストモジュールは、前記現在のテストコンテキストにおいて、前記実体変数をシンボリックにするように前記プロセッサが実行可能であることにより、前記新しいコンテキスト機能拡張とともに前記現在のテストコンテキストを増強するように前記プロセッサが実行可能である、請求項１１に記載の装置。
【請求項１３】
前記ヒントは、ユーザが前記現在のテストコンテキストを修正するための示唆を含み、
前記コンピュータ命令は、
前記ヒントを含む前記現在のテストコンテキストを表示し、
前記現在のテストコンテキストにおけるユーザによって特定された変数の指定によって前記現在のテストコンテキストを増強するために有効であるユーザ入力を受信するように前記プロセッサが実行可能であるユーザインターフェイスモジュールをさらに含み、
前記コンピュータ命令は、前記現在のテストコンテキストにおいて、前記ユーザによって特定された変数を識別するように前記プロセッサが実行可能である差分モジュールをさらに含み、
前記コンピュータ命令は、前記現在のテストコンテキストに対する後続の自動的な機能拡張によって、前記ユーザによって特定された変数が上書きされないように、前記ユーザによって特定された変数を優先するように前記プロセッサが実行可能である拡張シンボリック実行モジュールをさらに含む、請求項１１に記載の装置。
【請求項１４】
前記差分モジュールは、前記ユーザによって特定された変数の指定の前に存在している直前のテストコンテキストと、前記ユーザによって特定された変数の前記指定の後に存在している前記現在のテストコンテキストとの間におけるテキストの差分を判定するように前記プロセッサが実行可能であることにより、前記現在のテストコンテキストにおいて、前記ユーザが特定された変数を識別するように前記プロセッサが実行可能である、請求項１３に記載の装置。
【請求項１５】
前記テストコンテキストモジュールは、前記初期テストコンテキストにおいて、前記テスト対象関数の関数引数を一定値に等しくなるように設定するように前記プロセッサが実行可能であることにより、前記テスト対象関数の前記初期テストコンテキストを生成するように前記プロセッサが実行可能である、請求項１１に記載の装置。
【請求項１６】
テスト対象関数の初期テストコンテキストを生成し、
新しいコンテキスト機能拡張とともに現在のテストコンテキストを増強し、
ヒントを前記現在のテストコンテキストに追加することを含む動作を実行するようにプロセッサが実行可能に格納されたコンピュータ命令を有する非一時的なコンピュータ読み取り可能な媒体であって、
前記現在のテストコンテキストは、前記初期テストコンテキストを含むか、又は、前記初期テストコンテキストから導出される、コンピュータ読み取り可能な媒体。
【請求項１７】
前記動作は、前記現在のテストコンテキストを使用することにより、前記テスト対象関数の拡張シンボリック実行を実施し、前記新しいコンテキスト機能拡張及び前記ヒントを識別することをさらに含み、該動作は、
前記テスト対象関数の分岐に到達するまで前記テスト対象関数をシンボリックに実行し、
前記分岐に到達するまでシンボリックに実行される前記テスト対象関数の一部分に含まれた実体変数の依存関係をトレースし、
前記分岐に到達するまでシンボリックに実行される前記テスト対象関数の前記一部分の制約を解決し、
前記分岐が前記制約及び前記現在のテストコンテキストに基づいて実行可能ではないと判定し、
前記分岐が実行可能ではなく、且つ、前記実体変数が従属実体変数であることを判定することに応答して、前記実体変数をシンボリック変数としてマーキングし、
前記シンボリック変数が前記テスト対象関数に対してアクセス可能であることを判定することに応答して、前記シンボリック変数を前記新しいコンテキスト機能拡張として識別することを含み、
前記新しいコンテキスト機能拡張とともに前記現在のテストコンテキストを増強することは、前記現在のテストコンテキストにおいて、前記実体変数をシンボリックにすることを含む、請求項１６に記載の非一時的なコンピュータ読み取り可能な媒体。
【請求項１８】
前記ヒントは、ユーザが前記現在のテストコンテキストを修正するための示唆を含み、前記動作は、
前記現在のテストコンテキストにおけるユーザによって特定された変数の指定によって前記現在のテストコンテキストを増強するために有効であるユーザ入力を受信し、
前記現在のテストコンテキストにおいて、前記ユーザによって特定された変数を識別し、
前記現在のテストコンテキストに対する後続の自動的な機能拡張によって、前記ユーザによって特定された変数が上書きされないように、前記ユーザによって特定された変数を優先することをさらに含む、請求項１６に記載の非一時的なコンピュータ読み取り可能な媒体。
【請求項１９】
前記現在のテストコンテキストにおいて、前記ユーザによって特定された変数を識別することは、前記ユーザによって特定された変数の前記指定の前に存在している直前のテストコンテキストと、前記ユーザによって特定された変数の前記指定の後に存在している前記現在のテストコンテキストとの間におけるテキストの差分を判定することを含む、請求項１８に記載の非一時的なコンピュータ読み取り可能な媒体。
【請求項２０】
前記テスト対象関数の前記初期テストコンテキストを生成することは、前記初期テストコンテキストにおいて、前記テスト対象関数の関数引数を一定値に等しくなるように設定することを含む、請求項１６に記載の非一時的なコンピュータ読み取り可能な媒体。
【発明の詳細な説明】
【技術分野】
【０００１】
本明細書に記述されている実施形態は、テストコンテキストの生成に関する。
【発明の概要】
【発明が解決しようとする課題】
【０００２】
電子装置の利用の増大に伴って、これらの装置上において、稼働するソフトウェアプログラムの数も増大している。通常、ソフトウェアプログラムは、開発された際に、ソフトウェアプログラムがその所定の要件の全てを満たしていることを確認するために検証される。ソフトウェアプログラムが全ての所定の要件を満たしているか否かを判定するためのテストケース（ｔｅｓｔ  ｃａｓｅ）の開発は、困難であるとともに時間を浪費する。
【０００３】
本明細書において、権利請求されている主題は、なんらかの欠点を解決するか又は上述のもの等の環境においてのみ稼働する実施形態に限定されるものではない。むしろ、この背景説明は、本明細書に記述されているいくつかの実施形態を実施してもよい例示用の一技術領域を示すために提供されているものに過ぎない。
【課題を解決するための手段】
【０００４】
一実施形態の一態様によれば、テスト対象関数（ｆｕｎｃｔｉｏｎ  ｕｎｄｅｒ  ｔｅｓｔ）用のテストプロキシにおいて、ヒューマンフレンドリーな（ｈｕｍａｎ−ｆｒｉｅｎｄｌｙ）テストコンテキストを生成する方法は、テスト対象関数の初期テストコンテキストを生成することを含んでもよい。また、方法は、新しいコンテキスト機能拡張（ｃｏｎｔｅｘｔ  ｅｎｈａｎｃｅｍｅｎｔ）ともに現在のテストコンテキストを増強（ｅｎｈａｎｃｅ）することを含んでもよい。また、方法は、ヒントを現在のテストコンテキストに追加することを含んでもよい。現在のテストコンテキストは、初期テストコンテキストを含んでもよく、或いは、初期テストコンテキストから導出されてもよい。
【０００５】
実施形態の目的及び利点は、少なくとも、請求項において、具体的に指摘されている要素、特徴、及び組合せにより、実現及び達成される。
【０００６】
上述の一般的な説明と以下の詳細な説明は、いずれも、特許請求されている本発明の例示及び説明を目的としており、且つ、その制限を目的としたものではないことを理解されたい。
【０００７】
添付図面を使用することにより、例示用の実施形態についてさらに具体的且つ詳細に記述及び説明する。
【図面の簡単な説明】
【０００８】
【図１】例示用のソフトウェアテストツールを示す。
【図２Ａ】開発者又はその他のユーザによって手動で追加されるアサーションを含む例示用のテストケースを示す。
【図２Ｂ】例示用のテストプロキシを示す。
【図３】テスト対象関数用のテストプロキシにおいて、１つ又は複数のテストコンテキストを生成するように構成された例示用のテストコンテキストジェネレータのブロックダイアグラムである。
【図４Ａ】テスト対象関数用のテストプロキシにおいて、ヒューマンフレンドリーなテストコンテキストを生成するための例示用の方法のフローチャートである。
【図４Ｂ】テスト対象関数用のテストプロキシにおいて、ヒューマンフレンドリーなテストコンテキストを生成するための別の例示用の方法のフローチャートである。
【図４Ｃ】現在のテストコンテキストを使用することにより、テスト対象関数の拡張シンボリック実行を実施するための例示用の方法のフローチャートである。
【図５Ａ】本明細書に記述されている少なくとも１つの実施形態に従って全てが構成されたテスト対象関数Ｆｏｏ（）及び関係するテストコンテキストを含む例示用のソースコードを示す。
【図５Ｂ】本明細書に記述されている少なくとも１つの実施形態に従って全てが構成されたテスト対象関数Ｆｏｏ（）及び関係するテストコンテキストを含む例示用のソースコードを示す。
【図５Ｃ】本明細書に記述されている少なくとも１つの実施形態に従って全てが構成されたテスト対象関数Ｆｏｏ（）及び関係するテストコンテキストを含む例示用のソースコードを示す。
【図５Ｄ】本明細書に記述されている少なくとも１つの実施形態に従って全てが構成されたテスト対象関数Ｆｏｏ（）及び関係するテストコンテキストを含む例示用のソースコードを示す。
【図５Ｅ】本明細書に記述されている少なくとも１つの実施形態に従って全てが構成されたテスト対象関数Ｆｏｏ（）及び関係するテストコンテキストを含む例示用のソースコードを示す。
【発明を実施するための形態】
【０００９】
添付図面を参照し、本発明の実施形態について説明する。本明細書における実質的に全ての複数の及び／又は単数の用語の使用に関して、当業者は、文脈及び／又は用途に応じて、適宜、複数を単数に変換できる、且つ／又は単数を複数に変換できる。本明細書においては、わかり易さを目的として、様々な単数又は複数の順列（ｐｅｒｍｕｔａｔｉｏｎｓ）が明示的に記述されている場合がある。
【００１０】
図１は、本明細書に記述されている少なくとも１つの実施形態に従って構成された例示用のソフトウェアテストツール１００を示している。ソフトウェアテストツール１００は、テストドライバ１０２と、テストプロキシ１０４と、１つ又は複数のテストダブルプロキシ（ｔｅｓｔ  ｄｏｕｂｌｅ  ｐｒｏｘｉｅｓ）１０６Ａ〜１０６Ｎ（集合的に（ｃｏｌｌｅｃｔｉｖｅｌｙ）、「テストダブルプロキシ１０６」）とを含んでもよい。ソフトウェアテストツール１００は、テスト対象関数１０８をテスト又は検証するように構成されてもよい。
【００１１】
テスト対象関数１０８は、検証及び／又はその他のテストを受けるソースコード及び／又はソフトウェア製品に含まれた関数であってもよい。テスト対象関数１０８及び／又は対応するソースコード又はソフトウェア製品は、Ｃ＋＋（登録商標）、Ｃ＃（登録商標）、Ｊａｖａ（登録商標）、又はその他のプログラミング言語を含む様々なプログラミング言語のうちのいずれかであってもよい。テスト対象関数１０８は、１つ又は複数の被呼出し関数１１０Ａ〜１１０Ｎ（集合的に、「被呼出し関数１１０」）に対する関数呼出しを含んでもよい。
【００１２】
テストドライバ（ｔｅｓｔ  ｄｒｉｖｅｒ）１０２は、テスト入力パターンと呼ばれる１つ又は複数の入力の複数の組を生成するように、且つ、テスト入力パターンを使用することによってテスト対象関数１０８を実行するように、構成されてもよい。テスト対象関数１０８は、それぞれのテスト入力パターンごとに結果を出力してもよい。それぞれのテスト入力パターンごとに、テストドライバ１０２は、結果が予想結果と整合しているか否かをチェックするように構成されてもよい。結果が予想結果と整合している場合、テストドライバ１０２は、対応するテスト入力パターンによって実行された際にテスト対象関数１０８が合格したと判定してもよい。その一方で、結果が予想結果と整合していない場合、テストドライバ１０２は、対応するテスト入力パターンによって実行された際にテスト対象関数１０８が不合格となったと判定してもよい。これは、テスト対象関数１０８を含むソースコード又はソフトウェア製品におけるバグ又は誤りを示している。テスト対象関数１０８を含むソースコード又はソフトウェア製品の開発者等のユーザは、不合格について通知されてもよく、且つ、バグ又は誤りを訂正するための改善策（ｒｅｍｅｄｉａｌ  ｍｅａｓｕｒｅｓ）を施してもよい。
【００１３】
いくつかのソフトウェアテストツールは、テストプロキシを使用することなしに、ソースコード又はソフトウェア製品を検証する。このようなソフトウェアテストツールは、テスト入力パターンの全てに共通する初期化をそれぞれが含んでもよい複数のテスト入力パターンと、テスト入力パターンのうちの対応するテスト入力パターンに固有の１つ又は複数のテストパラメータと、関数呼出しとを生成してもよい。テスト入力パターンは、複数のテストケースを生成するために、１つ又は複数のアサーション（ａｓｓｅｒｔｉｏｎ）又は事前条件（ｐｒｅｃｏｎｄｉｔｉｏｎ）をそれぞれのテストパターンに手動で追加しうる開発者又はその他のユーザによってレビューされてもよい。テスト入力パターンに対するアサーションの手動による追加は、面倒であるとともに時間を浪費する処理となろう。
【００１４】
図２Ａは、本明細書に記述されている少なくとも１つの実施形態に従って構成された開発者又はその他のユーザによって手動で追加されたアサーションを含む例示用のテストケース２００を示している。テストケース２００は、初期化２０２と、１つ又は複数のテストパラメータ２０４と、関数呼出し２０６と、アサーション２０８とを含んでもよい。
【００１５】
初期化２０２は、ｆｏｏ及びｂａｒという２つの引数を含むテスト対象関数ｆｕｔ（）用の複数のテストケースのそれぞれに共通したものであってもよい。初期化２０２は、テストケースのそれぞれに共通したものであってもよい様々なグローバル変数の割当、メモリの割当、又はその他の初期化を含んでもよい。
【００１６】
テストパラメータ２０４は、図示のテストケース２００に固有のものであってもよく、且つ、異なるテストケースにおいては、異なるテストパラメータが使用されてもよい。例えば、図２Ａにおいては、テストパラメータ２０４は、ｘに対して、且つ、拡大すれば（ｂｙ  ｅｘｔｅｎｓｉｏｎ）、ｆｏｏに対して、１の値を割り当てている。ここで、ｘは、ｆｏｏが指し示しているオブジェクトのメンバであり、且つ、ｂａｒに対して２の値を割り当てている。その他のテストケース２００におけるテストパラメータは、ｆｏｏ及びｂａｒに対して異なる値を割り当ててもよい。
【００１７】
関数呼出し２０６は、引数ｆｏｏ及びｂａｒによってｆｕｔ（）を呼び出している。
【００１８】
初期化２０２、テストパラメータ２０４、及び関数呼出し２０６は、テスト入力パターンとしてテストドライバによって生成されてもよい。
【００１９】
例えば、意図するｆｕｔ（）の動作方式に関する知識等の製品仕様に関する知識を有する開発者又はその他のユーザが、テスト入力パターンをレビューしてもよく、且つ、テストケース２００を生成するためにアサーション２０８を追加してもよい。例えば、開発者は、テストパラメータ２０４がｆｕｔ（）に提供された際に１２３という値を返すようにｆｕｔ（）が意図されていることを知っていてもよい。この知識は、開発者によって追加されるアサーション２０８において、反映されていてもよい。
【００２０】
動作の際に、且つ、テストケース２００を使用することにより、ｆｕｔ（）が呼び出されてもよく、且つ、ｆｕｔ（）には、引数ｆｏｏ及びｂａｒ用のテストパラメータ２０４が提供されてもよい。次いで、ｆｕｔ（ｆｏｏ，ｂａｒ）の出力をアサーション２０８に照らしてチェックし、ｆｕｔ（）がテストパラメータ２０４に伴って合格しているか又は不合格であるかを判定してもよい。
【００２１】
上述のように、テストケース２００等のテストケースを生成するための複数のテスト入力パターンに対するアサーションの手動による追加は、面倒であるとともに時間を浪費する処理となろう。図１のテストプロキシ１０４等の単一のテストプロキシが、手動で追加されたアサーションを有する複数のテストケースの代わり（ｓｕｂｓｔｉｔｕｔｅ）として、実装されてもよい。図２Ｂは、本明細書に記述されている少なくとも１つの実施形態に従って構成された例示用のテストプロキシ２１０を示している。テストプロキシ２１０は、初期化２１２と、１つ又は複数のシンボリックテストパラメータ（ｓｙｍｂｏｌｉｃ  ｔｅｓｔ  ｐａｒａｍｅｔｅｒ）２１４と、関数呼出し２１６と、シンボリックアサーション（ｓｙｍｂｏｌｉｃ  ａｓｓｅｒｔｉｏｎ）２１８とを含んでもよい。テストプロキシ２１０は、図１のテストプロキシ１０４の一例である。
【００２２】
例えば、ｆｕｔ（）等の図２Ａに関して記述されている同一のテスト対象関数の場合、図２Ｂのテストプロキシ２１０の初期化２１２及び関数呼出し２１６は、形態及び機能において、図２Ａのテストケース２００の初期化２０２及び関数呼出し２０６と同一であってもよい。
【００２３】
シンボリックテストパラメータ２１４は、シンボリック変数（ｓｙｍｂｏｌｉｃ  ｖａｒｉａｂｌｅ）ｐ１及びｐ２としてパラメータ化された図２Ａのテストパラメータ２０４を含んでもよい。同様に、シンボリックアサーション２１８も、シンボリック変数ｐ１及びｐ２の関数としてシンボリックにアサートされた図２Ａのアサーション２０８を含んでもよい。
【００２４】
初期化２１２及びシンボリックテストパラメータ２１４は、ｆｕｔ（）用のテストコンテキストを集合的に形成してもよい。
【００２５】
図１及び図２Ｂの組合せを参照することにより、テストドライバ１０２は、テストプロキシを伴わないテストのために生成されるテスト入力パターンとは異なる複数のテスト入力パターンを生成してもよい。具体的には、テストプロキシを伴わないソフトウェアテストツールによって使用されるテスト入力パターンは、図２Ａの初期化２０２、テストパラメータ２０４、及び関数呼出し２０６等の初期化、テスト入力パターンに固有のテストパラメータ、及び関数呼出しを含んでもよい。対照的に、図１のテストプロキシ１０４又は図２Ｂのテストプロキシ２１０等のテストプロキシとともに使用されるテストドライバ１０２によって生成されるテスト入力パターンは、初期化及び関数呼出しを省略してもよい。その理由は、初期化及び関数呼出しは、テストプロキシにおいて、シンボリックテストパラメータとともに含まれてもよいからである。この代わりに、テストドライバ１０２によって生成されるテスト入力パターンは、テストプロキシにおいて、シンボリックテストパラメータのシンボリック変数の代わりに代用されうる様々な特定の値を含む異なるテストパラメータを含んでもよい。
【００２６】
図１のテストプロキシ１０４及び／又は図２Ｂのテストプロキシ２１０等のテストプロキシの生成に関する態様については、２０１３年３月１４日付けで出願された米国特許出願第１３／８２８，８８６号明細書に開示されており、この特許出願は、引用により、その全てが本明細書に包含される。
【００２７】
図１を再度参照すれば、上述のように、テスト対象関数１０８は、被呼出し関数１１０を呼び出してもよい。テストのためにテスト対象関数１０８を良好に隔離するべく、ソフトウェアテストツール１００は、テストダブルプロキシ１０６を含んでもよい。テストダブルプロキシ１０６は、テストダブルプロキシ１０６が同一の入力を受け付ける、且つ／又は同一の出力を提供するように、被呼出し関数１１０と同一のインターフェイスを含んでもよい。さらに詳しくは、テストダブルプロキシ１０６Ａは、被呼出し関数１１０Ａと同一のインターフェイスを含んでもよく、テストダブルプロキシ１０６Ｂは、被呼出し関数１１０Ｂと同一のインターフェイスを含んでもよく、且つ、テストダブルプロキシ１０６Ｎは、被呼出し関数１１０Ｎと同一のインターフェイスを含んでもよい。しかしながら、テストダブルプロキシ１０６は、被呼出し関数１１０よりも単純であってもよい。一例として、被呼出し関数１１０Ａは、１つ又は複数の入力を受け付けてもよく、入力を使用することによっていくつかの複雑な計算を実行してもよく、且つ、複雑な計算に基づいて１つ又は複数の出力を返してもよい。対照的に、テストダブルプロキシ１０６Ａは、同一の入力を受け付けてもよく、且つ、なんらの計算をも実行することなしに特定の値を出力として返してもよく、或いは、出力を生成して返すべく、入力を使用することによって相対的に単純な計算を実行してもよい。
【００２８】
いくつかの実施形態においては、テストダブルプロキシ１０６は、被呼出し関数１１０用の単純なダミー関数として機能してもよい。この代わりに、又はこれに加えて、テストプロキシ１０４は、テスト対象関数１０８がテストダブルプロキシ１０６を呼び出すのか又は被呼出し関数１１０を呼び出すのかを特定するために、使用されてもよい。図１のテストダブルプロキシ１０６等のテストダブルプロキシの動作及び生成に関する更なる態様については、２０１４年１月３１日付けで出願された「ＴＥＳＴ  ＤＯＵＢＬＥ  ＧＥＮＥＲＡＴＩＯＮ」という名称の同時係属中の米国特許出願第１４／１７０，２０８号明細書に記述されており、この特許出願は、引用により、その全てが本明細書に包含される。
【００２９】
本明細書に記述されている実施形態は、図１のテストプロキシ１０４のテストコンテキスト及び／又は図２Ｂのテストプロキシ２１０のテストコンテキスト等のテストプロキシ用のテストコンテキストの生成に関する。図２Ｂの説明において既に言及したように、テストコンテキストは、図２Ｂの初期化２１２及びシンボリックテストパラメータ２１４等の初期化及び１つ又は複数のシンボリックテストパラメータを含んでもよい。
【００３０】
テストコンテキストは、手動で、半自動（ｓｅｍｉ−ａｕｔｏｍａｔｉｃａｌｌｙ）で、且つ／又は、自動で生成されてもよい。本明細書に記述されているいくつかの実施形態は、最小限の手動による介入を伴ってヒューマンフレンドリーなテストコンテキストを生成する。テストコンテキストは、テストパラメータの数及び／又はその内部に含まれている初期化対象の変数の数を極小化（ｍｉｎｉｍｉｚｉｎｇ）することにより、判読可能である等のように、ヒューマンフレンドリーであるとされてもよい。テストコンテキストの生成は、対応するソフトウェア製品又は特定のテスト対象関数において、ユーザが利用可能であるとともに黙示的（ｉｍｐｌｉｃｉｔ）ではない全てのコンテキスト情報を除いて、可能な程度に自動化されてもよい。本明細書に記述されている実施形態は、最小限の初期テストコンテキストを自動的に生成してもよく、且つ、次いで、本明細書に記述されているように、初期化及びパラメータを追加することにより、テストコンテキストを反復的に増強してもよい。これらの及びその他の実施形態においては、テストコンテキストは、インターリーブされた方式により、自動的に且つ手動により、増強されてもよい。
【００３１】
図３は、本明細書に記述されている少なくとも１つの実施形態に従って構成されたテスト対象関数用のテストプロキシにおいて、１つ又は複数のテストコンテキスト３０２を生成するように構成された例示用のテストコンテキストジェネレータ３００のブロックダイアグラムである。さらに詳しくは、テストコンテキストジェネレータ３００は、テスト対象関数３０６を含むソースコード３０４に基づいて、且つ、ユーザ入力３０８に基づいて、テストコンテキスト３０２を生成するように構成されてもよい。
【００３２】
テスト対象関数３０６は、図１のテスト対象関数１０８に対応したものであってもよく、或いは、図１のテスト対象関数１０８を含んでもよい。
【００３３】
テストコンテキスト３０２は、初期テストコンテキスト３０２Ａを少なくとも含んでもよい。テストコンテキスト３０２は、初期テストコンテキスト３０２Ａ又は先行する増強されたテストコンテキスト３０２Ｂを増強することにより、順番に生成された１つ又は複数の増強されたテストコンテキスト３０２Ｂ−１〜３０２Ｂ−Ｎ（集合的に、「増強されたテストコンテキスト３０２Ｂ」）をさらに含んでもよい。例えば、第１の増強されたテストコンテキスト３０２Ｂ−１は、初期テストコンテキスト３０２Ａを増強することにより、生成されてもよく、第２の増強されたテストコンテキスト（図示せず）は、直前の第１の増強されたテストコンテキスト３０２Ｂ−１を増強することにより、生成されてもよく、且つ、以下同様であり、最後の増強されたテストコンテキスト３０２Ｂ−Ｎは、直前の最後から２番目の増強されたテストコンテキスト（図示せず）を増強することにより、生成されてもよい。最後の増強されたテストコンテキスト３０２Ｂ−Ｎは、全ての増強されたテストコンテキスト３０２Ｂの中における最大の機能拡張を含んでもよく、且つ、図１のテストプロキシ１０４及び／又は図２Ｂのテストプロキシ２１０等のテストプロキシに含まれてもよい。この代わりに、又はこれに加えて、初期テストコンテキスト３０２Ａ又は増強されたテストコンテキストのうちの別のもの３０２Ｂがテストプロキシに含まれてもよい。機能拡張は、自動的に生成されうるコンテキスト機能拡張及び／又はユーザ入力３０８に応答して生成される手動による機能拡張を含んでもよい。
【００３４】
テストコンテキストジェネレータ３００は、テストコンテキストモジュール３１０、拡張シンボリック実行モジュール３１２、ユーザインターフェイスモジュール３１４、及び差分モジュール３１６（集合的に、「モジュール３１０、３１２、３１４、及び３１６」）を含んでもよい。テストコンテキストジェネレータ３００及び／又はモジュール３１０、３１２、３１４、及び３１６のうちの１つ又は複数は、ハードウェア、ソフトウェア、又はこれらの組合せにおいて、実装されてもよい。例えば、テストコンテキストジェネレータ３００及び／又はモジュール３１０、３１２、３１４、及び３１６のうちの１つ又は複数は、本明細書に記述されている機能及び動作を実行するように構成された１つ又は複数のＡＳＩＣ（Ａｐｐｌｉｃａｔｉｏｎ−Ｓｐｅｃｉｆｉｃ  Ｉｎｔｅｇｒａｔｅｄ  Ｃｉｒｃｕｉｔ）及び１つ又は複数のＦＰＧＡ（Ｆｉｅｌｄ−Ｐｒｏｇｒａｍｍａｂｌｅ  Ｇａｔｅ  Ａｒｒａｙ）において、実装されてもよい。
【００３５】
この代わりに、又はこれに加えて、モジュール３１０、３１２、３１４、及び３１６を含むテストコンテキストジェネレータ３００は、本明細書に記述されている機能及び動作を実行するためにプロセッサが実行可能であるコンピュータ命令を含んでもよい。コンピュータ命令は、非一時的なコンピュータ読み取り可能な媒体内に格納されてもよく、その例については、さらに詳細に後述する。本明細書に記述されている実施形態は、プロセッサと、プロセッサに通信可能に結合されたメモリ等の非一時的なコンピュータ読み取り可能な媒体とを含むコンピュータ等の装置を含んでもよい。非一時的なコンピュータ読み取り可能な媒体は、本明細書に記述されている機能及び動作を実行するためにプロセッサが実行可能であるテストコンテキストジェネレータ３００及び／又はモジュール３１０、３１２、３１４、及び３１６のうちの１つ又は複数を格納して含んでもよい。次に、モジュール３１０、３１２、３１４、及び３１６について説明する。
【００３６】
テストコンテキストモジュール３１０は、テスト対象関数３０６の初期テストコンテキスト３０２Ａを生成するように構成されてもよい。初期テストコンテキスト３０２Ａは、テスト対象関数３０６の関数引数を初期テストコンテキストにおいて、一定値に等しくなるように設定することにより、生成されてもよい。例えば、関数引数のそれぞれは、０という一定値又はなんらかのその他の一定値に設定されてもよい。全ての関数引数は、同一の一定値に設定されてもよく、或いは、それぞれが、異なる一定値に設定されてもよく、或いは、いくつかが同一の一定値に設定される一方で、その他は、異なる一定値に設定されてもよい。
【００３７】
また、テストコンテキストモジュール３１０は、１つ又は複数のコンテキスト機能拡張（ｃｏｎｔｅｘｔ  ｅｎｈａｎｃｅｍｅｎｔ）とともに現在のテストコンテキストを増強（ｅｎｈａｎｃｅ）するように、且つ、１つ又は複数のヒントを現在のテストコンテキストに追加するように、構成されてもよい。現在のテストコンテキストは、初期テストコンテキストを含むか又は初期テストコンテキストから導出されたテストコンテキストを含んでもよい。現在のテストコンテキストは、テストコンテキストジェネレータ３００の動作の際の所与の時点において、現在存在しているテストコンテキストを含んでもよい。例えば、現在のテストコンテキストは、初期テストコンテキスト３０２Ａの生成の後であるとともにその任意の機能拡張の前である時点における初期テストコンテキスト３０２Ａを含んでもよい。初期テストコンテキスト３０２Ａの機能拡張の後に、現在のテストコンテキストは、第１の増強されたテストコンテキスト３０２Ｂ−１を含んでもよい。増強されたテストコンテキスト３０２Ｂのうちの対応する増強されたテストコンテキスト３０２Ｂの機能拡張の後に、現在のテストコンテキストは、増強されたテストコンテキスト３０２Ｂのうちの対応する後続の増強されたテストコンテキスト３０２Ｂを含んでもよい。
【００３８】
コンテキスト機能拡張及びヒントは、拡張シンボリック実行モジュール３１２によって識別されてもよく、且つ、テストコンテキストモジュール３１０に提供されてもよい。拡張シンボリック実行モジュール３１２は、現在のテストコンテキストを使用することにより、テスト対象関数３０６の拡張シンボリック実行を実施し、コンテキスト機能拡張及びヒントを識別するように構成されてもよい。拡張シンボリック実行の態様については、後程、図４Ｃに関して、さらに詳述する。
【００３９】
ユーザインターフェイスモジュール３１４は、拡張シンボリック実行モジュール３１２によって識別されるとともにテストコンテキストモジュール３１０によって現在のテストコンテキストに追加されたヒントを含む現在のテストコンテキストを表示するように構成されてもよい。いくつかの実施形態においては、ユーザインターフェイスモジュール３１４は、テストコンテキストジェネレータ３００を実行してもよいコンピュータのモニタ又はその他の表示装置上に、現在のテストコンテキストを表示させてもよい。ユーザインターフェイスモジュール３１４は、手動による機能拡張とともに現在のテストコンテキストを増強するために有効でありうるユーザ入力３０８を受信（ｒｅｃｅｉｖｅ）するように、さらに構成されてもよい。手動による機能拡張は、現在のテストコンテキストにおけるユーザによって特定された変数の指定を含んでもよい。
【００４０】
差分モジュール３１６は、現在のテストコンテキストにおいて、ユーザによって特定された変数を識別するように構成されてもよい。ユーザによって特定された変数は、直前のテストコンテキストと現在のテストコンテキストの間におけるテキストの差分を判定するために、現在のテストコンテキストと直前のテストコンテキストの間におけるテキスト比較によって識別されてもよい。拡張シンボリック実行モジュール３１２は、現在のテストコンテキストに対する後続の自動的な機能拡張によってユーザによって特定された変数が上書きされないように、ユーザによって特定された変数を優先するように構成されてもよい。
【００４１】
図４Ａは、本明細書に記述されている少なくとも１つの実施形態に従って構成されたテスト対象関数用のテストプロキシにおいて、ヒューマンフレンドリーなテストコンテキストを生成するための例示用の方法４００Ａのフローチャートである。方法４００Ａは、いくつかの実施形態において、図３のテストコンテキストジェネレータ３００を実行するコンピュータ等のコンピュータ又はその他の装置によって実装されてもよい。別個のブロックとして示されているが、様々なブロックは、望ましい実装形態に応じて、更なるブロックに分割されてもよく、さらに少ない数のブロックに組み合わせられてもよく、或いは、省略されてもよい。
【００４２】
方法４００Ａは、テスト対象関数の初期テストコンテキストを生成するブロック４０２において、開始される。テスト対象関数の初期テストコンテキストの生成は、テスト対象関数の１つ又は複数の関数引数を初期テストコンテキストにおいて、一定値と等しくなるように設定することを含んでもよい。
【００４３】
ブロック４０４において、現在のテストコンテキストが新しいコンテキスト機能拡張とともに増強されてもよい。現在のテストコンテキストは、初期テストコンテキストを含んでもよく、或いは、初期テストコンテキストから導出されてもよい。ブロック４０６において、ヒントが現在のテストコンテキストに追加されてもよい。
【００４４】
当業者であれば、本明細書に記述されているこの及びその他の処理及び方法においては、処理及び方法において実行される機能は、異なる順序において実装されてもよいことを理解するであろう。さらには、概説されているステップ及び動作は、例として提供されたものに過ぎず、且つ、ステップ及び動作のうちのいくつかは、開示されている実施形態の本質を逸脱することなしに、任意選択であってもよく、さらに少ない数のステップ又は動作に組み合わせられてもよく、或いは、更なるステップ及び動作に拡張されてもよい。
【００４５】
例えば、方法４００Ａは、図４Ｂ及び／又は図４Ｃに関して、さらに詳細に記述される更なるステップ又は動作を含んでもよい。
【００４６】
図４Ｂは、本明細書に記述されている少なくとも１つの実施形態に従って構成されたテスト対象関数用のテストプロキシにおいて、ヒューマンフレンドリーなテストコンテキストを生成するための別の例示用の方法４００Ｂのフローチャートである。方法４００Ｂは、いくつかの実施形態において、図３のテストコンテキストジェネレータ３００を実行するコンピュータ等のコンピュータ又はその他の装置によって実装されてもよい。別個のブロックとして示されているが、様々なブロックは、望ましい実装形態に応じて、更なるブロックに分割されてもよく、さらに少ない数のブロックに組み合わせられてもよく、或いは、省略されてもよい。
【００４７】
方法４００Ｂは、図４Ａの方法４００Ａと重複（ｏｖｅｒｌａｐ）してもよい。例えば、図４Ｂの方法４００Ｂは、図４Ａのブロック４０２、４０４、及び４０６のみならず、様々なその他のブロックをも含む。次に、方法４００Ｂについて説明する。
【００４８】
テスト対象関数の初期テストコンテキストを生成した後に（ブロック４０２）、方法４００Ｂは、ブロック４０８において、現在のテストコンテキストを使用することにより、テスト対象関数の拡張シンボリック実行を実施し、１つ又は複数の新しいコンテキスト機能拡張及び１つ又は複数のヒントを識別することをさらに含んでもよい。
【００４９】
ブロック４１０において、方法４００Ｂは、なんらかの新しいコンテキスト機能拡張が識別されたか否かを判定してもよい。少なくとも１つの新しいコンテキスト機能拡張が拡張シンボリック実行によって識別されている場合（ブロック４１０における「Ｙｅｓ」）、方法４００Ｂは、プロック４０４に進んでもよい。ここで、現在のテストコンテキストが、新しいコンテキスト機能拡張とともに増強される。ブロック４０４に続いて、方法４００Ｂは、ブロック４０８に戻ってもよい。ここで、拡張シンボリック実行の先行する反復（ｉｔｅｒａｔｉｏｎ）（例えば、直前の反復）において、識別された新しいコンテキスト機能拡張を含む現在のテストコンテキストを使用することにより、再度、テスト対象関数の拡張シンボリック実行が実行される。
【００５０】
少なくとも１つの新しいコンテキスト機能拡張が拡張シンボリック実行において識別されていない場合（ブロック４１０における「Ｎｏ」）、方法４００Ｂは、ブロック４０６に進んでもよい。ここで、拡張シンボリック実行によって識別されたヒントが、現在のテストコンテキストに追加されてもよい。ヒントは、例えば、現在のテストコンテキストにおいて変数をシンボリックにすることにより、ユーザが現在のテストコンテキストを修正するための示唆（ｓｕｇｇｅｓｔｉｏｎ）を含んでもよい。
【００５１】
ブロック４１２において、方法４００Ｂは、ユーザが、ヒントに応答して手動による機能拡張とともに現在のテストコンテキストを増強することを所望しているか否かを判定してもよい。ユーザは、テスト対象関数の又はテスト対象関数を含むソースコード又はソフトウェア製品の開発者を含んでもよい。ユーザが、現在のテストコンテキストを増強することを所望していない場合（ブロック４１２における「Ｎｏ」）、方法４００Ｂは、ブロック４１４において終了してもよく、且つ、現在のテストコンテキストは、テスト対象関数をテストするために、対応するテストプロキシに含まれてもよい。
【００５２】
ユーザが、ヒントに応答して現在のテストコンテキストを増強することを所望している場合（ブロック４１２における「Ｙｅｓ」）、ブロック４１６において、ユーザは、ヒントに基づいて現在のテストコンテキストを増強するための入力を提供してもよい。例えば、ユーザは、ヒントに含まれている示唆を実装するための入力を提供してもよい。方法４００Ｂにおいて、ブロック４１２及び４１６は、ユーザによって手動で実行されてもよく、その他のブロックは、例えば、コンピュータにより、自動的に実行されてもよい。
【００５３】
ブロック４１８において、現在のテストコンテキストを増強するために有効であるユーザ入力が受信されてもよい。ユーザ入力は、シンボリックなものとして、又は一定値を有するものとして、現在のテストコンテキストにおけるユーザによって特定された変数の指定を含んでもよい。
【００５４】
ブロック４２０において、ユーザによって特定された変数が、現在のテストコンテキストにおいて識別されてもよい。現在のテストコンテキストにおけるユーザによって特定された変数の識別は、ユーザによって特定された変数の指定の前に存在している直前の先行するテストコンテキストと、ユーザによって特定された変数の指定の後に存在している現在のテストコンテキストとの間におけるテキストの差分を判定することを含んでもよい。
【００５５】
図４Ｂには示されていないが、方法４００Ｂは、現在のテストコンテキストに対する後続の自動的な機能拡張によって、ユーザによって特定された変数が上書きされないように、ユーザによって特定された変数を優先することをさらに含んでもよい。例えば、ユーザによって特定された変数は、さもなければ、現在のテストコンテキストにおいて修正されうる新しいコンテキスト機能拡張として識別されることを回避するために、タグ付け（ｔａｇｇｅｄ）されてもよく、或いは、メモリ内に記録されてもよく、或いは、さもなければ、優先されてもよい。
【００５６】
図４Ｃは、本明細書に記述されている少なくとも１つの実施形態に従って構成された現在のテストコンテキストを使用することにより、テスト対象関数の拡張シンボリック実行を実施するための例示用の方法４０８Ａのフローチャートである。方法４０８Ａは、図４Ｂのブロック４０８の例示用の実施形態に対応したものであってもよく、或いは、図４Ｂのブロック４０８の例示用の実施形態を含んでもよい。方法４０８Ａは、いくつかの実施形態においては、図３のテストコンテキストジェネレータ４００を実行するコンピュータ等のコンピュータ又はその他の装置によって実装されてもよい。別個のブロックとして示されているが、様々なブロックは、望ましい実装形態に応じて、更なるブロックに分割されてもよく、さらに少ない数のブロックに組み合わせられてもよく、或いは、省略されてもよい。
【００５７】
方法４０８Ａは、ブロック４２２において始まってもよく、このブロックにおいて、テスト対象関数は、テスト対象関数の分岐（ｂｒａｎｃｈ）又は終わり（ｅｎｄ）に到達するまで、シンボリックに実行されてもよい。いくつかの実施形態によるシンボリックな実行の態様については、２０１２年８月１６日付けで出願された米国特許出願第１３／５８７，４２３号明細書に開示されており、この特許出願は、引用により、本明細書に包含される。
【００５８】
ブロック４２４において、実体変数（ｃｏｎｃｒｅｔｅ  ｖａｒｉａｂｌｅ）の依存関係（ｄｅｐｅｎｄｅｎｃｅ）がトレース（ｔｒａｃｅｄ）されてもよい。依存関係は、終わり又は分岐に到達するまでシンボリックに実行されるテスト対象関数の一部分に含まれている実体変数についてトレースされてもよい。依存関係は、さらに後述するように、方法４０８Ａにおける後続の使用のために、少なくとも一時的に格納されてもよい。
【００５９】
ブロック４２６において、終わり又は分岐に到達するまでシンボリックに実行されたテスト対象関数の一部分の制約（ｃｏｎｓｔｒａｉｎｔｓ）が解決（ｓｏｌｖｅｄ）されてもよい。
【００６０】
ブロック４２８において、方法４０８Ａは、テスト対象関数が、分岐又は終わりに到達するまで実行されたか否かを判定してもよい。分岐に到達している場合（ブロック４２８における「分岐」）、方法４２８は、ブロック４３０に進んでもよい。終わりに到達している場合（ブロック４２８の「終わり」）、方法４２８は、ブロック４３８に進んでもよい。
【００６１】
ブロック４３０において、方法４０８Ａは、分岐が実行可能であるか否かを判定してもよい。分岐が実行可能である場合（ブロック４３０における「Ｙｅｓ」）、方法４０８Ａは、ブロック４２２に戻ってもよい。ここで、テスト対象関数と、さらに具体的には、ブロック４３０において実行可能であると判定された分岐が、テスト対象関数の分岐（例えば、別の分岐）又は終わりに到達するまで、シンボリックに実行されてもよい。分岐が実行可能ではない場合（ブロック４３０における「Ｎｏ」）、方法４０８Ａは、ブロック４３２に進んでもよい。
【００６２】
分岐が実行可能であるか否かのブロック４３０における判定は、制約及び現在のテストコンテキストに基づいたものであってもよい。例えば、現在のテストコンテキストは、ブロック４２６において、制約が解決される実体変数の値を特定してもよい。さらには、ブロック４２６における分岐に到達するまでシンボリックに実行されるテスト対象関数の一部分の制約の解決は、分岐の経路条件（ｐａｔｈ  ｃｏｎｄｉｔｉｏｎ）を満たす実体変数の１つ又は複数の値を識別することを含んでもよい。これらの及びその他の実施形態においては、分岐は、経路条件を満たす実体変数の１つ又は複数の値が現在のテストコンテキストにおいて特定された実体変数の値に等しくないと判定された場合、或いは、さらに一般的には、経路条件を満たす実体変数の１つ又は複数の値が現在のテストコンテキストと矛盾（ｉｎｃｏｎｓｉｓｔｅｎｔ）している場合、制約及び現在のテストコンテキストに基づいて実行可能ではないと判定されてもよい。その一方で、分岐は、経路条件を満たす実体変数の１つ又は複数の値が現在のテストコンテキストにおいて特定された実体変数の値と等しいか又は一貫性を有する（ｃｏｎｓｉｓｔｅｎｔ  ｗｉｔｈ）と判定された場合、制約及び現在のテストコンテキストに基づいて実行可能であると判定されてもよい。
【００６３】
ブロック４３２において、分岐が実行可能ではないことを判定することに応答して（例えば、ブロック４３０における「Ｎｏ」）、方法４０８Ａは、従属実体変数（ｄｅｐｅｎｄｅｎｔ  ｃｏｎｃｒｅｔｅ  ｖａｒｉａｂｌｅ）をシンボリック変数としてマーキングする（ｍａｒｋｉｎｇ）ことを含んでもよい。この代わりに、又はこれに加えて、方法４０８Ａは、ブロック４３２の前に、実体変数が従属しているか又は従属していないかを判定することを含んでもよい。実体変数は、分岐を実行する能力が実体変数に従属している場合、従属しているとみなされてもよい。
【００６４】
ブロック４３４において、例えば、現在のテストコンテキストにおけるユーザによって特定された変数である等のように、ユーザによって特定されたシンボリック変数としてマーキングされた実体変数は、もはやシンボリック変数としてマーキングされていない状態となるように、マーキング解除（ｕｎｍａｒｋｅｄ）されてもよい。図４Ｂの説明に記述されているように、ユーザによって特定された変数は、例えば、ユーザによって特定された変数をタグ付けするか又はメモリ内に記録するか、或いは、さもなければ、ユーザによって特定された変数を優先することにより、優先順位付けされてもよい。したがって、図４Ｃには示されていないが、方法４０８Ａは、ブロック４３４において、ユーザによって特定された変数を含むマーキングされた実体変数をマーキング解除することの前に、ブロック４３２において、シンボリック変数としてマーキングされた実体変数が、ユーザによって特定された変数を含んでいるか否かを判定することを含んでもよい。
【００６５】
ブロック４３６において、方法は、このようにブロック４３２においてマーキングされたシンボリック変数のうちのいくつか又は全てのシンボリック変数の１つ又は複数の事前条件を判定することを含んでもよい。ブロック４３６におけるシンボリック変数の１つ又は複数の事前条件の判定は、シンボリック変数の条件が交わる（ｉｎｔｅｒｓｅｃｔ）ことを含んでもよい。事前条件は、テスト対象関数において黙示的である際には、自動的に判定されてもよい。例えば、テスト対象関数が、変数ｉによってインデックス付け（ｉｎｄｅｘｅｄ）されたサイズ２の配列（ａｒｒａｙ）ａ［］を入力として受け付け、且つ、変数ｉが、５つの要素の配列にアクセスするためのインデックスとしても使用されうる場合、変数ｉの条件は、０＜＝ｉ＜＝１及び０＜＝ｉ＜＝４を含んでもよい。０＜＝ｉ＜＝１と０＜＝ｉ＜＝４の交わり（ｉｎｔｅｒｓｅｃｔｉｏｎ）は、０＜＝ｉ＜＝１である。これは、この例においては、ブロック４３６において判定されてもよい。ブロック４３６から、方法４０８Ａは、ブロック４２２、４２４、４２６、及び４２８に戻ってもよい。
【００６６】
ブロック４２８において、且つ、上述のように、方法４０８Ａは、テスト対象関数が、分岐又は終わりに到達するまで実行されたか否かを判定してもよい。方法４０８Ａは、テスト対象関数の全ての分岐が実行されている場合、ブロック４２８において、テスト対象関数が、終わりに到達するまで実行されたと判定してもよい。この代わりに、方法４０８Ａは、シンボリック変数としてマーキングされた実体変数（例えば、ブロック４３４においてマーキング解除されていないブロック４３２においてマーキングされた変数）がテスト対象関数に対してアクセス可能ではない場合、ブロック４２８において、テスト対象関数が、終わりに到達するまで実行されたと判定してもよい。一般には、変数の、且つ、具体的には、シンボリック変数としてマーキングされた実体変数の、アクセス可能性は、変数のアクセス可能性を設定する任意のアクセス修飾子（ａｃｃｅｓｓ  ｍｏｄｉｆｉｅｒ）に基づいて、或いは、明示的な（ｅｘｐｌｉｃｉｔ）アクセス修飾子が存在していない状態においては、プログラミング言語の対応する既定（ｄｅｆａｕｌｔ）のアクセス可能性に基づいて、判定されてもよい。
【００６７】
Ｃ＋＋プログラミング言語におけるアクセス修飾子の例は、最も制限的なものから最も制限の少ないものに至る順序において、「ｐｒｉｖａｔｅ」、「ｐｒｏｔｅｃｔｅｄ」、及び「ｐｕｂｌｉｃ」を含み、且つ、明示的なアクセス修飾子が存在しない場合における既定のアクセス可能性は、「ｐｒｉｖａｔｅ」アクセス修飾子と同一であってもよい。「ｐｒｉｖａｔｅ」に対応しているアクセス可能性（明示的なアクセス修飾子によって設定されているのか又は既定として設定されているのかを問わず）は、アクセスを同一クラス内に制限している場合がある。Ｃ＃及びＪａｖａ（登録商標）プログラミング言語は、両方とも、Ｃ＋＋におけると同一のアクセス可能性を有する「ｐｒｉｖａｔｅ」アクセス修飾子を含む。したがって、シンボリック変数（例えば、ブロック４３２においてシンボリック変数としてマーキングされ、且つ、ブロック４３４においてマーキング解除されていない実体変数）が、これらの言語のうちのいずれかにおける「ｐｒｉｖａｔｅ」のアクセス可能性を有し、且つ、テスト対象関数がシンボリック変数とは異なるクラスに含まれている場合、シンボリック変数は、テスト対象関数に対してアクセス可能ではないと判定されてもよい。この代わりに、又はこれに加えて、Ｃ＋＋、Ｃ＃、Ｊａｖａ（登録商標）、及び／又はその他のプログラミング言語におけるその他のアクセス修飾子及び／又は既定の設定は、シンボリック変数がテスト対象関数に対してアクセス可能ではないことを示している場合もある。
【００６８】
ブロック４３８において、且つ、シンボリック変数がテスト対象関数に対してアクセス可能であることを判定することに応答して、アクセス可能なシンボリック変数及び／又はその事前条件は、コンテキスト機能拡張として識別されてもよい。次いで、図４Ａ〜図４Ｃの組合せを参照すれば、現在のテストコンテキストは、方法４００Ａ及び４００Ｂのブロック４０４において識別されたコンテキスト機能拡張とともに増強されてもよい。識別されたコンテキスト機能拡張とともに現在のテストコンテキストを増強することは、現在のテストコンテキストにおいて、対応する実体変数をシンボリックとすることを含んでもよい。この代わりに、又はこれに加えて、識別されたコンテキスト機能拡張とともに現在のテストコンテキストを増強することは、対応するシンボリック変数（例えば、現在のテストコンテキストにおいて、シンボリックとされた実体変数）の１つ又は複数の事前条件を現在のテストコンテキストに追加することを含んでもよい。
【００６９】
図４Ｃを再度参照すれば、ブロック４４０において、且つ、シンボリック変数としてマーキングされた実体変数がテスト対象関数に対してアクセス可能ではないことを判定することに応答して、シンボリック変数としてマーキングされたアクセス可能ではない実体変数は、ヒントとして識別されてもよい。次いで、図４Ａ〜図４Ｃの組合せを参照すれば、現在のテストコンテキストは、方法４００Ａ及び４００Ｂのブロック４０６において、追加されたヒントを有してもよい。現在のテストコンテキストに対するヒントの追加は、ユーザが現在のテストコンテキストにおいて、シンボリック変数としてマーキングされた対応する実体変数をシンボリックとするための示唆を、現在のテストコンテキストに追加することにより、ヒントを現在のテストコンテキストに追加することを含んでもよい。
【００７０】
図４Ｃを再度参照すれば、ブロック４４２において、方法４０８Ａは、終了してもよい。ブロック４４２における方法４０８Ａの終了は、図４Ｂの方法４００Ｂのブロック４１０に戻るという結果をもたらしてもよい。したがって、本明細書に記述されているいくつかの実施形態は、図４Ｂのブロック４０２におけると同様にテスト対象関数用の初期テストコンテキストを生成することと、ヒントに対応するコンテキスト機能拡張及び／又は手動による機能拡張とともに現在のテストコンテキストを反復的に増強することとを含む。コンテキスト機能拡張及び／又はヒントは、現在のテストコンテキストを使用することによってテスト対象関数の拡張シンボリック実行を実施することにより、識別される。
【００７１】
図５Ａ〜図５Ｅは、本明細書に記述されている少なくとも１つの実施形態に従って構成されたテスト対象関数Ｆｏｏ（）及び関係するテストコンテキスト５０２Ａ〜５０２Ｅ（集合的に、「テストコンテキスト５０２」）を含む例示用のソースコード５００を示している。テストコンテキスト５０２は、図４Ａ〜図４Ｃの方法４００Ａ、４００Ｂ、及び／又は４０８Ａに従って生成されてもよい。
【００７２】
図５Ａ〜図５Ｅに示されているように、関数Ｆｏｏ（）は、サイズ２の配列ａ［］及び配列ａ［］をインデックス付けする整数ｉを含む関数引数を受け付けている。関数Ｆｏｏ（）は、Ｅｘａｍｐｌｅというクラスに属しており、且つ、ソースコード５００は、クラスＥｘａｍｐｌｅの外部であるとともに「ｐｒｉｖａｔｅ」というアクセス可能性を有する整数ｍｅｍｂｅｒをさらに定義している。関数Ｆｏｏ（）は、様々な「ｉｆ」ステートメント（ｓｔａｔｅｍｅｎｔｓ）に対応する様々な分岐を含む。
【００７３】
次に、図４Ｂ及び図４Ｃをさらに参照し、図５Ａ〜図５Ｅのそれぞれについて説明する。図５Ａのテストコンテキスト５０２Ａは、それぞれ、関数引数ａ［０］、ａ［１］、及びｉをテストコンテキスト５０２Ａにおいて、０という一定値に等しくなるように設定することによってブロック４０２において、生成されうる初期テストコンテキストを含んでもよい。したがって、関数引数ａ［０］、ａ［１］、及びｉは、テストコンテキスト５０２Ａにおいて実体変数であってもよい。
【００７４】
図４Ｂのブロック４０８において、拡張シンボリック実行を関数Ｆｏｏ（）上で実施し、コンテキスト機能拡張及び／又はヒントを識別してもよい。さらに詳しくは、関数Ｆｏｏ（）は、ｉｆ（ａ［ｉ］！＝１）というｉｆステートメントを含むソースコード５００の行５０４における関数Ｆｏｏ（）の第１分岐に到達するまで、ブロック４２２において、テストコンテキスト５０２Ａを使用することによってシンボリックに実行されてもよい。ソースコード５００の行５０４における第１分岐は、第１分岐の経路条件が満たされた際に、且つ、さらに具体的は、ａ［ｉ］！＝１が真（ｔｒｕｅ）として判断された際に、選択（ｆｏｌｌｏｗｅｄ）されてもよい。第１分岐は、ソースコード５００の行５０６において、ｒｅｔｕｒｎ  １というステートメントをさらに含んでもよい。
【００７５】
ブロック４２４において、実体変数ａ［０］、ａ［ｉ］、及びｉの依存関係がトレースされる。ブロック４２６において、実体変数ａ［０］、ａ［ｉ］、及びｉの制約が第１分岐について解決される。例えば、ブロック４２６は、ａ［０］及びａ［１］の値として１を除く任意の整数を、且つ、第１分岐の経路条件（例えば、ａ［ｉ］！＝１）を満たすｉの値として整数０及び１を、識別することを含んでもよい。
【００７６】
ブロック４２８において、（関数Ｆｏｏ（）の終わりではなく）第１分岐に到達したことが判定されてもよい。
【００７７】
ブロック４３０において、第１分岐が、制約及び現在のテストコンテキストに基づいて実行可能であるか否かが判定されてもよい。例えば、制約が、現在のテストコンテキストによって許容されているか、含まれているか、或いは、さもなければ、現在のテストコンテキストと一貫性を有するか否かが判定されてもよい。第１分岐の制約は、ａ［０］＝１を除く任意の整数と、ａ［１］＝１を除く任意の整数とを含み、且つ、図５Ａのテストコンテキスト５０２Ａは、ａ［０］＝０とａ［１］＝０とを含むことから、第１分岐が実行可能であると判定されてもよく、且つ、方法４０８Ａは、ブロック４２２に戻ってもよい。
【００７８】
ブロック４２２の現在の反復において、関数Ｆｏｏ（）は、こちらもｉｆ（ａ［ｉ］！＝１）というｉｆステートメントを含むソースコード５００の行５０４における関数Ｆｏｏ（）の第２分岐に到達するまで、テストコンテキスト５０２Ａを使用することよってシンボリックに実行されてもよい。行５０４における第２分岐は、第２分岐の経路条件が満たされた際に、且つ、さらに詳しくは、ａ［ｉ］！＝１が偽（ｆａｌｓｅ）として判断された際に、選択されてもよい。第２分岐は、ソースコード５００の行５０８において、ｉｆ（ｍｅｍｂｅｒ！＝３）というステートメントをさらに含んでもよい。
【００７９】
ブロック４２４の現在の反復において、実体変数ａ［０］、ａ［ｉ］、及びｉの依存関係がトレースされる（或いは、予めトレースされた依存関係が再使用されてもよい）。ブロック４２６の現在の反復において、実体変数ａ［０］、ａ［ｉ］、及びｉの制約が、第２分岐について解決される。例えば、ブロック４２６は、整数１をａ［０］及びａ［１］の値として、且つ、整数０及び１を第２分岐の経路条件（例えば、ａ［ｉ］！＝１が偽である）を満たすｉの値として識別することを含んでもよい。
【００８０】
ブロック４２８の現在の反復において、（関数Ｆｏｏ（）の終わりではなく）第２分岐に到達したと判定されてもよい。
【００８１】
ブロック４３０の現在の反復においては、第２分岐が、制約及び現在のテストコンテキストに基づいて実行可能であるか否かが判定されてもよい。第２分岐の制約は、ａ［０］＝１及びａ［１］＝１を含んでおり、これらの値は、図５Ａのテストコンテキスト５０２Ａにおけるステートメントａ［０］＝０及びａ［１］＝０と矛盾していることから、第２分岐は、実行可能ではないと判定されてもよく、且つ、方法４０８Ａは、ブロック４３２に進んでもよい。
【００８２】
ブロック４３２において、第２分岐が実行可能ではないことを判定することに応答して、且つ、実体変数ａ［０］、ａ［１］、及びｉが従属実体変数であることを判定することに応答して、実体変数ａ［０］、ａ［１］及びｉは、シンボリック変数としてマーキングされてもよい。実体変数ａ［０］、ａ［１］及びｉは、ブロック４２４においてトレースした依存関係に基づいて、従属実体変数であると判定されてもよい。
【００８３】
シンボリック変数としてマーキングされた実体変数ａ［０］、ａ［１］、及びｉが、ユーザによって特定された実体変数ではないことから、ブロック４３４はスキップ（ｓｋｉｐｐｅｄ）されてもよい。
【００８４】
ブロック４３６において、シンボリック変数（例えば、シンボリック変数としてマーキングされた実体変数ａ［０］、ａ［１］、及びｉ）の事前条件が判定されてもよく、これには、シンボリック変数としてマーキングされた実体変数ｉが、０及び１を含む０〜１の範囲の整数であると判定することが含まれる。この時点から、方法４０８Ａは、アクセス可能である場合、シンボリック変数としてマーキングされた実体変数ａ［０］、ａ［１］、及びｉ、並びに、それらの事前条件（例えば、０＜＝ｉ＜＝１）が、新しいコンテキスト機能拡張としてブロック４３８において識別されるまで、少なくとも実行されてもよい。次いで、図５Ａのテストコンテキスト５０２Ａは、図４Ｂのブロック４０４において、図５Ｂのテストコンテキスト５０２Ｂに示されているように、実体変数ａ［０］、ａ［１］、及びｉのそれぞれを現在のテストコンテキストにおいてシンボリックとすることにより、且つ、事前条件を現在のテストコンテキストに追加することにより、新しいコンテキスト機能拡張とともに増強されてもよい。
【００８５】
この代わりに、又はこれに加えて、ブロック４３６におけるシンボリック変数の事前条件の判定の後に、方法４０８Ａは、ブロック４２２に戻ってもよい。
【００８６】
ブロック４２２の現在の反復において、関数Ｆｏｏ（）は、ｉｆ（ｍｅｍｂｅｒ！＝３）というｉｆステートメントを含むソースコード５００の行５０８における関数Ｆｏｏ（）の第３分岐に到達するまで、テストコンテキスト５０２Ａ（又は、５０２Ｂ）を使用することによって実行されてもよい。行５０８における第３分岐は、第３分岐の経路条件が満たされた際に、且つ、さらに具体的には、ｍｅｍｂｅｒ！＝３が真と判断された際に、選択されてもよい。第３分岐は、ソースコード５００の行５１０において、ｒｅｔｕｒｎ  ２というステートメントをさらに含んでもよい。
【００８７】
ブロック４２４の現在の反復において、実体変数ｍｅｍｂｅｒの依存関係がトレースされる。ブロック４２６の現在の反復において、実体変数ｍｅｍｂｅｒの制約が、第３分岐について解決される。例えば、ブロック４２６は、第３分岐の経路条件（例えば、ｍｅｍｂｅｒ！＝３）を満たす実体変数ｍｅｍｂｅｒの値として、３を除く任意の整数を識別することを含んでもよい。
【００８８】
ブロック４２８の現在の反復において、（関数Ｆｏｏ（）の終わりではなく）第３分岐に到達したと判定されてもよい。
【００８９】
ブロック４３０の現在の反復において、第３分岐が、制約及び現在のテストコンテキストに基づいて実行可能であると判定されてもよい。第３分岐の制約は、実体変数ｍｅｍｂｅｒについて３を除く任意の整数を含んでおり、且つ、テストコンテキスト５０２Ａ（又は、５０２Ｂ）は、実体変数ｍｅｍｂｅｒに関して情報を提供しない（ｓｉｌｅｎｔ）ことから、第３分岐が実行可能ではないと判定されてもよく、且つ、方法４０８Ａは、ブロック４３２に進んでもよい。
【００９０】
ブロック４３２の現在の反復において、第３分岐が実行可能ではないことを判定することに応答して、且つ、実体変数ｍｅｍｂｅｒが従属実体変数であることを判定することに応答して、実体変数ｍｅｍｂｅｒが、シンボリック変数としてマーキングされてもよい。
【００９１】
シンボリック変数としてマーキングされた実体変数ｍｅｍｂｅｒは、ユーザによって特定された実体変数ではなく、且つ、なんらの事前条件をも有していないことから、ブロック４３４及び４３６は、スキップされてもよく、且つ、方法４０８Ａは、ブロック４２２、４２４、４２６、及び４２８に戻ってもよい。
【００９２】
ブロック４２８の現在の反復において、シンボリック変数としてマーキングされた実体変数ｍｅｍｂｅｒが、関数Ｆｏｏ（）を含むクラスＥｘａｍｐｌｅの外部の実体変数ｍｅｍｂｅｒの「ｐｒｉｖａｔｅ」アクセス可能性の観点において、関数Ｆｏｏ（）に対してアクセス可能ではないことから、ソースコード５００の終わりに到達したと判定されてもよい。
【００９３】
アクセス可能である場合、ブロック４３８を上述のように実行し、シンボリック変数としてマーキングされた実体変数ａ［０］、ａ［１］、及びｉ及びそれらの事前条件を新しいコンテキスト機能拡張として識別してもよく、或いは、既に実行されている場合、ブロック４３８は、スキップされてもよい。
【００９４】
ブロック４４０において、シンボリック変数としてマーキングされた実体変数ｍｅｍｂｅｒは、関数Ｆｏｏ（）に対してアクセス可能ではないことから、ヒントとして識別されてもよい。次いで、ヒントは、図５Ｃのテストコンテキスト５０２Ｃの行５１２において示されているように、図４Ｂのブロック４０６において、シンボリック変数としてマーキングされた実体変数ｍｅｍｂｅｒをユーザがシンボリックにするための示唆を追加することにより、図５Ａのテストコンテキスト５０２Ａ（又は、図５Ｂのテストコンテキスト５０２Ｂ）に追加されてもよい。
【００９５】
図５Ｂのブロック４１２において、ユーザは、行５１２におけるヒントに基づいて、図５Ｃのテストコンテキスト５０２Ｃを増強するか否かを判定してもよい。図４Ｂのブロック４１６において、ユーザは、ヒントに基づいて図５Ｃのテストコンテキスト５０２Ｃを増強するための入力を提供してもよい。ブロック４１８において、テストコンテキスト５０２Ｃを増強するために有効であるユーザ入力が、受信されてもよく、この結果、行５１４におけるユーザによって特定された変数を含む図５Ｄのテストコンテキスト５０２Ｄが得られる。具体的には、テストコンテキスト５０２Ｃは、テストコンテキスト５０２Ｃの行５１２におけるヒントを、整数ｍと実体変数ｍｅｍｂｅｒとをシンボリックにするテストコンテキスト５０２Ｄの行５１４におけるステートメントによって置換することにより、増強されている。
【００９６】
図４Ｂのブロック４２０において、図５Ｄのテストコンテキスト５０２Ｄのユーザによって特定された変数は、例えば、図５Ｄのテストコンテキスト５０２Ｄと図５Ｃのテストコンテキスト５０２Ｃの間におけるテキストの差分を判定することにより、識別されてもよく、且つ、図４Ｂの方法４００Ｂは、ブロック４０８に、或いは、さらに詳しくは、図４Ｃの方法４０８Ａのブロック４２２に、戻ってもよい。
【００９７】
ブロック４２２の現在の反復において、関数Ｆｏｏ（）は、こちらもｉｆ（ｍｅｍｂｅｒ！＝３）というｉｆステートメントを含むソースコード５００の行５０８における関数Ｆｏｏ（）の第４分岐に到達するまで、図５Ｄのテストコンテキスト５０２Ｄを使用することによって実行されてもよい。行５０８における第４分岐は、第４分岐の経路条件が満たされた際に、且つ、さらに詳しくは、ｍｅｍｂｅｒ！＝３が偽であると判断された際に、選択されてもよい。第４分岐は、ソースコード５００の行５１６におけるｈ＝ｇｌｏｂａｌ＋１というステートメントと、ソースコード５００の行５１８におけるｉｆ（ｈ！＝２）というステートメントとをさらに含んでもよい。
【００９８】
テストコンテキスト５０２Ｄにおけるシンボリック変数としてのｍｅｍｂｅｒにより、方法４０８Ａは、ブロック４２４、４２６、４２８、及び４３０と進み、ブロック４２２に戻ってもよい。
【００９９】
ブロック４２２の現在の反復において、関数Ｆｏｏ（）は、ｉｆ（ｈ！＝２）というｉｆステートメントを含むソースコード５００の行５１８における関数Ｆｏｏ（）の第５分岐に到達するまで、図５Ｄのテストコンテキスト５０２Ｄを使用することによってさらに実行されてもよい。行５１８における第５分岐は、第５分岐の経路条件が満たされた際に、且つ、さらに詳しくは、ｈ！＝２が真として判断された際に、選択されてもよい。
【０１００】
ブロック４２４の現在の反復において、実体変数ｈが、テストコンテキスト５０２Ｄにおいて特定されていない実体変数ｇｌｏｂａｌに従属していると判定するために、実体変数ｈの依存関係がトレースされる。実体変数ｈ及びｇｌｏｂａｌの制約が、ブロック４２６において解決され、第５分岐に到達したとブロック４２８において判定され、且つ、第５分岐が、制約及びテストコンテキスト５０２Ｄに基づいて実行可能ではないとブロック４３０において判定される。実体変数ｇｌｏｂａｌは、第５分岐について従属していると判定され、且つ、実体変数ｇｌｏｂａｌは、ブロック４３２において、シンボリック変数としてマーキングされる。シンボリック変数としてマーキングされた実体変数ｇｌｏｂａｌが、ユーザによって特定されてはおらず、且つ、なんらの事前条件を含んでいないことから、ブロック４３４及び４３６は、スキップされてもよい。この時点から、方法４０８Ａは、アクセス可能である場合、シンボリック変数としてマーキングされた実体変数ｇｌｏｂａｌが新しいコンテキスト機能拡張としてブロック４３８において識別されるまで、少なくとも実行されてもよい。図示の実施例は、これに該当している。次いで、図５Ｄのテストコンテキスト５０２Ｄは、図５Ｅのテストコンテキスト５０２Ｅに示されているように、図４Ｂのブロック４０４において、シンボリック変数としてマーキングされた実体変数ｇｌｏｂａｌをシンボリックにすることにより、新しいコンテキスト機能拡張とともに増強されてもよい。図４Ｂの方法４００Ｂ及び／又は図４Ｃの方法４０８Ａは、関数Ｆｏｏ（）の残りの部分を通じて且つ／又はブロック４１４及び／又は４４２における終了のまで、継続してもよい。
【０１０１】
図５Ａ〜図５Ｅの例は、テストプロキシのテストコンテキストが、自動的に生成されるヒントに応答して実行される手動による機能拡張とインターリーブ（ｉｎｔｅｒｌｅａｖｅｄ）された自動的なコンテキスト機能拡張の反復的処理を通じて生成されうる方式を示している。これにより、このようなテストコンテキストは、テストコンテキストが完全に又は主に手動的な方式によって生成される場合と比べて、迅速に且つ又は少ない努力によって生成される。
【０１０２】
本明細書に記述されている実施形態は、後程詳述するように、様々なコンピュータハードウェア又はソフトウェアモジュールを含む特殊目的又は汎用のコンピュータの使用を含んでもよい。
【０１０３】
本明細書に記述されている実施形態は、格納されたコンピュータ命令又はデータ構造を担持するか又は有するためのコンピュータ読み取り可能な媒体を使用することにより、実装されてもよい。このようなコンピュータ読み取り可能な媒体は、汎用又は特殊目的コンピュータによってアクセスされうる任意の入手可能な媒体であってもよい。一例として、且つ、限定を伴うことなしに、このようなコンピュータ読み取り可能な媒体は、ＲＡＭ、ＲＯＭ、ＥＥＰＲＯＭ、ＣＤ−ＲＯＭ、又はその他の光ディスクストレージ、磁気ディスクストレージ、又はその他の磁気ストレージ装置、或いは、コンピュータ命令又はデータ構造の形態において、望ましいプログラムコードを担持又は格納するために使用されうるとともに汎用又は特殊目的コンピュータによってアクセスされうる任意のその他のストレージ媒体を含む非一時的なコンピュータ読み取り可能なストレージ媒体を含んでもよい。また、上述の組合せは、コンピュータ読み取り可能な媒体の範囲に含まれてもよい。
【０１０４】
コンピュータ命令は、例えば、汎用コンピュータ、特殊目的コンピュータ、又は特殊目的処理装置に特定の機能又は機能のグループを実行させる命令及びデータを含む。主題は、構造的な特徴及び／又は方法の動作に固有の言語において記述されているが、添付の請求項に定義されている主題は、必ずしも、上述の具体的な特徴又は動作に限定されるものではないことを理解されたい。むしろ、上述の具体的な特徴及び動作は、請求項を実装する例示用の形態として開示されたものである。
【０１０５】
本明細書において使用されている「モジュール」又は「コンポーネント」という用語は、演算システム上において稼働するソフトウェアオブジェクト又はルーチンを意味してもよい。本明細書に記述されている様々なコンポーネント、モジュール、エンジン、及びサービスは、演算システム上において稼働するオブジェクト又は処理として（例えば、別個のスレッドとして）実装されてもよい。本明細書に開示されているシステム及び方法は、好ましくは、ソフトウェアとして実装されるが、ハードウェアにおける又はソフトウェアとハードウェアの組合せにおける実装も、可能であり、且つ、想定される。この説明においては、「演算エンティティ」は、以上において定義されている任意の演算システム又は演算システム上において稼働する任意のモジュール又はモジュールの組合せであってもよい。
【０１０６】
本明細書に記述されている全ての例及び条件に関する言語は、本発明と、当技術分野の発展に寄与する本発明者による概念とを理解する際に読者を支援するための教育的な目的を意図したものであり、且つ、これらの具体的に記述されている例及び条件に対する限定を伴うものではないものと解釈されたい。本発明の実施形態について詳細に説明したが、本発明の精神及び範囲を逸脱することなしに、これらに対して様々な変化、置換、及び修正が実施可能であることを理解されたい。
【図１】
2015146178.tif 000003
【図２Ａ】
2015146178.tif 000004
【図２Ｂ】
2015146178.tif 000005
【図３】
2015146178.tif 000006
【図４Ａ】
2015146178.tif 000007
【図４Ｂ】
2015146178.tif 000008
【図４Ｃ】
2015146178.tif 000009
【図５Ａ】
2015146178.tif 000010
【図５Ｂ】
2015146178.tif 000011
【図５Ｃ】
2015146178.tif 000012
【図５Ｄ】
2015146178.tif 000013
【図５Ｅ】
2015146178.tif 000014