回答:
スタブは、システム内の既存の依存関係(またはコラボレーター)の制御可能な代替品です。スタブを使用すると、依存関係を直接処理せずにコードをテストできます。
外部依存関係-既存の依存関係:
テスト対象のコードが相互作用し、制御できないシステム内のオブジェクトです。(一般的な例は、ファイルシステム、スレッド、メモリ、時間などです。)
以下のコードの例:
public void Analyze(string filename)
{
if(filename.Length<8)
{
try
{
errorService.LogError("long file entered named:" + filename);
}
catch (Exception e)
{
mailService.SendEMail("admin@hotmail.com", "ErrorOnWebService", "someerror");
}
}
}
mailService.SendEMail()メソッドをテストしたいが、それを行うには、テストメソッドで例外をシミュレートする必要があるため、Fake Stub errorServiceオブジェクトを作成して必要な結果をシミュレートするだけで、テストコードは次のようになります。mailService.SendEMail()メソッドをテストできます。ご覧のとおり、ErrorServiceクラスオブジェクト(既存のDependencyオブジェクト)である別のDependencyからの結果をシミュレートする必要があります。
スタブは、この文脈では、モック実装を意味します。
つまり、インターフェースに準拠し、テストに使用される単純な偽の実装です。
Laymanの用語、ダミーデータ(または偽のデータ、テストデータなど)は、実際のデータを表示または受信する準備ができるまで、コードのテストまたは開発に使用できます。プログラマーの「Lorem Ipsum」です。
従業員データベースの準備ができていませんか?Jane Doe、John Doeなどでシンプルなものを作りましょう。APIの準備ができていませんか?偽のデータを含む静的な.jsonファイルを作成して、偽のファイルを作成します。
この文脈では、「スタブ」という単語は「モック」の代わりに使用されますが、明快さと正確さのために、「モック」は一種のスタブであるため、作者は「モック」を使用する必要がありますが、テスト用です。さらに混乱を避けるために、スタブとは何かを定義する必要があります。
一般的なコンテキストでは、スタブはプログラム(通常は関数またはオブジェクト)であり、別のプログラム(通常は別のマシン、VM、またはプロセスにある)の呼び出しの複雑さをカプセル化します。オブジェクト)。呼び出す実際のプログラムは通常、同じメモリ空間に配置されていないため、呼び出すには、アドレス指定、実際のリモート呼び出しの実行、渡されるデータ/引数のマーシャリング/シリアル化(および潜在的な結果と同じ)などの多くの操作が必要です。おそらく認証/セキュリティなども扱います。一部のコンテキストでは、スタブはプロキシとも呼ばれます(Javaの動的プロキシなど)。
モックはテスト用の別の関数またはオブジェクトの置き換えであるため、モックは非常に限定的で限定的な種類のスタブです。実際には、テスト環境でリモートプログラムを置き換えるために、ローカルプログラム(関数またはオブジェクト)としてモックを使用することがよくあります。いずれの場合でも、モックは制限されたコンテキストで置き換えられたプログラムの実際の動作をシミュレートする場合があります。
リモートプロシージャ(RPC)またはリモートオブジェクト(RMI、CORBA)を呼び出す必要がある場合、最も有名な種類のスタブは明らかに分散プログラミング用です。ほとんどの分散プログラミングフレームワーク/ライブラリは、スタブの生成を自動化するため、手動で記述する必要はありません。スタブは、たとえばIDLで記述されたインターフェース定義から生成できます(ただし、任意の言語を使用してインターフェースを定義することもできます)。
通常、RPC、RMI、CORBAなどでは、主に引数のマーシャリング/シリアル化とリモート呼び出しの実行を処理するクライアント側スタブと、主にアンマーシャリング/逆シリアル化を処理するサーバー側スタブを区別します。引数と実際にリモート関数/メソッドを実行します。明らかに、クライアントスタブはクライアント側にあり、サーバースタブ(スケルトンと呼ばれることが多い)はサーバー側にあります。
オブジェクト参照を処理する場合、優れた効率的で汎用的なスタブを作成することは非常に困難になります。RMIやCORBAなどのほとんどの分散オブジェクトフレームワークは分散オブジェクト参照を処理しますが、これは、たとえばREST環境ではほとんどのプログラマが避けていることです。通常、REST環境では、JavaScriptプログラマーが単純なスタブ関数を作成してAJAX呼び出しをカプセル化します(オブジェクトのシリアル化はJSON.parse
およびによってサポートされていますJSON.stringify
)。闊歩codegenののプロジェクトは自動的にさまざまな言語でRESTスタブを生成するための広範なサポートを提供します。
スタブは、正しい関数名、正しいパラメーター数を持ち、正しい型のダミー結果を生成する関数定義です。
テストの記述に役立ち、関数の設計が完了する前でもサンプルを実行できるようにする一種の足場として機能します
このフレーズは、ほぼ間違いなく、住宅建設のフェーズとの類似点です。建設中、壁がまだ開いている間に、大まかな配管が行われます。これは、建設を続行するために必要です。次に、周りの準備がすべて整ったら、戻ってきて蛇口とトイレ、そして実際の最終製品を追加します。(たとえば、配管スタブアウトをインストールする方法を参照してください。)
プログラミングで関数を「スタブアウト」すると、(テストまたは他のコードを書くために)回避するのに十分な関数が構築されます。次に、後で戻って、完全な実装に置き換えます。
RPCスタブ