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