JP6520074B2 - テストダブルの生成 - Google Patents

テストダブルの生成 Download PDF

Info

Publication number
JP6520074B2
JP6520074B2 JP2014238059A JP2014238059A JP6520074B2 JP 6520074 B2 JP6520074 B2 JP 6520074B2 JP 2014238059 A JP2014238059 A JP 2014238059A JP 2014238059 A JP2014238059 A JP 2014238059A JP 6520074 B2 JP6520074 B2 JP 6520074B2
Authority
JP
Japan
Prior art keywords
test
double
proxies
refined
abstract
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Active
Application number
JP2014238059A
Other languages
English (en)
Other versions
JP2015146179A (ja
Inventor
吉田 浩章
浩章 吉田
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Fujitsu Ltd
Original Assignee
Fujitsu Ltd
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Fujitsu Ltd filed Critical Fujitsu Ltd
Publication of JP2015146179A publication Critical patent/JP2015146179A/ja
Application granted granted Critical
Publication of JP6520074B2 publication Critical patent/JP6520074B2/ja
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F11/00Error detection; Error correction; Monitoring
    • G06F11/36Preventing errors by testing or debugging software
    • G06F11/3668Software testing
    • G06F11/3672Test management
    • G06F11/3684Test management for test design, e.g. generating new test cases
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F11/00Error detection; Error correction; Monitoring
    • G06F11/07Responding to the occurrence of a fault, e.g. fault tolerance
    • G06F11/0703Error or fault processing not based on redundancy, i.e. by taking additional measures to deal with the error or fault not making use of redundancy in operation, in hardware, or in data representation
    • G06F11/0706Error or fault processing not based on redundancy, i.e. by taking additional measures to deal with the error or fault not making use of redundancy in operation, in hardware, or in data representation the processing taking place on a specific hardware platform or in a specific software environment
    • G06F11/0745Error or fault processing not based on redundancy, i.e. by taking additional measures to deal with the error or fault not making use of redundancy in operation, in hardware, or in data representation the processing taking place on a specific hardware platform or in a specific software environment in an input/output transactions management context
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F11/00Error detection; Error correction; Monitoring
    • G06F11/07Responding to the occurrence of a fault, e.g. fault tolerance
    • G06F11/0703Error or fault processing not based on redundancy, i.e. by taking additional measures to deal with the error or fault not making use of redundancy in operation, in hardware, or in data representation
    • G06F11/0793Remedial or corrective actions

Landscapes

  • Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • Quality & Reliability (AREA)
  • Physics & Mathematics (AREA)
  • General Engineering & Computer Science (AREA)
  • General Physics & Mathematics (AREA)
  • Computer Hardware Design (AREA)
  • Debugging And Monitoring (AREA)
  • Stored Programmes (AREA)

Description

本明細書に開示されている実施形態は、テストダブル(test double)の生成に関する。
電子装置の利用の増大に伴って、これらの装置上において稼働するソフトウェアプログラムの数も増大している。通常、ソフトウェアプログラムは、開発された際に、ソフトウェアプログラムがその所定の要件の全てを満たしていることを確認するべく検証される。テストダブルは、特定の関数(particular function)のテストに伴う複雑性を低減するべく、被呼出し関数(callee function)を呼び出す特定の関数をテストする際に被呼出し関数の代わりにしばしば使用される。しかしながら、テストダブルは、特定の関数の網羅率(coverage)を低減する場合があると共に/又は、誤った経路(false paths)を生成する場合がある。
本明細書において権利請求されている主題は、なんらかの欠点を解決するか又は上述のもの等の環境においてのみ稼働する実施形態に限定されるものではない。むしろ、この背景説明は、本明細書に記述されているいくつかの実施形態を実施してもよい例示用の一技術領域を示すために提供されているものに過ぎない。
一実施形態の一態様によれば、テスト対象関数(function under test)の被呼出し関数用のテストダブルプロキシ(test double proxies)を生成するための方法は、テスト対象関数によって呼び出される全ての被呼出し関数用の抽象テストスタブ(abstract test stub)を有するテストダブルプロキシの初期の組を生成することを含んでもよい。テストダブルプロキシの初期の組内のテストダブルプロキシのそれぞれは、被呼出し関数のうちの異なる被呼出し関数に対応してもよい。また、方法は、抽象テストスタブのうちの第1の抽象テストスタブの精緻化(refine)がテスト対象関数のテストカバレッジ(test coverage)を向上させると判定することに応答して、テストダブルプロキシの初期の組内の第1のテストダブルプロキシ用の抽象テストスタブのうちの第1の抽象テストスタブの代わりに、第1の精緻化されたテストスタブを含むテストダブルプロキシの第1の精緻化された組を生成することを含んでもよい。
実施形態の目的及び利点は、請求項において具体的に指摘されている要素、特徴、及び組合せにより、少なくとも実現及び達成される。
上述の一般的な説明と以下の詳細な説明は、いずれも、特許請求されている本発明の例示及び説明を目的としており、且つ、その制限を目的としたものではないことを理解されたい。
添付図面を使用することにより、例示用の実施形態についてさらに具体的且つ詳細に記述及び説明する。
例示用のソフトウェアテストツールを示す。 例示用のテスト対象関数、例示用の被呼出し関数、及び例示用のテストダブルを示す。 例示用のテスト対象関数及び例示用のプロキシファイルを示す。 図3の例示用のテスト対象関数、別の例示用のプロキシファイル、及び例示用のテストケースを示す。 テストダブルプロキシの1つ又は複数の組を生成するように構成された例示用のテストダブルプロキシジェネレータのブロックダイアグラムである。 テスト対象関数の被呼出し関数用のテストダブルプロキシを生成するための例示用の方法のフローチャートである。 テスト対象関数の被呼出し関数用のテストダブルプロキシを生成するための別の例示用の方法のフローチャートである。 被呼出し関数に対する呼出しを有するテスト対象関数を含む例示用のソースコードを示す。 被呼出し関数に対する呼出しを有するテスト対象関数を含む例示用のソースコードを示す。 被呼出し関数に対する呼出しを有するテスト対象関数を含む例示用のソースコードを示す。 被呼出し関数に対する呼出しを有するテスト対象関数を含む例示用のソースコードを示す。 被呼出し関数に対する呼出しを有するテスト対象関数を含む例示用のソースコードを示す。
添付図面を参照し、本発明の実施形態について説明する。本明細書における実質的に全ての複数の且つ/又は単数の用語の使用との関係において、当業者は、文脈及び/又は用途に応じて、適宜、複数を単数に変換できると共に/又は単数を複数に変換できる。本明細書においては、わかり易くするために、様々な単数又は複数の順列(permutation)が明示的に記述されている場合がある。
図1は、本明細書に記述されている少なくとも1つの実施形態に従って構成された例示用のソフトウェアテストツール100を示している。ソフトウェアテストツール100は、テストドライバ102と、テストプロキシ104と、1つ又は複数のテストダブルプロキシ106A〜106N(集合的に(collectively)、「テストダブルプロキシ106」)とを含んでもよい。ソフトウェアテストツール100は、テスト対象関数108をテスト又は検証するように構成されてもよい。
テスト対象関数108は、検証及び/又はその他のテストを受けるソースコード及び/又はソフトウェア製品に含まれた関数であってもよい。検証及び/又はその他のテストは、単体テストを含んでもよい。テスト対象関数108及び/又は対応するソースコード又はソフトウェア製品は、C++(登録商標)、C#(登録商標)、Java(登録商標)、又はその他のプログラミング言語を含む様々なプログラミング言語のうちのいずれかであってもよい。テスト対象関数108は、1つ又は複数の被呼出し関数110A〜110N(集合的に、「被呼出し関数110」)に対する関数呼出しを含んでもよい。
テストドライバ102は、テストプロキシ104及びテストダブルプロキシ106を生成するように構成されてもよい。テストプロキシ104は、テスト対象関数108のパラメータ化された使用法シナリオを含んでもよい。テストプロキシ104は、テスト対象関数108を呼び出してもよく、且つ、テスト対象関数108内のパラメータ又はその他の変数に対して条件を適用するコンパイル可能なソースコードを含んでもよい。図1のテストプロキシ104等のテストプロキシに関する態様については、2013年3月14日付けで出願された米国特許出願第13/828,886号明細書及び2014年1月31日付けで出願された「TEST CONTEXT GENERATION」という名称の米国特許出願第14/170,217号明細書に開示されており、これらの特許出願は、引用により、本明細書に包含される。
また、テストドライバ102は、テスト入力パターンと呼ばれる1つ又は複数の入力の複数の組を生成するとともにテストプロキシ104及びテスト入力パターンを使用して、テスト対象関数108をテストするように、構成されてもよい。それぞれのテスト入力パターンごとに、テストドライバ102は、結果が予想結果と整合しているか否かをチェックするように構成されてもよい。結果が予想結果と整合している場合、テストドライバ102は、対応するテスト入力パターンによって実行された際にテスト対象関数108が合格したと判定してもよい。その一方で、結果が予想結果と整合していない場合、テストドライバ102は、対応するテスト入力パターンによって実行された際にテスト対象関数108が不合格となったと判定してもよい。これは、テスト対象関数108を含むソースコード又はソフトウェア製品におけるバグ又はエラーを示している。テスト対象関数108を含むソースコード又はソフトウェア製品の開発者等のユーザは、不合格について通知されてもよく、且つ、バグ又はエラーを訂正するための改善策(remedial measures)を施してもよい。
上述のように、テスト対象関数108は、被呼出し関数110を呼び出してもよい。例えば、単体テスト等のテストのためにテスト対象関数108をより良好に分離(isolate)するべく、テストダブルを使用してもよい。テストダブルは、一般に、複雑さを低減するとともにテストを促進する単純化されたバージョンの被呼出し関数を含んでもよい。一般的テストダブルの例は、テストスタブ(test stubs)、モックオブジェクト(mock objects)、テストスパイ(test spies)、フェイクオブジェクト(fake objects)、及びダミーオブジェクト(dummy objects)を含む。標準的なテストダブルは、ソースコード内の被呼出し関数をテストダブルと置換することにより、実装されてもよい。図1のテストダブルプロキシ106等のテストダブルプロキシは、テスト対象関数内において被呼出し関数に対する呼出しをテストダブルプロキシに対する呼出しと置換するとともにテストプロキシ内において、又はテストプロキシを有する一般的ファイル内において、テストダブルプロキシを含むことにより、実装されてもよい。テストダブルプロキシは、コードプリプロセッサマクロ、修正されたコンパイラ及びリンカー、並びに/或いは、ランタイムの実装修正を使用してテスト対象関数内において、被呼出し関数に対する呼出しをテストダブルプロキシに対する呼出しと置換することにより、ソースコードを修正することを伴うことなしに、挿入されてもよい。
したがって、図1を参照すると、ソフトウェアテストツール100は、テストダブルプロキシ106を含んでもよい。テストダブルプロキシ106は、被呼出し関数110と同一の数及びタイプの入力を受け付けると共に/又は同一の数又はタイプの出力を提供するように、被呼出し関数110と同一のインターフェイスを含んでもよい。さらに詳しくは、テストダブルプロキシ106Aは、被呼出し関数110Aと同一のインターフェイスを含んでもよく、テストダブルプロキシ106Bは、被呼出し関数110Bと同一のインターフェイスを含んでもよく、且つ、テストダブルプロキシ106Nは、被呼出し関数110Nと同一のインターフェイスを含んでもよい。しかしながら、テストダブルプロキシ106は、被呼出し関数110よりも単純であってもよい。一例として、被呼出し関数110Aは、1つ又は複数の入力を受け付けてもよく、入力を使用していくつかの複雑な演算を実行してもよく、且つ、複雑な演算に基づいて1つ又は複数の出力を返してもよい。対照的に、テストダブルプロキシ106Aは、同一の入力を受け付けてもよく、且つ、なんらの演算をも実行することなしに定数値を出力として返してもよく、或いは、入力を使用して比較的(relatively)単純な演算を実行し、出力を生成するとともに返してもよい。
図2は、例示用のテスト対象関数200、例示用の被呼出し関数202、及び例示用のテストダブル204A及び204B(集合的に、「テストダブル204」)を示している。テスト対象関数200は、テスト対象関数200の行206において、被呼出し関数202を呼び出している。テスト対象関数200は、省略符号(ellipses)が示さすように、その他のステートメント(statement)又はコードを含んでもよい。図中におけるその他の関数又はソースコード内の省略符号の存在は、同様に、その他のステートメント又はコードのその内部における潜在的な包含を示している。
被呼出し関数202は、いずれも整数である2つの入力又は引数x及びyを受け付けてもよく、且つ、結果を返してもよい。被呼出し関数202は、複雑な演算を実行してもよい。テスト対象関数200をテストしている間に、被呼出し関数202の複雑な演算を実行すれば、テスト対象関数200のテストが遅くなる場合があると共に/又は、テストの際に識別されるエラーの位置を正確に示すことが困難になる場合がある。その理由は、エラーが、テスト対象関数200と被呼出し関数202のいずれにおいて発生したのか又はこれらのいずれに由来しているのかが明瞭でなくなる場合があるからである。
テスト対象関数200のテストを単純化するべく、テストダブル204のうちの1つが被呼出し関数202を代用してもよい。テストダブル204は、被呼出し関数202と同一のインターフェイスを含んでもよい。具体的には、テストダブル204は、それぞれ、x及びyという2つの入力又は引数を受け付け、且つ、結果を返す。テストダブル204Aは、x及びyを受け付けるとともになんらの演算をも実行することなしに1等の定数値を返す単純なテストスタブ又はダミー関数を含んでもよい。テストダブル204Bは、スマートテストスタブ(smart test stub)を含んでもよく、スマートテストスタブは、例えば、x及びyを受け付け、被呼出し関数202の複雑な演算を近似(approximate)しているがそれよりも単純であるx+y等の比較的単純な演算を実行し、且つ、比較的単純な演算の結果をテスト対象関数200に返すことにより、被呼出し関数202を近似する。
図3は、本明細書に記述されている少なくとも1つの実施形態に従って構成された例示用のテスト対象関数300及び例示用のプロキシファイル302A及び302B(集合的に、「プロキシファイル302」)を示している。テスト対象関数300は、図2のテスト対象関数200と同様であり、相違点は、テスト対象関数200内における被呼出し関数がBar()である被呼出し関数202に対する呼出しが、図3のテスト対象関数300においては、行304において、プロキシファイル302のそれぞれに含まれているテストダブルプロキシ306、即ち、StubBar()に対する呼出しにより、置換されているという点にある。
プロキシファイル302A内において、StubBar()テストダブルプロキシ306は、オリジナル動作テストスタブ308を含む。オリジナル動作テストスタブは、対応する被呼出し関数を呼び出すテストスタブを含んでもよい。したがって、オリジナル動作テストスタブ308は、例えば、「return Bar(x,y)」ステートメント(statement)により、被呼出し関数Bar()を単純に呼び出している。
プロキシファイル302B内においては、StubBar()テストダブルプロキシ306は、スマートテストスタブ310を含んでいる。スマートテストスタブ310は、被呼出し関数Bar()よりも比較的単純でありつつ、被呼出し関数Bar()を近似している。
両方のプロキシファイル302は、テスト対象関数300のテストプロキシ312をさらに含んでいる。この代わりに、又はこれに加えて、その他のテストスタブを含むその他のプロキシファイル302を生成してもよい。
テストの際には、テストプロキシ312は、テスト対象関数300を呼び出し、且つ、テスト対象関数300は、オリジナル動作テストスタブ308、スマートテストスタブ310、又はなんらかのその他のテストスタブを含むStubBar()テストダブルプロキシ306を呼び出す。例えば、プロキシファイル302等のプロキシファイル内において、テストプロキシ312等のテストプロキシをStubBar()テストダブルプロキシ306等の1つ又は複数のテストダブルプロキシとともにパッケージ化すれば、テスト対象関数の被呼出し関数に対応するテストダブルプロキシの動作に対する中央集中化された制御が許容されることになろう。例えば、テストダブルプロキシのうちの1つ又は複数のテストダブルプロキシ用のテストスタブは、オリジナルのソースコードの修正を伴うことなしに、必要に応じて、異なるタイプのテストスタブとなるように精緻化されてもよい。
図4は、本明細書において記述されている少なくとも1つの実施形態に従って構成された例示用のテスト対象関数300、別の例示用のプロキシファイル400、及び例示用のテストケース(test case)402A〜402C(集合的に、「テストケース402」)を示している。プロキシファイル400は、テストプロキシ312及びStubBar()テストダブルプロキシ306を含む。
StubBar()テストダブルプロキシ306は、抽象テストスタブ404を含んでもよい。Bar()被呼出し関数等の、変数を返す被呼出し関数用の抽象テストスタブは、例えば、p3等のシンボリック変数として割り当てられる、例えば、StubVar等の変数を返すパラメータ化されたテストスタブを含んでもよい。この代わりに、又はこれに加えて、変数を返さない被呼出し関数用の抽象テストスタブは、何もしないテストスタブを含んでもよく、その例については、以下において図示及び記述される。
抽象テストスタブ404は、StubBar()テストダブルプロキシ306が呼び出された際に返されるプロキシファイル400内に新しい変数StubVarを生成することにより、且つ、テストプロキシ312内においてStubVarをシンボリック変数p3として割り当てることにより、パラメータ化されてもよい。この実施形態及びその他の実施形態において、テストプロキシ312は、x及びyの代わりにシンボリック変数p1及びp2を使用するとともにテストプロキシ312用の引数としてシンボリック変数p1、p2、及びp3を受け付けることにより、パラメータ化されてもよい。
テストの際には、図4のテストプロキシ312は、テスト対象関数300を呼び出し、且つ、テスト対象関数300は、抽象テストスタブ404を含むStubBar()テストダブルプロキシ306を呼び出す。次いで、抽象テストスタブ404は、StubVarを返し、StubVarは、テストプロキシ312内においてシンボリック変数p3として割り当てられている。
p1、p2、及びp3の値の特定の組合せをテストケース402によってテストできる。具体的には、テストケース402のそれぞれは、シンボリック変数p1、p2、及びp3のそれぞれごとに定数値を渡(pass)すことにより、テストプロキシ312を呼び出してもよい。例えば、テストケース402Aは、p1、p2、及びp3の値として0、0、及び0をテストプロキシ312に渡してもよく、テストケース402Bは、p1、p2、及びp3の値として1、2、及び2をテストプロキシ312に渡してもよく、且つ、テストケース402Cは、9、0、及び1の値をテストプロキシ312に渡してもよい。任意の所望の数のテストケース402を生成し、任意の所望の数のp1、p2、及びp3の値の組合せをテストしてもよい。
図5は、本明細書において記述されている少なくとも1つの実施形態に従って構成されたテストダブルプロキシの1つ又は複数の組502を生成するように構成された例示用のテストダブルプロキシジェネレータ500のブロックダイアグラムである。組502のうちの少なくとも1つは、プロキシファイル内においてテストプロキシとともにパッケージ化されてもよい。テストダブルプロキシジェネレータ500は、テスト対象関数506及び1つ又は複数の被呼出し関数508A〜508N(集合的に、「被呼出し関数508」)を含むソースコード504に基づいて、且つ、ユーザ入力510に基づいて、テストダブルプロキシ502を生成するように構成されてもよい。
テスト対象関数506は、図1、図3、及び図4のテスト対象関数108又は300に対応していてもよく、或いは、これらを含んでいてもよい。被呼出し関数508のそれぞれは、図1、図3、及び図4の被呼出し関数110又は306に対応していてもよく、或いは、これらを含んでいてもよい。
組502のそれぞれは、被呼出し関数のそれぞれごとに1つを含む1つ又は複数のテストダブルプロキシを含んでもよい。例えば、組502のそれぞれは、第1被呼出し関数508Aに対応する第1のテストダブルプロキシを含んでもよく、被呼出し関数508のうちの第2の被呼出し関数に対応する第2テストダブルプロキシを含んでもよく、且つ、以下同様に継続し、最後の被呼出し関数508Nに対応する最後のテストダブルプロキシを含んでもよい。
組502は、被呼出し関数508用の抽象テストスタブを有するテストダブルプロキシの初期の組502Aを含んでもよい。テストダブルプロキシ502は、組502のうちの先行する組内の少なくとも1つの抽象テストスタブの精緻化によって順番に生成される1つ又は複数の精緻化された組502B−1〜502B−N(集合的に、「精緻化された組502B」)をさらに含んでもよい。例えば、第1の精緻化された組502B−1は、初期の組502Aのテストダブルプロキシ内の少なくとも1つの抽象テストスタブの精緻化によって生成されてもよく、第2の精緻化された組(図示せず)は、直前の第1の精緻化された組502B−1内の少なくとも1つの抽象テストスタブの精緻化によって生成されてもよく、且つ、以下同様に継続し、最後の精緻化された組502B−Nは、直前の最後から二番目の精緻化された組(図示せず)内の少なくとも1つの抽象テストスタブの精緻化によって生成されてもよい。
最後の精緻化された組502B−Nは、組502の全ての間における最大量の精緻化を含んでもよく、且つ、図4のテストプロキシ312等のテストプロキシとともにパッケージ化された状態において、図4のプロキシファイル400等のプロキシファイルに含まれてもよい。この代わりに、又はこれに加えて、その他の組502のうちのいずれかがプロキシファイルに含まれてもよい。精緻化は、図3のオリジナル動作テストスタブ308等のオリジナル動作テストスタブへの抽象テストスタブのシンボリック実行に基づいた自動精緻化及び/又は図3のスマートテストスタブ310等のスマートテストスタブを含んでもよいユーザによって特定されたテストスタブへの抽象テストスタブの手動精緻化を含んでもよい。
テストダブルプロキシジェネレータ500は、抽象化モジュール512、精緻化モジュール514、ユーザインターフェイスモジュール516、シンボリック実行モジュール518、及びテストカバレッジモジュール520を含んでもよい。テストダブルプロキシジェネレータ500及び/又はモジュール512、514、516、518、及び520のうちの1つ又は複数は、ハードウェア、ソフトウェア、又はこれらの組合せにおいて実装されてもよい。例えば、テストダブルプロキシジェネレータ500及び/又はモジュール512、514、516、518、及び520のうちの1つ又は複数は、本明細書において記述されている機能及び動作を実行するように構成された1つ又は複数のASIC(Application−Specific Integrated Circuit)及び/又は1つ又は複数のFPGA(Field−Programmable Gate Array)において実装されてもよい。
この代わりに、又はこれに加えて、モジュール512、514、516、518、及び520を含むテストダブルプロキシジェネレータ500は、本明細書において記述されている機能及び動作を実行することをプロセッサが実行可能であるコンピュータ命令を含んでもよい。コンピュータ命令は、非一時的なコンピュータ読み取り可能な媒体内に格納されてもよく、その例については、さらに詳細に後述する。本明細書において記述されている実施形態は、プロセッサと、プロセッサに通信可能に連結されたメモリ等の非一時的なコンピュータ読み取り可能な媒体とを含むコンピュータ等の装置を含んでもよい。非一時的なコンピュータ読み取り可能な媒体は、本明細書において記述されている機能及び動作を実行することをプロセッサが実行可能であるテストダブルプロキシジェネレータ500及び/又はモジュール512、514、516、518、及び520のうちの1つ又は複数を格納してもよい。次に、モジュール512、514、516、518、及び520について説明する。
抽象化モジュール512は、テスト対象関数506によって呼び出される被呼出し関数508の全てについて抽象テストスタブを有するテストダブルプロキシの初期の組502Aを生成するように構成されてもよい。初期の組502Aに含まれているそれぞれのテストダブルプロキシは、抽象テストスタブのうちの異なる抽象テストスタブを含んでもよく、且つ、被呼出し関数508のうちの異なる被呼出し関数に対応してもよい。被呼出し関数508のそれぞれごとに、抽象化モジュール512は、被呼出し関数508のそれぞれごとに、被呼出し関数508のうちの対応する被呼出し関数が変数を返さない場合、何もしないテストスタブを生成することにより、或いは、被呼出し関数508のうちの対応する被呼出し関数が変数を返す場合、シンボリック変数として割り当てられた変数を返すパラメータ化されたテストスタブを生成することにより、被呼出し関数508の全てについて抽象テストスタブを有する初期の組502Aを生成するように、構成されてもよい。
精緻化モジュール514は、テストダブルプロキシ502の直前の組内においてテストダブルプロキシの少なくとも1つの抽象テストスタブを精緻化することにより、例えば、精緻化された組502Bを順番に生成するように、構成されてもよい。例えば、第1の精緻化された組502B−1内において、初期の組502Aの第1のテストダブルプロキシに含まれている抽象テストスタブのうちの少なくとも第1の抽象テストスタブが、例えば、置換される等のように、精緻化されたテストスタブに精緻化される一方で、初期の組502Aのその他のテストダブルプロキシに含まれているその他の抽象テストスタブは、潜在的に、第1の精緻化された組502B−1内に留まってもよい。精緻化モジュール514は、直前の組502内における少なくとも1つの抽象テストスタブの精緻化がテスト対象の関数506のテストカバレッジを向上させるという対応する判定に応答して、それぞれの精緻化された組502B−1〜502B−Nを生成してもよい。
ユーザインターフェイスモジュール516は、ユーザ入力510を受信するように構成されてもよい。ユーザ入力510は、精緻化された組502Bのそれぞれ内のテストダブルプロキシの少なくとも1つの抽象テストスタブを、ユーザによって特定されたテストスタブに精緻化するために有効であってもよい。例えば、テストダブルプロキシジェネレータ500が第1の精緻化された組502B−1を出力した後に、ユーザは、留まっている(remain therein)抽象テストスタブのうちの少なくとも1つを精緻化してもよい。この代わりに、又はこれに加えて、ユーザが、留まっている抽象テストスタブのうちの少なくとも1つを精緻化しないと決定した場合、直近に生成された精緻化された組502Bは、テスト対象関数506用のプロキシファイル内においてテストプロキシとともにパッケージ化されてもよい。
精緻化モジュール514及び/又はユーザインターフェイスモジュール516は、被呼出し関数508のテストダブルプロキシを反復して向上するように構成されてもよく、これには、1つ又は複数の反復のそれぞれについて以下のように構成されることが含まれる。精緻化モジュール514は、直前の組502内においてテスト対象関数506のシンボリック実行に基づいて、抽象テストスタブのうちの少なくとも1つを精緻化されたテストスタブに精緻化することにより、現在の精緻化された組502Bを自動的に生成するように構成されてもよい。さらには、ユーザインターフェイスモジュール516は、現在の精緻化された組502B内において、抽象テストスタブのうちの少なくとも1つをユーザによって特定されたテストスタブに精緻化するために有効であるユーザ入力510を受信するように構成されてもよい。反復プロセスの最初の反復において、直前の組502は、初期の組502Aを含んでもよく、且つ、現在の精緻化された組502Bは、第1の精緻化された組502B−1を含んでもよい。さらに一般的には、現在の精緻化された組502Bは、反復プロセスの現在の反復において生成された精緻化された組502Bを含んでもよい。この結果、現在の反復におけるユーザによって特定されたテストスタブを有する現在の精緻化された組502Bは、直後の反復における直前の組502となってもよい。
シンボリック実行モジュール518は、第1の精緻化された組502B−1の生成の前に、全ての抽象テストスタブを有するテストダブルプロキシの初期の組502Aを使用して、テスト対象関数506をシンボリックに実行するように構成されてもよい。テストカバレッジモジュール520は、第1の精緻化された組502B−1の生成の前に、全ての抽象テストスタブを有するテストダブルプロキシの初期の組502Aによって提供されるテスト対象関数506のテストカバレッジを判定するように構成されてもよい。これらの実施形態及びその他の実施形態においては、精緻化モジュール514は、第1の精緻化された組502B−1の生成の前に、抽象テストスタブのサブセットを一時的に精緻化するようにさらに構成されてもよい。これには、抽象テストスタブの少なくとも1つを精緻化されたテストスタブに一時的に精緻化するように構成されることが含まれ、この場合、抽象テストスタブの精緻化されたサブセットは、精緻化されたテストスタブを含む。シンボリック実行モジュール518は、第1の精緻化された組502B−1の生成の前に、抽象テストスタブの一時的に精緻化されたサブセットを含むテストダブルプロキシの初期の組502Aの第1のサブセットとテストダブルプロキシの初期の組502Aの残りの部分(remainder)の両方を使用して、テスト対象の関数506をシンボリックに実行するようにさらに構成されてもよい。テストカバレッジモジュール520は、第1の組502B−1の生成の前に、抽象テストスタブの一時的に精緻化されたサブセットを有するテストダブルプロキシの初期の組502Aの第1のサブセット及びテストダブルプロキシの初期の組502Aの残りの部分によって提供されるテスト対象関数のテストカバレッジが、全ての抽象テストスタブを有するテストダブルプロキシの初期の組502Aによって提供されるテストカバレッジと比較して、向上されていると判定するようにさらに構成されてもよい。精緻化モジュール514は、テストカバレッジが向上されると判定することに応答して、第1の精緻化された組502B−1内において抽象テストスタブの一時的に精緻化されたサブセットを永続的な精緻化(permanent refinement)として含むようにさらに構成されてもよい。
テストカバレッジモジュール520は、全ての抽象テストスタブを有するテストダブルプロキシの初期の組502Aを使用したテスト対象関数506のシンボリック実行の際に、テスト対象関数506のいずれの分岐が選択されないのかを判定することにより、全ての抽象テストスタブを有するテストダブルプロキシの初期の組502Aによって提供されるテスト対象関数506のテストカバレッジを判定してもよい。テストカバレッジモジュール520は、精緻化を使用するテスト対象関数506のシンボリック実行の際に、精緻化がテスト対象関数506の比較的多くの分岐の選択を許容している場合、精緻化が、向上されたテストカバレッジを結果的にもたらすと判定するように構成されてもよい。
精緻化モジュール514、ユーザインターフェイスモジュール516、シンボリック実行モジュール518、及び/又はテストカバレッジモジュール520は、以下のように、テストダブルプロキシの直後の精緻化された組502Bの生成の前に、テストダブルプロキシの現在の組502を反復して精緻化するようにさらに構成されてもよい。これらの実施形態及びその他の実施形態においては、現在の組502は、初期の組502A又は直後の精緻化された組502Bに先行する精緻化された組502Bを含んでもよい。
さらに詳しくは、精緻化モジュール514は、直後の精緻化された組502Bの生成の前に、現在の組502内の抽象テストスタブの全てのサブセットが生成されたか否かを判定し、且つ、抽象テストスタブの全てのサブセットが現在の組502内において精緻化されたことを判定することに応答して、直後の精緻化された組502Bを生成するように、構成されてもよい。抽象テストスタブの全てのサブセットが現在の組502内において精緻化されてはいないことを判定することに応答して、精緻化モジュール514は、精緻されていない現在の組502内の抽象テストスタブの現在のサブセットを一時的に精緻化するようにさらに構成されてもよい。シンボリック実行モジュール518は、直後の精緻化された組502Bの生成の前に、抽象テストスタブの一時的に精緻化された現在のサブセットを有する現在の組502の現在のサブセットと現在の組502の現在の残りの部分の両方を使用して、テスト対象関数506をシンボリックに実行するようにさらに構成されてもよい。現在の組502の現在の残りの部分は、現在の組502の現在のサブセットを除く現在の組502の全てを含んでもよい。現在の組502の現在のサブセットと現在の組502の残りの部分の両方を使用したテスト対象関数506のシンボリック実行がタイムアウトすることに応答して、或いは、現在の組502の現在のサブセットと現在の組502の残りの部分の両方を使用したテスト対象関数506のシンボリック実行が、タイムアウトせず、且つ、テスト対象関数506の以前のテストカバレッジを向上しないことに応答して、精緻化モジュール514は、直後の精緻化された組502Bの生成の前に、抽象テストスタブの一時的に精緻化された現在のサブセットを精緻化解除(unrefine)するようにさらに構成されてもよい。現在の組502の現在のサブセットと現在の組502の残りの部分の両方を使用したテスト対象関数506のシンボリック実行が、タイムアウトせず、且つ、テスト対象関数506の以前のテストカバレッジを向上することに応答して、精緻化モジュール514は、直後の精緻化された組502B内において抽象テストスタブの一時的に精緻化された現在のサブセットを永続的な精緻化として含むようにさらに構成されてもよい。
図6Aは、本明細書において記述されている少なくとも一実施形態に従って構成されたテスト対象関数の被呼出し関数用のテストダブルプロキシを生成するための例示用の方法600Aのフローチャートである。方法600Aは、いくつかの実施形態においては、図5のテストダブルプロキシジェネレータ500を実行するコンピュータ等のコンピュータ又はその他の装置によって実装されてもよい。別個のブロックとして示されているが、様々なブロックは、望ましい実装形態に応じて、さらなるブロックに分割されてもよく、さらに少ない数のブロックに組み合わせられてもよく、或いは、省略されてもよい。
方法600Aは、ブロック602において始まってもよい。ここで、テスト対象関数によって呼び出される全ての被呼出し関数用の抽象テストスタブを有するテストダブルプロキシの初期の組が生成されている。テストダブルプロキシの初期の組内のテストダブルプロキシのそれぞれは、被呼出し関数のうちの異なる被呼出し関数に対応してもよい。全ての被呼出し関数用の抽象テストスタブを有するテストダブルプロキシの初期の組の生成は、被呼出し関数のそれぞれごとに、被呼出し関数のうちの対応する被呼出し関数が変数を返さない場合、何もしないテストスタブを生成することを、或いは、被呼出し関数のうちの対応する被呼出し関数が変数を返す場合、シンボリック変数を返すパラメータ化されたテストスタブを生成することを、含んでもよい。
ブロック604において、テストダブルプロキシの第1の精緻化された組が生成されてもよい。テストダブルプロキシの精緻化された組は、テストダブルプロキシの初期の組内の第1のテストダブルプロキシ用の抽象テストスタブのうちの第1の抽象テストスタブの代わりに、第1の精緻化されたテストスタブを含んでもよい。テストダブルプロキシの第1の精緻化された組は、抽象テストスタブのうちの第1の抽象テストスタブの精緻化がテスト対象関数のテストカバレッジを向上させると判定することに応答して、生成されてもよい。
当業者であれば、本明細書に記述されているこのプロセス及びその他のプロセス及び方法においては、プロセス及び方法において実行される機能は、異なる順序において実装されてもよいことを理解するであろう。さらには、概説されているステップ及び動作は、例として提供されたものに過ぎず、且つ、ステップ及び動作のうちのいくつかは、開示されている実施形態の本質を逸脱することなしに、任意選択であってもよく、さらに少ない数のステップ又は動作に組み合わせられてもよく、或いは、さらなるステップ及び動作に拡張されてもよい。
例えば、方法600Aは、テストダブルプロキシの第1の精緻化された組内の抽象テストスタブのうちの第2の抽象テストスタブを、ユーザによって特定されたテストスタブに精緻化するために有効であるユーザ入力を受信することを含んでもよい。この代わりに、或いは、これに加えて、方法600Aは、テストダブルプロキシを反復して向上することであって、1つ又は複数の反復のそれぞれにおいて、テストダブルプロキシの直前の組内において、テスト対象関数のシンボリック実行に基づいて、抽象テストスタブのうちの少なくとも1つを精緻化されたテストスタブに精緻化することにより、テストダブルプロキシの現在の精緻化された組を自動的に生成することと、テストダブルプロキシの現在の精緻化された組内において、抽象テストスタブのうちの少なくとも1つをユーザによって特定されたテストスタブに精緻化するために有効であるユーザ入力を受信することを含んでもよい。抽象テストスタブのうちの少なくとも1つを精緻化されたテストスタブに精緻化することは、精緻化されたテストスタブに精緻化される抽象テストスタブの少なくとも1つを、被呼出し関数のうちの対応する被呼出し関数に対する呼出しと置換することを含んでもよい。このような精緻化されたテストスタブは、オリジナル動作テストスタブと呼ばれる場合がある。この代わりに、又はこれに加えて、抽象テストスタブのうちの少なくとも1つをユーザによって特定されたテストスタブに精緻化するために有効であるユーザ入力を受信することは、ユーザによって特定されたテストスタブに精緻化される抽象テストスタブのうちの少なくとも1つを、被呼出し関数のうちの対応する被呼出し関数を近似するスマートテストスタブと置換するために有効であるユーザ入力を受信することを含んでもよい。
この代わりに、又はこれに加えて、方法600Aは、テストダブルプロキシの第1の精緻化された組を生成する前に、テストダブルプロキシの初期の組を使用してテスト対象関数をシンボリックに実行することと、テストダブルプロキシの初期の組によって提供されるテスト対象関数のテストカバレッジを判定することと、テストダブルプロキシの初期の組に含まれる抽象テストスタブのサブセットを一時的に精緻化することであって、これには、第1のテストダブルプロキシ内の抽象テストスタブのうちの第1の抽象テストスタブを第1の精緻化されたテストスタブに一時的に精緻化することが含まれ、抽象テストスタブの精緻化されたサブセットは、第1の精緻化されたテストスタブを含むことと、抽象テストスタブの一時的に精緻化されたサブセットを有するテストダブルプロキシの初期の組の第1のサブセットとテストダブルプロキシの初期の組の残りの部分の両方を使用して、テスト対象関数をシンボリックに実行することと、抽象テストスタブの一時的に精緻化されたサブセットを有するテストダブルプロキシの初期の組の第1のサブセット及びテストダブルプロキシの初期の組の残りの部分によって提供されるテスト対象関数のテストカバレッジが、全ての抽象テストスタブを有するテストダブルプロキシの初期の組によって提供されるテストカバレッジと比較して、向上されていると判定することと、テストカバレッジが向上されると判定することに応答して、テストダブルプロキシの第1の精緻化された組内において抽象テストスタブの一時的に精緻化されたサブセットを永続的な精緻化として含むことを含んでもよい。
さらに一般的には、いくつかの実施形態においては、方法600Aは、テストダブルプロキシの直後の精緻化された組を生成する前に、テストダブルプロキシの現在の組を反復して精緻化することを含んでもよい。テストダブルプロキシの直後の精緻化された組を生成する前に、テストダブルプロキシの現在の組を反復して精緻化することは、抽象テストスタブの全てのサブセットがテストダブルプロキシの現在の組内において精緻化されたか否か判定することと、テストダブルプロキシの現在の組内の抽象テストスタブの全てのサブセットが精緻化されたことを判定することに応答して、テストダブルプロキシの直後の精緻化された組を生成することと、テストダブルプロキシの現在の組内の抽象テストスタブの全てのサブセットが精緻化されてはいないことを判定することに応答して、精緻化されていないテストダブルプロキシの現在の組内の抽象テストスタブの現在のサブセットを一時的に精緻化することと、抽象テストスタブの一時的に精緻化された現在のサブセットを有するテストダブルプロキシの現在の組の現在のサブセットとテストダブルプロキシの現在の組の現在の残りの部分の両方を使用して、テスト対象関数をシンボリックに実行することと、テストダブルプロキシの現在の組の現在のサブセットとテストダブルプロキシの現在の組の残りの部分の両方を使用したテスト対象関数のシンボリックの実行がタイムアウトすることに応答して、或いは、テストダブルプロキシの現在の組の現在サブセットとテストダブルプロキシの現在の組の残りの部分の両方を使用したテスト対象関数のシンボリックな実行が、タイムアウトせず、且つ、テスト対象関数の以前のテストカバレッジを向上しないことに応答して、抽象テストスタブの一時的に精緻化された現在のサブセットを精緻化解除する(例えば、一時的精緻化を元に戻す(undo))ことと、テストダブルプロキシの現在の組の現在のサブセットとテストダブルプロキシの現在の組の残りの部分の両方を使用したテスト対象関数のシンボリックな実行が、タイムアウトせず、且つ、テスト対象関数のテストカバレッジを向上することに応答して、テストダブルプロキシの直後の精緻化された組内において、抽象テストスタブの一時的に精緻化された現在のサブセットを永続的な精緻化として含むことを含んでもよい。
この代わりに、又はこれに加えて、方法600Aは、図6Bについて詳述されるさらなるステップ又は動作を含んでもよい。
図6Bは、本明細書において記述されている少なくとも1つの実施形態に従って構成されたテスト対象関数の被呼出し関数用のテストダブルプロキシを生成するための別の例示用の方法600Bのフローチャートである。方法600Bは、いくつかの実施形態においては、図5のテストダブルプロキシジェネレータ500を実行するコンピュータ等のコンピュータ又はその他の装置によって実装されてもよい。別個のブロックとして示されているが、様々なブロックは、望ましい実装形態に応じて、さらなるブロックに分割されてもよく、さらに少ない数のブロックに組み合わせられてもよく、或いは、省略されてもよい。
方法600Bは、上述の図6Aの方法600A又はその変形と重複してもよい1つ又は複数のブロック602、604A、606、608、610、612、614、616、618、620、622、624、626、及び/又は628を含んでもよい。例えば、図6Bの方法600Bは、図6Aのブロック602と同一であるブロック602と、図6Aのブロック604を広範(broadly)に含むブロック604Aとを含んでもよい。図6Bの方法600Bのブロック604A〜628のうちの少なくともいくつかのブロックの組合せは、図6Aのコンテキストにおいて簡潔に記述されているように、且つ、さらに詳細に後述されるように、テストダブルプロキシの直後の精緻化された組の生成の前に、テストダブルプロキシを反復して向上するために且つ/又はテストダブルプロキシの現在の組を反復して精緻化するために、有用であろう。次に、図6Bの方法600Bについて説明する。
テスト対象関数の全ての被呼出し関数用の抽象テストスタブを有するテストダブルプロキシの初期の組の生成(ブロック602)の後に、方法600Bは、ブロック606において、全ての抽象テストスタブを有するテストダブルプロキシの初期の組を使用してテスト対象関数をシンボリックに実行することをさらに含んでもよい。さらに一般的には、ブロック606は、テストダブルプロキシの現在の組を使用してテスト対象関数をシンボリックに実行することを含んでもよい。テストダブルプロキシの現在の組は、ブロック602から到来する場合、全ての抽象テストスタブを有するテストダブルプロキシの初期の組を、ブロック620から到来する場合、少なくとも1つの一時的に精緻化されたテストスタブを、且つ/又は、ブロック628から到来する場合、少なくとも1つのユーザによって特定されたテストスタブを、含んでもよい。
ブロック606〜620は、テストダブルプロキシの直後の組の生成の前に、テストダブルプロキシの現在の組を反復して精緻化するべく、有効であろう。一般に、ブロック606〜620のそれぞれの反復は、テストスタブのサブセットを精緻化することと、精緻化がシンボリック実行のタイムアウトを引き起こすと共に/又はテスト対象関数のテストカバレッジを向上するか否かを判定するためにテスト対象関数をシンボリックに実行することを伴ってもよい。ブロック606〜620は、ブロック604A、622、624、及び/又は628と組み合わせられた際に、テストダブルプロキシを反復して向上するべく、有効であろう。一般に、ブロック604A、622、624、及び/又は628と組み合わせられたブロック606〜620のそれぞれの反復は、テストダブルプロキシの精緻化された組を自動的に生成すること(ブロック606〜620及び604A)と、精緻化された組内のテストダブルプロキシの少なくとも1つを手動で精緻化すること(ブロック622、626、及び/又は628)とを伴ってもよい。
したがって、且つ、ブロック608において、ブロック606〜620が、テストダブルプロキシの初期の組を使用した第1反復に、或いは、さらに一般的には、テストダブルプロキシの現在の組を使用した第1反復に、該当しているか否かが判定されてもよい。ブロック606〜620は、方法600Bがブロック602から又はブロック628から到来している場合、テストダブルプロキシの現在の組を使用した第1反復に該当していると判定されてもよい。ブロック608は、ブロック610(ブロック608の「Yes」)又はブロック612(ブロック608の「No」)によって後続される。
ブロック610において、テストダブルプロキシの現在の組によって提供されるテスト対象関数のテストカバレッジが判定されてもよい。ブロック610は、ブロック618によって後続される。
ブロック618において、テストプロキシの現在の組内の抽象テストスタブの全てのサブセットが精緻化されたか否かが判定されてもよい。さらに詳しくは、テストプロキシの現在の組内の抽象テストスタブの全てのサブセットが、少なくとも一時的に精緻化されたか否かが判定されてもよい。それぞれの一時的精緻化は、ブロック606、612、及び/又は614を実行する経路を辿っている限り、少なくとも継続してもよい。抽象テストスタブのそれぞれのサブセットは、1つ又は複数の抽象テストスタブを含んでもよい。ブロック618は、ブロック620(ブロック618の「No」)又はブロック604A(ブロック618の「Yes」)によって後続される。
ブロック620において、精緻化されていないテストプロキシの現在の組内の抽象テストスタブのサブセットが、一時的に精緻化されてもよい。ブロック620は、ブロック606によって後続される。
ブロック620から到来した際に、ブロック606は、抽象テストスタブの一時的に精緻化された現在のサブセットを有するテストダブルプロキシの現在の組の現在のサブセットとテストダブルプロキシの現在の組の現在の残りの部分を使用して、テスト対象関数をシンボリックに実行することを含んでもよい。テストダブルプロキシの現在の組の現在の残りの部分内のテストダブルプロキシのテストスタブのそれぞれは、一時的にまだ精緻化されていない抽象テストスタブ、予め一時的に精緻化されるとともに、次いで(例えば、ブロック616において)精緻化解除された抽象テストスタブ、予め一時的に精緻化されるとともに、次いで永続的な精緻化として維持されている精緻化されたテストスタブ、及びユーザによって特定されたテストスタブ(ブロック626及び628について説明されるもの)のうちの1つ又は複数を含んでもよい。次いで、ブロック606は、ブロック608によって後続されてもよい。ここで、ブロック606〜620が第1反復に該当していないことが判定されてもよく、この結果、ブロック608は、ブロック612によって後続される。
ブロック612において、抽象テストスタブの一時的に精緻化された現在のサブセットを有するテストダブルプロキシの現在の組の現在のサブセット及びテストダブルプロキシの現在の組の残りの部分を使用したテスト対象関数のシンボリック実行がタイムアウトしたか否かが判定されてもよい。ブロック612は、ブロック614(ブロック612の「No」)又はブロック616(ブロック612の「Yes」)によって後続される。
ブロック614において、抽象テストスタブの一時的に精緻化された現在のサブセットを有するテストダブルプロキシの現在の組の現在のサブセット及びテストダブルプロキシの現在の組の現在の残りの部分を使用したテスト対象関数のシンボリック実行によってテスト対象関数のテストカバレッジが向上されるか否かが判定されてもよい。ブロック614は、ブロック616(ブロック614の「No」)又はブロック618(ブロック614の「Yes」)によって後続される。
ブロック616において、抽象テストスタブの一時的に精緻化された現在のサブセットは、抽象テストスタブの一時的に精緻化された現在のサブセットを有するテストダブルプロキシの現在の組の現在のサブセット及びテストダブルプロキシの現在の組の現在の残りの部分を使用したテスト対象関数のシンボリック実行が、タイムアウトするか、又はテストカバレッジを向上しない場合、精緻化解除されてもよい。抽象テストスタブの一時的に精緻化された現在のサブセットを精緻化解除することは、例えば、抽象テストスタブの一時的に精緻化された現在のサブセットを抽象テストスタブに変更して戻すこと等の一時的精緻化を元に戻すことを含んでもよい。
一方、抽象テストスタブの一時的に精緻化された現在のサブセットを有するテストダブルプロキシの現在の組の現在のサブセット及びテストダブルプロキシの現在の組の現在の残りの部分を使用したテスト対象関数のシンボリック実行が、タイムアウトせず、且つ、テストカバレッジを向上する場合、抽象テストスタブの一時的に精緻化された現在のサブセットは、ブロック606〜620の反復に伴って、永続的な精緻化として維持されてもよく、且つ、ブロック604Aにおいて生成されるテストダブルプロキシの精緻化された組内において永続的な精緻化として包含されてもよい。ブロック606〜620は、テストダブルプロキシの現在の組内の抽象テストスタブの全てのサブセットが少なくとも一時的に精緻化されるまで、反復されてもよい。
ブロック604Aにおいて、テストダブルプロキシの精緻化された組が生成されてもよい。テストダブルプロキシの精緻化された組は、永続的な精緻化として包含された1つ又は複数の精緻化されたテストスタブ及び/又はテストダブルプロキシの直前の組に伴ってブロック606〜620を反復することによって判定された、1つ又は複数の精緻化解除された抽象テストスタブを含んでもよい。ブロック604Aは、ブロック622によって後続される。
ブロック622において、ユーザが、テストダブルプロキシの精緻化された組内のテストスタブの精緻化を所望しているか否かが判定されてもよい。例えば、ユーザは、抽象テストスタブのうちの1つ及び/又は精緻化されたテストスタブのうちの1つを精緻化することを所望してもよい。ブロック622は、ブロック624(ブロック622における「No」)又はブロック626(ブロック622における「Yes」)によって後続される。
ブロック624において、方法600Bは、ユーザが、テストダブルプロキシの、例えば、精緻化された組等の、現在の組内のテストスタブのうちの任意のテストスタブの精緻化を所望していない場合、終了してもよい。次いで、テストダブルプロキシの現在の組は、例えば、図4のプロキシファイル400等のプロキシファイル内においてテストプロキシとともにパッケージ化されてもよい。
ブロック626において、ユーザは、望ましいテストスタブを精緻化するために有効である入力を提供してもよい。ブロック626は、ブロック628によって後続される。
ブロック628において、テストダブルプロキシの現在の組内のテストスタブを精緻化するために有効であるユーザ入力が受信されてもよい。例えば、ユーザは、抽象テストスタブをスマートテストスタブ等のユーザによって特定されたテストスタブに変更するために有効であるユーザ入力を提供してもよい。ブロック628は、ブロック606によって後続される。
次いで、ブロック606〜620は、今回は、テストダブルプロキシの直前の組に伴うブロック606〜620の反復によって判定された少なくとも1つの永続的な精緻化等の少なくとも1つの自動的に精緻化されたテストスタブと、ブロック628において受信された少なくとも1つのユーザによって特定されたテストスタブとを含んでもよいテストダブルプロキシの現在の組を伴って再度、反復されてもよい。
本明細書において記述されているいくつかの実施形態は、図6A及び/又は図6Bの動作のうちの1つ又は複数を実行するようにプロセッサが実行可能に格納されたコンピュータ命令を有する非一時的なコンピュータ読み取り可能な媒体を含んでもよい。テストダブルプロキシジェネレータ500及び/又はそのモジュール512、514、516、518、及び520は、そのようなコンピュータ命令の一例である。
図7A〜図7Eは、本明細書において記述されている少なくとも1つの実施形態に従って構成された被呼出し関数printf()、Bar()、及びBaz()に対する呼出しを有するテスト対象関数Foo()を含む例示用のソースコード700を示している。図7A〜図7Eは、テスト対象関数Foo()のテストプロキシ704及び被呼出し関数printf()、Bar()、及びBaz()用のテストダブルプロキシ706、708、及び710をそれぞれが含むプロキシファイル702A〜702E(集合的に、「プロキシファイル702」)をさらに示している。
テストプロキシ704は、x及びyの代わりにシンボリック変数p1及びp2を使用するとともにシンボリック変数p1及びp2をテストプロキシ704用の引数として受け付けることにより、パラメータ化されてもよい。
プロキシファイル702に含まれているテストダブルプロキシ706、708、及び710の組は、図6Aの方法600A及び/又は図6Bの方法600Bに従って生成されてもよい。
図7A〜図7Eには示されていないが、いくつかの実施形態においては、被呼出し関数printf()、Bar()、及びBaz()に対する呼出しは、テスト対象関数Foo()内において、上述のように、例えば、コードプリプロセッサマクロ、修正されたコンパイラ及びリンカー(linker)、並びに/或いは、ランタイムの実装修正を使用することにより、ソースコード700を修正することなしに、テストダブルプロキシ706、708、710に対する呼出しと置換されてもよい。この代わりに、ソースコード700内において被呼出し関数printf()、Bar()、及びBaz()に対する呼出しを、テストダブルプロキシ706、708、710に対する呼出しと置換することにより、ソースコード700自体が修正されてもよい。
図7A〜図7Eに示されているように、テスト対象関数Foo()は、整数x及びyである2つの引数を受け付けてもよい。ソースコード700の行712は、被呼出し関数printf()に対する呼出しを含む。ソースコード700の行714は、被呼出し関数Bar()を呼出すとともに被呼出し関数Bar()にyを渡す条件ステートメント(conditional statement)を含む。行714における条件ステートメントが真(true)であると判断(evaluate)された場合、ソースコード700の行715における真の分岐が選択される(followed)。行714における条件ステートメントが偽(false)であると判断された場合、ソースコード700の行716における偽の分岐が選択される。行716は、被呼出し関数Baz()に対する呼出しを含み、且つ、被呼出し関数Baz()にxを渡している。行718に表されているように、被呼出し関数Bar()は、複雑な関数であってもよい。行720は、ゼロの値が割り当てられるグローバル変数(以下、「global」)を当初、宣言(declare)してもよい。この変数には、行722に示されているように、被呼出し関数Baz()に渡された値が後から割り当てられてもよい。
次に、図7A〜図7Eのそれぞれについて、図6Bをさらに参照し、説明する。
図7Aのプロキシファイル702Aは、ブロック602において生成されてもよい全ての被呼出し関数printf()、Bar()、及びBaz()用の抽象テストスタブを有するテストダブルプロキシ706、708、710の初期の組を含んでもよい。
被呼出し関数printf()又はBaz()は、そのいずれもが変数を返さない。したがって、抽象テストスタブを有するテストダブルプロキシ706、708、710の初期の組を生成することは、被呼出し関数printf()及びBaz()について、何もしないテストスタブ706A又は710Aを生成することを含んでもよい。したがって、テストスタブ706A又は710Aは、そのいずれもが、変数を返さず、なんらの割当(assingment)をも実行せず、或いは、それ以外のこともしない。
図7A〜図7Eには示されていないが、被呼出し関数Bar()は、変数を返してもよい。したがって、抽象テストスタブを有するテストダブルプロキシ706、708、710の初期の組を生成することは、被呼出し関数Bar()について、変数BarVarを返すパラメータ化されたテストスタブ708を生成することを含んでもよい。パラメータ化されたテストスタブとして抽象テストスタブ708Aを生成することは、テストダブルプロキシ708がパラメータ化されたテストスタブ708A内において呼び出された際に、変数BarVarを返すためのステートメントを含むとともに、テストプロキシ704内において変数BarVarをシンボリック変数p3として割り当てることにより、プロキシファイル702Aの行713において、例えば、変数BarVar等の新しい変数を宣言又はその他の方法で生成することを含んでもよい。テストプロキシ704は、シンボリック変数p3をその引数のうちの1つとして受け付けることにより、さらにパラメータ化されてもよい。ブロック602は、ブロック606によって後続される。
ブロック606において、テスト対象関数Foo()は、全ての抽象テストスタブ706A、708A、及び710Aを有するテストダブルプロキシ706、708、及び710の初期の組を使用することにより、シンボリックに実行されてもよい。ブロック606は、ブロック608によって後続される。
ブロック608において、ブロック606〜620は、テストダブルプロキシの初期の組に伴う第1反復に該当していると判定されてもよい。
ブロック610において、全ての抽象テストスタブ706A、708A、及び710Aを有するテストダブルプロキシ706、708、及び710の初期の組によって提供されるテスト対象関数のテストカバレッジが判定されてもよい。図示の実施形態においては、テスト対象関数Foo()は、globalが2に等しいか否かを判断する行724における条件ステートメントを含む。行724における条件ステートメントが真と判断された場合、ソースコード700の行726における真の分岐が選択される。行724における条件ステートメントが偽と判断された場合、ソースコード700の行728における偽の分岐が選択される。
globalは、ソースコード700の行720において、値0が当初、割り当てられていることから、行724における条件ステートメントは、行728における偽の分岐が選択されるものの、行726における真の分岐が選択されないように、偽と判断される。さらには、被呼出し関数Baz()が、被呼出し関数Baz()に渡された値にglobalを後から割り当てている場合、被呼出し関数Baz()用のテストダブルプロキシ710の抽象テストスタブ710Aは、何もしないことから、全ての抽象テストスタブ706A、708A、710Aを有するテストダブルプロキシ706、708、710の初期の組を使用したテスト対象関数Foo()のテストカバレッジは、ソースコードの行726を除いて、テスト対象関数Foo()の全てを含む。
さらに詳しくは、行726を除くテスト対象関数Foo()の行の全ては、例えば、シンボリック変数をテスト対象関数Foo()の経路条件(path condition)を満たす値に設定する等によって適切な値をシンボリック変数p1、p2、及びp3に設定することにより、網羅(covered)される。例えば、行712、714、及び715は、(p1,p2,p3)=(0,0,0)によって網羅されることになり、且つ、行712、714、716、724、及び728は、(p1,p2,p3)=(0,0,1)によって網羅される。しかしながら、行726は、全てのテストスタブを有するテストダブルプロキシ706、708、710の初期の組を使用することによっては、網羅されない。その理由は、globalの値は、被呼出し関数Baz()が呼び出された際にのみ、変更されうるからである。この呼出しは、抽象テストスタブ710Aを有するテストダブルプロキシ710によって許容されてはいない。ブロック610は、ブロック618によって後続される。
ブロック618において、テストスタブ706、708、及び710のサブセットの全てが精緻化されてはいないと判定されてもよく、且つ、方法600Bは、ブロック620に進んでもよい。ここで、図7Bのプロキシファイル702Bに示されているように、テストダブルプロキシ706の抽象テストスタブ706Aを含むサブセットが、オリジナル動作テストスタブ706Bに一時的に精緻化されてもよい。ブロック620は、ブロック606によって後続される。
ブロック606において、テスト対象関数Foo()は、プロキシファイル702B内のオリジナル動作テストスタブ706Bと抽象テストスタブ708A及び710Aの両方を使用して、シンボリックに実行されてもよい。ブロック606は、ブロック608によって後続されてもよく、且つ、方法600Bは、テストダブルプロキシ706、708、及び710の初期の組を使用した第1反復に該当してはいないことから、方法600Bは、ブロック612に進む。
オリジナル動作テストスタブ706Bは、オリジナル動作テストスタブ706B及び抽象テストスタブ708A及び710を使用して、テスト対象関数Foo()をシンボリックに実行するための時間に対して有意な影響(meaningful impact)を有していないであろう。したがって、シンボリック実行は、タイムアウトすることにならず、且つ、方法600Bは、ブロック614に進む。
オリジナル動作テストスタブ706B及び抽象テストスタブ708A及び710Aによって提供されるテスト対象関数Foo()のテストカバレッジが、全ての抽象テストスタブ706A、708A、及び710Aによって提供されるテストカバレッジとの比較において、テストカバレッジを向上しないと判定されてもよい。その理由は、オリジナル動作テストスタブ706Bによって提供される変化のみが、何かをディスプレイに対して出力するもの又はモニタに対して印刷するものであってもよいからである。したがって、ブロック614は、ブロック616によって後続される。
ブロック616において、オリジナル動作テストスタブ706Bは、精緻化解除されてもよい。換言すれば、オリジナル動作テストスタブ706Bへの抽象テストスタブ706Aの一時的精緻化は、オリジナル動作テストスタブ706Bが、図7Cのプロキシファイル702Cに示されているように、抽象テストスタブ706Aに変更して戻るように、元に戻されてもよい。ブロック616は、ブロック618によって後続される。
ブロック618において、テストスタブ706、708、及び710のサブセットの全てが精緻化されてはいないと判定されてもよく、且つ、方法600Bは、ブロック620に進む。ここで、図7Cのプロキシファイル702Cにさらに示されているように、テストダブルプロキシ708の抽象テストスタブ708Aを含むサブセットは、オリジナル動作テストスタブ708Bに一時的に精緻化されてもよい。ブロック620は、ブロック606によって後続される。
ブロック606において、テスト対象関数Foo()は、プロキシファイル702C内のオリジナル動作テストスタブ708Bと抽象テストスタブ706A及び710Aの両方を使用して、シンボリックに実行されてもよい。ブロック606は、ブロック608によって後続されることになり、且つ、方法600Bは、テストダブルプロキシ706、708、及び710の初期の組を使用したその第1反復に該当していないことから、方法600Bは、ブロック612に進む。
被呼出し関数Bar()は、ソースコード700の行718に表されているように、比較的複雑な関数であってもよい。被呼出し関数Bar()を呼び出すオリジナル動作テストスタブ708Bは、オリジナル動作テストスタブ708B及び抽象テストスタブ706A及び710Aを使用して、テスト対象関数Foo()をシンボリックに実行するための時間に対して有意な影響又は計測可能な影響を有してもよい。実際に、オリジナル動作テストスタブ708B及び抽象テストスタブ706A及び710Aを使用したシンボリック実行は、実行時間が所定の閾値実行時間を超過した場合、タイムアウトしたものと判定されてもよい。この場合、次いで、方法600Bは、ブロック616に進む。
したがって、ブロック616において、オリジナル動作テストスタブ708Bは、精緻化解除されてもよい。換言すれば、オリジナル動作テストスタブ708Bへの抽象テストスタブ708Aの一時的精緻化は、オリジナル動作テストスタブ708Bが、図7Dのプロキシファイル702Dに示されているように、抽象テストスタブ786Aに変更されて戻るように、元に戻されてもよい。その理由は、シンボリック実行がブロック612においてタイムアウトしたからである。ブロック616は、ブロック618によって後続される。
ブロック618において、テストスタブ706、708、及び710のサブセットの全てが精緻化されてはいないと判定されてもよく、且つ、方法600Bは、ブロック620に進む。ここで、図7Dのプロキシファイル702Dに示されているように、テストダブルプロキシ710の抽象テストスタブ710Aを含むサブセットは、オリジナル動作テストスタブ710Bに一時的に精緻化されてもよい。ブロック620は、ブロック606によって後続される。
ブロック606において、テスト対象関数Foo()は、プロキシファイル702D内のオリジナル動作テストスタブ710Bと抽象テストスタブ706A及び708Aの両方を使用して、シンボリックに実行されてもよい。ブロック606は、ブロック608によって後続されることになり、且つ、方法600Bは、テストダブルプロキシ706、708、及び710の初期の組を使用した第1反復に該当していないことから、方法600Bは、ブロック612に進む。
オリジナル動作テストスタブ710Bは、オリジナル動作テストスタブ710B及び抽象テストスタブ706A及び708Aを使用して、テスト対象関数Foo()をシンボリックに実行するための時間に有意な影響を及ぼさない。その理由は、関数Baz()が、ソースコード700において比較的単純な関数であるからである。したがって、シンボリック実行は、タイムアウトすることにならず、且つ、方法600Bは、ブロック614に進む。
オリジナル動作テストスタブ710B及び抽象テストスタブ706A及び708Aによって提供されるテスト対象関数Foo()のテストカバレッジは、全ての抽象テストスタブ706A、708A、及び710Aによって提供されるテストカバレッジと比較して、テストカバレッジを向上するものと判定されてもよい。その理由は、オリジナル動作テストスタブ710Bによって提供される変化が、globalをxに割り当てるからである。ここで、xは、テストプロキシ704内において、シンボリック変数p1としてパラメータ化される。この結果、以前には網羅されていない行726を網羅することが可能となっている。例えば、行712、714、716、724、及び726は、(p1,p2,p3)=(2,0,1)によって網羅されてもよい。したがって、オリジナル動作テストスタブ710Bは、永続的な精緻化として包含されてもよく、且つ、ブロック614は、ブロック618によって後続される。
ブロック618において、テストスタブ706、708、及び710のサブセットの全てが精緻化されたと判定されてもよく、且つ、方法600Bは、ブロック604Aに進む。ここで、テストダブルプロキシ706、708、及び710の精緻化された組が生成されてもよい。テストダブルプロキシ706、708、及び710の精緻化された組内において、テストダブルプロキシ706及び708は、抽象テストスタブ706A及び708Aを含んでもよく、テストダブルプロキシ710は、オリジナル動作テストスタブ710Bを含んでもよい。ブロック602Aは、ブロック622によって後続される。
ブロック622において、ユーザが、テストスタブ706A、708A、及び/又は710Bのうちの1つを精緻化することを所望していると判定されてもよく、且つ、ブロック622は、ブロック626によって後続される。
ブロック626において、ユーザは、抽象テストスタブ708Aをユーザによって特定されたテストスタブに精緻化するために有効であるユーザ入力を、提供してもよい。ブロック628において、抽象テストスタブ708Aをユーザによって特定されたテストスタブに精緻化するために有効であるユーザ入力が受信されてもよい。ユーザによって特定されたテストスタブは、図7Eのプロキシファイル702Eにおいては、708Cにおいて表記(denote)されている。ユーザによって特定されたテストスタブ708Cは、被呼出し関数Bar()を近似するスマートテストスタブを含んでもよく、抽象テストスタブ708Aと関連付けられたパラメータは、削除(removed)されてもよい。具体的には、図7Eのプロキシファイル702Eに示されているように、変数BarVar及びシンボリック変数p3に対する参照を削除してもよい。抽象テストスタブ708Aと関連するパラメータは、ブロック628においてユーザ入力を受信することに応答して自動的に削除されてもよく、或いは、適切なユーザ入力を提供するユーザが、パラメータを手動で削除してもよい。ブロック628は、ブロック606によって後続される。
次いで、ブロック606〜620は、テストダブルプロキシ706、708、及び710の現在の精緻化された組を使用して反復されてもよく、この組は、抽象テストスタブ706Aを有するテストダブルプロキシ706、ユーザによって特定されたテストスタブ708Cを有するテストダブルプロキシ708、及びオリジナル動作テストスタブ710Bを有するテストダブルプロキシ710を含んでもよい。この例においては、テストダブルプロキシ706、708、及び710の現在の精緻化された組を使用したブロック606〜620の反復は、テストダブルプロキシ708又はテストダブルプロキシ710への精緻化を伴わなくてもよい。その理由は、それぞれが、例えば、ユーザによって特定されたテストスタブ708C及びオリジナル動作テストスタブ710B等の精緻化されたテストスタブを既に含んでいるからである。
本明細書に記述されている実施形態は、後程詳述するように、様々なコンピュータハードウェア又はソフトウェアモジュールを含む特殊目的又は汎用のコンピュータの使用を含んでもよい。
本明細書に記述されている実施形態は、格納されたコンピュータ命令又はデータ構造を担持するか又は有するためのコンピュータ読み取り可能な媒体を使用することにより、実装されてもよい。このようなコンピュータ読み取り可能な媒体は、汎用又は特殊目的コンピュータによってアクセスされうる任意の入手可能な媒体であってもよい。一例として、且つ、限定を伴うことなしに、このようなコンピュータ読み取り可能な媒体は、RAM、ROM、EEPROM、CD−ROM、又はその他の光ディスクストレージ、磁気ディスクストレージ、又はその他の磁気ストレージ装置、或いは、コンピュータ命令又はデータ構造の形態において望ましいプログラムコードを担持又は格納するべく使用されうるとともに汎用又は特殊目的コンピュータによってアクセスされうる任意のその他のストレージ媒体を含む非一時的なコンピュータ読み取り可能なストレージ媒体を有してもよい。また、上述の組合せは、コンピュータ読み取り可能な媒体の範囲に含まれてもよい。
コンピュータ命令は、例えば、汎用コンピュータ、特殊目的コンピュータ、又は特殊目的処理装置に所定の機能又は機能のグループを実行させる命令及びデータを有する。主題は、構造的な特徴及び/又は方法の動作に固有の言語において記述されているが、添付の請求項に定義されている主題は、必ずしも、上述の具体的な特徴又は動作に限定されるものではないことを理解されたい。むしろ、上述の具体的な特徴及び動作は、請求項を実装する例示用の形態として開示されたものである。
本明細書において使用されている「モジュール」又は「コンポーネント」という用語は、演算システム上において稼働するソフトウェアオブジェクト又はルーチン(routine)を意味してもよい。本明細書に記述されている様々なコンポーネント、モジュール、エンジン、及びサービスは、演算システム上において稼働するオブジェクト(objects)又はプロセスとして(例えば、別個のスレッドとして)実装されてもよい。本明細書に開示されているシステム及び方法は、好ましくは、ソフトウェアとして実装されるが、ハードウェアにおける又はソフトウェアとハードウェアの組合せにおける実装も、可能であり、且つ、想定される。この説明においては、「演算エンティティ」は、以上において定義されている任意の演算システム又は演算システム上において稼働する任意のモジュール又はモジュールの組合せであってもよい。
本明細書に記述されている全ての例及び条件に関する言語は、本発明と、当技術分野の発展に寄与する本発明者による概念とを理解する際に読者を支援するための教育的な目的を意図したものであり、且つ、これらの具体的に記述されている例及び条件に対する限定を伴うものではないものと解釈されたい。本発明の実施形態について詳細に説明したが、本発明の精神及び範囲を逸脱することなしに、これらに対して様々な変化、置換、及び変更を実施可能であることを理解されたい。

Claims (17)

  1. テスト対象関数の被呼出し関数用のテストダブルプロキシを生成するための方法であって、前記方法は、
    テスト対象関数によって呼び出される全ての被呼出し関数用の抽象テストスタブを有するテストダブルプロキシの初期の組を生成することであって、前記抽象テストスタブは、生成される前記テストダブルプロキシの初期の組に属するテストスタブであり、前記テストダブルプロキシは、プロキシファイル内のテストスタブを含むテストダブルであり、前記テストダブルプロキシの初期の組内の前記テストダブルプロキシのそれぞれは、前記被呼出し関数のうちの異なる被呼出し関数に対応していることと、
    前記抽象テストスタブのうちの第1の抽象テストスタブの精緻化が前記テスト対象関数のテストカバレッジを向上させると判定することに応答して、前記テストダブルプロキシの初期の組内の第1のテストダブルプロキシ用の前記抽象テストスタブのうちの前記第1の抽象テストスタブの代わりに、第1の精緻化されたテストスタブを含むテストダブルプロキシの第1の精緻化された組を生成することと、
    テストダブルプロキシの直後の精緻化された組を生成する前に、テストダブルプロキシの現在の組を反復して精緻化することを含み、
    前記テストダブルプロキシの現在の組は、前記テストダブルプロキシの初期の組又は前記テストダブルプロキシの直後の精緻化された組に先行するテストダブルプロキシの精緻化された組を含み、
    前記テストダブルプロキシの直後の精緻化された組を生成する前に、前記テストダブルプロキシの現在の組を反復して精緻化することは、
    前記抽象テストスタブの全てのサブセットが前記テストダブルプロキシの現在の組内において精緻化されたか否かを判定することと、
    前記テストダブルプロキシの現在の組内の前記抽象テストスタブの全てのサブセットが精緻化されたことを判定することに応答して、前記テストダブルプロキシの直後の精緻化された組を生成することと、
    前記テストダブルプロキシの現在の組内の前記抽象テストスタブの全てのサブセットが精緻化されてはいないことを判定することに応答して、精緻化されていない前記テストダブルプロキシの現在の組内の前記抽象テストスタブの現在のサブセットを一時的に精緻化することと、
    前記抽象テストスタブの前記一時的に精緻化された現在のサブセットを有する前記テストダブルプロキシの現在の組の現在のサブセットと前記テストダブルプロキシの現在の組の現在の残りの部分の両方を使用して、前記テスト対象関数をシンボリックに実行することと、
    前記テストダブルプロキシの現在の組の前記現在のサブセットと前記テストダブルプロキシの現在の組の残りの部分の両方を使用した前記テスト対象関数のシンボリック実行がタイムアウトすることに応答して、或いは、前記テストダブルプロキシの現在の組の前記現在のサブセットと前記テストダブルプロキシの前記現在の組の前記残りの部分の両方を使用した前記テスト対象関数のシンボリック実行が、タイムアウトせず、且つ、前記テスト対象関数の以前のテストカバレッジを向上しないことに応答して、前記抽象テストスタブの前記一時的に精緻化された現在のサブセットを精緻化解除することと、
    前記テストダブルプロキシの現在の組の前記現在のサブセットと前記テストダブルプロキシの現在の組の前記残りの部分の両方を使用した前記テスト対象関数のシンボリック実行が、タイムアウトせず、且つ、前記テスト対象関数の以前のテストカバレッジを向上することに応答して、前記テストダブルプロキシの直後の精緻化された組内において、前記抽象テストスタブの前記一時的に生成された現在のサブセットを永続的な精緻化として含むこと、
    を含む、方法。
  2. 前記テストダブルプロキシの第1の精緻化された組内の前記抽象テストスタブのうちの第2の抽象テストスタブを、ユーザによって特定されたテストスタブに精緻化するために有効であるユーザ入力を受信することをさらに含む、請求項1に記載の方法。
  3. 前記テストダブルプロキシを反復して向上することは、1つ又は複数の反復のそれぞれにおいて、
    テストダブルプロキシの直前の組内において、前記テスト対象関数のシンボリック実行に基づいて、前記抽象テストスタブのうちの少なくとも1つを精緻化されたテストスタブに精緻化することにより、テストダブルプロキシの現在の精緻化された組を自動的に生成することと、
    前記テストダブルプロキシの現在の精緻化された組内において、前記抽象テストスタブのうちの少なくとも1つをユーザによって特定されたテストスタブに精緻化するために有効であるユーザ入力を受信することを含み、
    現在の反復における前記ユーザによって特定されたテストスタブを有する前記テストダブルプロキシの前記現在の精緻化された組は、直後の反復における前記テストダブルプロキシの直前の組となる、請求項2に記載の方法。
  4. 前記抽象テストスタブの少なくとも1つを精緻化されたテストスタブに精緻化することは、前記精緻化されたテストスタブに精緻化される前記抽象テストスタブのうちの少なくとも1つを、前記被呼出し関数のうちの対応する被呼出し関数に対する呼出しを含むオリジナル動作テストスタブと置換することを含む、請求項3に記載の方法。
  5. 前記抽象テストスタブのうちの少なくとも1つをユーザによって特定されたテストスタブに精緻化するために有効であるユーザ入力を受信することは、前記ユーザによって特定されたテストスタブに精緻化される前記抽象テストスタブのうちの前記少なくとも1つを、前記被呼出し関数のうちの対応する被呼出し関数を近似するスマートテストスタブと置換するために有効であるユーザ入力を受信することを含む、請求項3に記載の方法。
  6. 前記テスト対象関数によって呼び出される全ての前記被呼出し関数用の前記抽象テストスタブを有する前記テストダブルプロキシの初期の組を生成することは、前記被呼出し関数のそれぞれごとに、
    前記被呼出し関数のうちの対応する被呼出し関数が変数を返さない場合、何もしないテストスタブ、又は、
    前記被呼出し関数のうちの対応する被呼出し関数が変数を返す場合、シンボリック変数を返すパラメータ化されたテストスタブを生成することを含む、請求項1に記載の方法。
  7. 前記テストダブルプロキシの第1の精緻化された組を生成する前に、

    前記テストダブルプロキシの初期の組を使用して前記テスト対象関数をシンボリックに実行することと、
    前記テストダブルプロキシの初期の組によって提供される前記テスト対象関数の前記テストカバレッジを判定することと、
    前記テストダブルプロキシの初期の組に含まれている前記抽象テストスタブのサブセットを一時的に精緻化することであって、第1のテストダブルプロキシ内の前記抽象テストスタブのうちの前記第1の抽象テストスタブを、前記第1の精緻化されたテストスタブに一時的に精緻化することを含み、前記抽象テストスタブの前記精緻化されたサブセットは、前記第1の精緻化されたテストスタブを含むことと、
    前記抽象テストスタブの前記一時的に精緻化されたサブセットを有する前記テストダブルプロキシの初期の組の第1のサブセットと前記テストダブルプロキシの初期の組の残りの部分の両方を使用して、前記テスト対象関数をシンボリックに実行することと、
    前記抽象テストスタブの前記一時的に精緻化されたサブセットを有する前記テストダブルプロキシの初期の組の前記第1のサブセット及び前記テストダブルプロキシの初期の組の前記残りの部分によって提供される前記テスト対象関数のテストカバレッジが、全ての抽象テストスタブを有する前記テストダブルプロキシの初期の組によって提供されるテストカバレッジとの比較において、向上されると判定することと、
    前記テストカバレッジが向上されると判定することに応答して、前記テストダブルプロキシの第1の精緻化された組内において前記抽象テストスタブの前記一時的に精緻化されたサブセットを永続的な精緻化として含むこと、
    をさらに含む、請求項1に記載の方法。
  8. プロセッサと、
    前記プロセッサに通信可能に連結されるとともに格納されたコンピュータ命令を有する非一時的なコンピュータ読み取り可能な媒体とを有する装置であって、
    前記コンピュータ命令は、
    テスト対象関数によって呼び出される全ての被呼出し関数用の抽象テストスタブを有するテストダブルプロキシの初期の組を生成することを前記プロセッサが実行可能である抽象化モジュールであって、前記抽象テストスタブは、生成される前記テストダブルプロキシの初期の組に属するテストスタブであり、前記テストダブルプロキシは、プロキシファイル内のテストスタブを含むテストダブルであり、前記テストダブルプロキシの初期の組内の前記テストダブルプロキシのそれぞれは、前記被呼出し関数のうちの異なる被呼出し関数に対応している、抽象化モジュールと、
    前記抽象テストスタブのうちの第1の抽象テストスタブの精緻化が前記テスト対象関数のテストカバレッジを向上させると判定することに応答して、前記テストダブルプロキシの初期の組内の第1のテストダブルプロキシ用の前記抽象テストスタブのうちの前記第1の抽象テストスタブの代わりに、第1の精緻化されたテストスタブを含むテストダブルプロキシの第1の精緻化された組を生成することを前記プロセッサが実行可能である精緻化モジュールと、
    ユーザインターフェイスモジュールと、シンボリック実行モジュールと、及び/又はテストカバレッジモジュールと、を含み、
    前記精緻化モジュール、前記ユーザインターフェイスモジュール、前記シンボリック実行モジュール、及び/又は前記テストカバレッジモジュールは、テストダブルプロキシの直後の精緻化された組の生成の前に、テストダブルプロキシの現在の組を反復して生成することを前記プロセッサが実行可能であり、
    前記テストダブルプロキシの現在の組は、前記テストダブルプロキシの初期の組又は前記テストダブルプロキシの直後の精緻化された組に先行するテストダブルプロキシの精緻化された組を含み、
    前記精緻化モジュール、前記ユーザインターフェイスモジュール、前記シンボリック実行モジュール、及び/又は前記テストカバレッジモジュールは、以下のように、前記テストダブルプロキシの現在の組を反復して生成することを前記プロセッサが実行可能であり、
    前記精緻化モジュールは、前記テストダブルプロキシの直後の精緻化された組の生成の前に、前記抽象テストスタブの全てのサブセットが前記テストダブルプロキシの現在の組内において精緻化されたか否かを判定することを前記プロセッサがさらに実行可能であり、
    前記精緻化モジュールは、前記抽象テストスタブの全てのサブセットが前記テストダブルプロキシの現在の組内において精緻化されたことを判定することに応答して、前記テストダブルプロキシの直後の精緻化された組を生成することを前記プロセッサが実行可能であり、
    前記テストダブルプロキシの現在の組内の前記抽象テストスタブの全てのサブセットが精緻化されてはいないことを判定することに応答して、前記精緻化モジュールは、精緻化されていない前記テストダブルプロキシの現在の組内の前記抽象テストスタブの現在のサブセットを一時的に精緻化することを前記プロセッサがさらに実行可能であり、
    前記シンボリック実行モジュールは、前記テストダブルプロキシの直後の精緻化された組の生成の前に、前記抽象テストスタブの前記一時的に精緻化された現在のサブセットを有する前記テストダブルプロキシの現在の組の現在のサブセットと前記テストダブルプロキシの現在の組の現在の残りの部分の両方を使用して、前記テスト対象関数をシンボリックに実行することを前記プロセッサがさらに実行可能であり、
    前記テストダブルプロキシの現在の組の前記現在のサブセットと前記テストダブルプロキシの現在の組の前記残りの部分の両方を使用した前記テスト対象関数のシンボリック実行がタイムアウトすることに応答して、或いは、前記テストダブルプロキシの現在の組の前記現在のサブセットと前記テストダブルプロキシの現在の組の前記残りの部分の両方を使用した前記テスト対象関数のシンボリック実行が、タイムアウトせず、且つ、前記テスト対象関数の以前のテストカバレッジを向上しないことに応答して、前記精緻化モジュールは、前記テストダブルプロキシの直後の精緻化された組の生成の前に、前記抽象テストスタブの前記一時的に精緻化された現在のサブセットを精緻化解除することを前記プロセッサがさらに実行可能であり、
    前記テストダブルプロキシの現在の組の前記現在のサブセットと前記テストダブルプロキシの現在の組の前記残りの部分の両方を使用した前記テスト対象関数のシンボリック実行が、タイムアウトせず、且つ、前記テスト対象関数の以前のテストカバレッジを向上することに応答して、前記精緻化モジュールは、前記テストダブルプロキシの直後の精緻化された組内において前記抽象テストスタブの前記一時的に精緻化された現在のサブセットを永続的な精緻化として含むことを前記プロセッサがさらに実行可能である、装置。
  9. 前記ユーザインターフェイスモジュールは、前記テストダブルプロキシの第1の精緻化された組内の前記抽象テストスタブのうちの第2の抽象テストスタブを、ユーザによって特定されたテストスタブに精緻化するために有効であるユーザ入力を受信することを前記プロセッサが実行可能である、請求項8に記載の装置。
  10. 前記精緻化モジュール及び前記ユーザインターフェイスモジュールは、前記テストダブルプロキシを反復して向上することを前記プロセッサが実行可能であって、1つ又は複数の反復のそれぞれにおいて、
    前記精緻化モジュールは、テストダブルプロキシの直前の組内において、前記テスト対象関数のシンボリック実行に基づいて、前記抽象テストスタブのうちの少なくとも1つを精緻化されたテストスタブに精緻化することにより、テストダブルプロキシの現在の精緻化された組を自動的に生成することを前記プロセッサが実行可能であることと、
    前記ユーザインターフェイスモジュールは、前記テストダブルプロキシの現在の精緻化された組内において、前記抽象テストスタブのうちの少なくとも1つをユーザによって特定されたテストスタブに精緻化するために有効であるユーザ入力を受信することを前記プロセッサが実行可能であることを含み、
    現在の反復における前記ユーザによって特定されたテストスタブを有する前記テストダブルプロキシの現在の精緻化された組は、直後の反復における前記テストダブルプロキシの直前の組になる、請求項9に記載の装置。
  11. 前記シンボリック実行モジュールは、前記テストダブルプロキシの第1の精緻化された組の生成の前に、前記テストダブルプロキシの初期の組を使用して前記テスト対象関数をシンボリックに実行することを前記プロセッサが実行可能であり、
    前記テストカバレッジモジュールは、前記テストダブルプロキシの第1の精緻化された組の生成の前に、前記テストダブルプロキシの初期の組によって提供される前記テスト対象関数のテストカバレッジを判定することを前記プロセッサが実行可能であり、
    前記精緻化モジュールは、前記テストダブルプロキシの第1の精緻化された組の生成の前に、前記抽象テストスタブのサブセットを一時的に精緻化することを前記プロセッサがさらに実行可能であって、第1のテストダブルプロキシ内の前記抽象テストスタブのうちの前記第1の抽象テストスタブを前記第1の精緻化されたテストスタブに一時的に精緻化することを実行可能であることを含み、前記抽象テストスタブの前記精緻化されたサブセットは、前記第1の精緻化されたテストスタブを含み、
    前記シンボリック実行モジュールは、前記テストダブルプロキシの第1の精緻化された組の生成の前に、前記抽象テストスタブの前記一時的に精緻化されたサブセットを有する前記テストダブルプロキシの初期の組の第1のサブセットと前記テストダブルプロキシの初期の組の残りの部分の両方を使用して、前記テスト対象関数をシンボリックに実行することを前記プロセッサがさらに実行可能であり、
    前記テストカバレッジモジュールは、前記テストダブルプロキシの第1の精緻化された組の生成の前に、前記抽象テストスタブの前記一時的に精緻化されたサブセットを有する前記テストダブルプロキシの初期の組の前記第1のサブセット及び前記テストダブルプロキシの初期の組の残りの部分によって提供される前記テスト対象関数の前記テストカバレッジが、全ての抽象テストスタブを有する前記テストダブルプロキシの初期の組によって提供される前記テストカバレッジと比較して、向上されると判定することを前記プロセッサがさらに実行可能であり、
    前記精緻化モジュールは、前記テストカバレッジが向上されると判定することに応答して、前記テストダブルプロキシの第1の精緻化された組内において、前記抽象テストスタブの前記一時的に精緻化されたサブセットを永続的な精緻化として含むことを前記プロセッサがさらに実行可能である、請求項10に記載の装置。
  12. テスト対象関数によって呼び出される全ての被呼出し関数用の抽象テストスタブを有するテストダブルプロキシの初期の組を生成することであって、前記抽象テストスタブは、生成される前記テストダブルプロキシの初期の組に属するテストスタブであり、前記テストダブルプロキシは、プロキシファイル内のテストスタブを含むテストダブルであり、前記テストダブルプロキシの初期の組内の前記テストダブルプロキシのそれぞれは、前記被呼出し関数のうちの異なる被呼出し関数に対応していることと、
    前記抽象テストスタブのうちの第1の抽象テストスタブの精緻化が前記テスト対象関数のテストカバレッジを向上させると判定することに応答して、前記テストダブルプロキシの初期の組内の第1のテストダブルプロキシ用の前記抽象テストスタブのうちの第1の抽象テストスタブの代わりに、第1の精緻化されたテストスタブを含むテストダブルプロキシの第1の精緻化された組を生成することと、
    テストダブルプロキシの直後の精緻化された組を生成する前に、テストダブルプロキシの現在の組を反復して精緻化することを含み、
    前記テストダブルプロキシの現在の組は、前記テストダブルプロキシの初期の組又は前記テストダブルプロキシの直後の精緻化された組に先行するテストダブルプロキシの精緻化された組を含み、
    前記テストダブルプロキシの直後の精緻化された組を生成する前に、前記テストダブルプロキシの現在の組を反復して精緻化することは、
    前記抽象テストスタブの全てのサブセットが前記テストダブルプロキシの現在の組内において精緻化されたか否かを判定することと、
    前記テストダブルプロキシの現在の組内の前記抽象テストスタブの全てのサブセットが精緻化されたことを判定することに応答して、前記テストダブルプロキシの直後の精緻化された組を生成することと、
    前記テストダブルプロキシの現在の組内の前記抽象テストスタブの全てのサブセットが精緻化されてはいないことを判定することに応答して、精緻化されていない前記テストダブルプロキシの現在の組内の前記抽象テストスタブの現在のサブセットを一時的に精緻化することと、
    前記抽象テストスタブの前記一時的に精緻化された現在のサブセットを有する前記テストダブルプロキシの現在の組の現在のサブセットと前記テストダブルプロキシの現在の組の現在の残りの部分の両方を使用して、前記テスト対象関数をシンボリックに実行することと、
    前記テストダブルプロキシの現在の組の前記現在のサブセットと前記テストダブルプロキシの現在の組の残りの部分の両方を使用した前記テスト対象関数のシンボリック実行がタイムアウトすることに応答して、或いは、前記テストダブルプロキシの現在の組の前記現在のサブセットと前記テストダブルプロキシの前記現在の組の前記残りの部分の両方を使用した前記テスト対象関数のシンボリック実行が、タイムアウトせず、且つ、前記テスト対象関数の以前のテストカバレッジを向上しないことに応答して、前記抽象テストスタブの前記一時的に精緻化された現在のサブセットを精緻化解除することと、
    前記テストダブルプロキシの現在の組の前記現在のサブセットと前記テストダブルプロキシの現在の組の前記残りの部分の両方を使用した前記テスト対象関数のシンボリック実行が、タイムアウトせず、且つ、前記テスト対象関数の以前のテストカバレッジを向上することに応答して、前記テストダブルプロキシの直後の精緻化された組内において、前記抽象テストスタブの前記一時的に生成された現在のサブセットを永続的な精緻化として含むこと、
    を含む動作をプロセッサに実行させるコンピュータプログラム。
  13. 前記テストダブルプロキシの第1の精緻化された組内の前記抽象テストスタブのうちの第2の抽象テストスタブを、ユーザによって特定されたテストスタブに精緻化するために有効であるユーザ入力を受信することをさらに含む、請求項12に記載のコンピュータプログラム。
  14. 前記動作は、前記テストダブルプロキシを反復して向上することをさらに含み、1つ又は複数の反復のそれぞれにおいて、
    テストダブルプロキシの直前の組内において、前記テスト対象関数のシンボリック実行に基づいて、前記抽象テストスタブのうちの少なくとも1つを精緻化されたテストスタブに精緻化することにより、テストダブルプロキシの現在の精緻化された組を自動的に生成することと、
    前記テストダブルプロキシの現在の精緻化された組内において、前記抽象テストスタブのうちの少なくとも1つをユーザによって特定されたテストスタブに精緻化するために有効であるユーザ入力を受信することを含み、
    現在の反復における前記ユーザによって特定されたテストスタブを有する前記テストダブルプロキシの現在の精緻化された組は、直後の反復における前記テストダブルプロキシの直前の組となる、請求項13に記載のコンピュータプログラム。
  15. 前記抽象テストスタブのうちの少なくとも1つを精緻化されたテストスタブに精緻化することは、前記精緻化されたテストスタブに精緻化される前記抽象テストスタブの前記少なくも1つを、前記被呼出し関数のうちの対応する被呼出し関数に対する呼出しを含むオリジナル動作テストスタブと置換することを含み、
    前記抽象テストスタブのうちの少なくとも1つをユーザによって特定されたテストスタブに精緻化するために有効であるユーザ入力を受信することは、前記ユーザによって特定されたテストスタブに精緻化される前記抽象テストスタブのうちの前記少なくとも1つを、前記被呼出し関数のうちの対応する被呼出し関数を近似するスマートテストスタブと置換するために有効であるユーザ入力を受信することを含む、請求項14に記載のコンピュータプログラム。
  16. 前記テスト対象関数によって呼び出される全ての前記被呼出し関数用の前記抽象テストスタブを有する前記テストダブルプロキシの初期の組を生成することは、前記被呼出し関数のそれぞれごとに、
    前記被呼出し関数のうちの前記対応する被呼出し関数が変数を返さない場合、何もしないテストスタブ、又は、
    前記被呼出し関数のうちの対応する被呼出し関数が変数を返す場合、シンボリック変数を返すパラメータ化されたテストスタブを生成することを含む、請求項14に記載のコンピュータプログラム。
  17. 前記動作は、テストダブルプロキシの直後の精緻化された組の生成の前に、テストダブルプロキシの現在の組を反復して精緻化することをさらに含み、
    前記テストダブルプロキシの現在の組は、前記テストダブルプロキシの初期の組又は前記テストダブルプロキシの直後の精緻化された組に先行するテストダブルプロキシの精緻化された組を含む、請求項12に記載のコンピュータプログラム。
JP2014238059A 2014-01-31 2014-11-25 テストダブルの生成 Active JP6520074B2 (ja)

Applications Claiming Priority (2)

Application Number Priority Date Filing Date Title
US14/170,208 2014-01-31
US14/170,208 US9317405B2 (en) 2014-01-31 2014-01-31 Test double generation

Publications (2)

Publication Number Publication Date
JP2015146179A JP2015146179A (ja) 2015-08-13
JP6520074B2 true JP6520074B2 (ja) 2019-05-29

Family

ID=53754925

Family Applications (1)

Application Number Title Priority Date Filing Date
JP2014238059A Active JP6520074B2 (ja) 2014-01-31 2014-11-25 テストダブルの生成

Country Status (2)

Country Link
US (1) US9317405B2 (ja)
JP (1) JP6520074B2 (ja)

Families Citing this family (9)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US9697109B2 (en) * 2014-06-26 2017-07-04 Parasoft Corporation Dynamically configurable test doubles for software testing and validation
US9626276B2 (en) * 2014-11-26 2017-04-18 Sap Se Generating a test version of a method to be called during runtime and fulfilling a collaboration contract
JP6512032B2 (ja) * 2015-08-21 2019-05-15 富士通株式会社 スタブ化対象判定装置、方法、及びプログラム
US9979680B2 (en) 2016-07-21 2018-05-22 Fujitsu Limited Smart notification scheduling and modality selection
CN106294182B (zh) * 2016-08-24 2021-02-09 腾讯科技(深圳)有限公司 一种确定众测反馈有效性的方法、测试设备及系统
US11010283B2 (en) * 2016-11-08 2021-05-18 Microsoft Technology Licensing, Llc Mock-based unit test(s) for an end-to-end test of a code snippet
JP6879046B2 (ja) * 2017-05-15 2021-06-02 トヨタ自動車株式会社 テスト方法及びプログラム
US10394699B1 (en) * 2017-09-11 2019-08-27 Cadence Design Systems, Inc. Method and system for reusing a refinement file in coverage grading
CN110704303B (zh) * 2019-09-05 2021-07-20 深圳开源互联网安全技术有限公司 一种测试覆盖度信息的获取方法及装置

Family Cites Families (10)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JPH09265414A (ja) * 1996-03-28 1997-10-07 Hitachi Ltd テスト環境構築支援システム
JP2000132425A (ja) * 1998-10-26 2000-05-12 Hitachi Ltd ソフトウェアテスト方法
JP2005070835A (ja) * 2003-08-25 2005-03-17 Fujitsu Ltd テスト支援プログラムおよびテスト支援方法
US7496791B2 (en) * 2005-08-04 2009-02-24 Microsoft Corporation Mock object generation by symbolic execution
CN100571167C (zh) * 2006-02-24 2009-12-16 国际商业机器公司 Web服务业务流程的单元测试的方法和设备
JP5082797B2 (ja) * 2007-11-22 2012-11-28 日本電気株式会社 ソフトウェア部分テストシステム
US20090282289A1 (en) * 2008-05-06 2009-11-12 Microsoft Corporation Generation and evaluation of test cases for software validation and proofs
US8504997B2 (en) * 2009-03-19 2013-08-06 Fujitsu Limited Environment data refinement based on static analysis and symbolic execution
JP5328457B2 (ja) * 2009-04-07 2013-10-30 三菱電機株式会社 単体試験支援装置
JP5505227B2 (ja) * 2010-09-22 2014-05-28 富士通株式会社 繰返しシンボリック実行方法、プログラム及び装置

Also Published As

Publication number Publication date
US9317405B2 (en) 2016-04-19
US20150220424A1 (en) 2015-08-06
JP2015146179A (ja) 2015-08-13

Similar Documents

Publication Publication Date Title
JP6520074B2 (ja) テストダブルの生成
US7681180B2 (en) Parameterized test driven development
US10296447B2 (en) Automated software program repair
US7055065B2 (en) Method, system, and computer program product for automated test generation for non-deterministic software using state transition rules
US7895575B2 (en) Apparatus and method for generating test driver
JP7070195B2 (ja) インタラクティブなソフトウェアプログラムの修復
US9081892B2 (en) Software verification
Zhou et al. Towards a practical approach to test aspect-oriented software
US10592703B1 (en) Method and system for processing verification tests for testing a design under test
US9058427B2 (en) Iterative generation of symbolic test drivers for object-oriented languages
EP1926021A1 (en) Software test case generation
US20030130813A1 (en) Adaptive test program generation
CN110419031B (zh) 用于微控制器程序的代码覆盖范围跟踪
JP2015219906A (ja) ソフトウェア確認方法およびプロセッサ
CN114117977B (zh) 一种适用于自动验证处理器系统场景的方法
US20110029953A1 (en) System and Method for Scalable Handling of Debug Information
US11561888B2 (en) Initialization sequences for automatic software test generation
JP6476777B2 (ja) テストコンテキストの生成
Mou et al. Binding requirements and component architecture by using model-based test-driven development
US9489284B2 (en) Debugging method and computer program product
CN115034165A (zh) 一种芯片仿真验证方法、系统、设备以及存储介质
CN112540920A (zh) 测试方法、装置、设备和存储介质
US11719749B1 (en) Method and system for saving and restoring of initialization actions on dut and corresponding test environment
US8930759B2 (en) Stream generation
Bhasin et al. Software Architecture Based Regression Testing

Legal Events

Date Code Title Description
A621 Written request for application examination

Free format text: JAPANESE INTERMEDIATE CODE: A621

Effective date: 20170804

A977 Report on retrieval

Free format text: JAPANESE INTERMEDIATE CODE: A971007

Effective date: 20180521

A131 Notification of reasons for refusal

Free format text: JAPANESE INTERMEDIATE CODE: A131

Effective date: 20180529

A521 Request for written amendment filed

Free format text: JAPANESE INTERMEDIATE CODE: A523

Effective date: 20180719

A02 Decision of refusal

Free format text: JAPANESE INTERMEDIATE CODE: A02

Effective date: 20190108

A521 Request for written amendment filed

Free format text: JAPANESE INTERMEDIATE CODE: A523

Effective date: 20190218

A911 Transfer to examiner for re-examination before appeal (zenchi)

Free format text: JAPANESE INTERMEDIATE CODE: A911

Effective date: 20190227

TRDD Decision of grant or rejection written
A01 Written decision to grant a patent or to grant a registration (utility model)

Free format text: JAPANESE INTERMEDIATE CODE: A01

Effective date: 20190402

A61 First payment of annual fees (during grant procedure)

Free format text: JAPANESE INTERMEDIATE CODE: A61

Effective date: 20190415

R150 Certificate of patent or registration of utility model

Ref document number: 6520074

Country of ref document: JP

Free format text: JAPANESE INTERMEDIATE CODE: R150