プログラミングにおける「スタブ化」とはどういう意味ですか?


117

たとえば、この引用ではどういう意味ですか?

外部APIとの統合は、最近のWebアプリではほぼ保証されています。そのような統合を効果的にテストするには、それをスタブする必要があります。優れたスタブは簡単に作成でき、実際の最新のAPI応答で常に最新の状態である必要があります。この投稿では、外部APIのスタブを使用したテスト戦略の概要を説明します。


9
「スタブとは」で受け入れられた回答を確認しましたか?
Nick

回答:


103

スタブは、システム内の既存の依存関係(またはコラボレーター)の制御可能な代替品です。スタブを使用すると、依存関係を直接処理せずにコードをテストできます。

外部依存関係-既存の依存関係:
テスト対象のコードが相互作用し、制御できないシステム内のオブジェクトです。(一般的な例は、ファイルシステム、スレッド、メモリ、時間などです。)

以下のコードの例:

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からの結果をシミュレートする必要があります。


9
英語?既存の依存関係とは何ですか?
Jwan622 2014年

17
@ Jwan622一般用語:コードが使用するもの。「依存関係」を読み直して「クラス」や「関数」など(背景に依存)で置き換えるかどうかを理解すると役立つ場合があります。時々、既存のクラス/関数を使用することは実行可能なオプションではなく、スタブが必要です(たとえば、システムの現在の日時などの環境に依存する関数の自動ユニットテストで)。
MasterMastic、2015年

101

スタブは、この文脈では、モック実装を意味します。

つまり、インターフェースに準拠し、テストに使用される単純な偽の実装です。


3
詳細は、Martin Fowlerによる有名なMocks Are n't Stubsの記事で提供されています。
pba

61

Laymanの用語、ダミーデータ(または偽のデータ、テストデータなど)は、実際のデータを表示または受信する準備ができるまで、コードのテストまたは開発に使用できます。プログラマーの「Lorem Ipsum」です。

従業員データベースの準備ができていませんか?Jane Doe、John Doeなどでシンプルなものを作りましょう。APIの準備ができていませんか?偽のデータを含む静的な.jsonファイルを作成して、偽のファイルを作成します。


1
例をありがとう:)
CapturedTree

8

この文脈では、「スタブ」という単語は「モック」の代わりに使用されますが、明快さと正確さのために、「モック」は一種のスタブであるため、作者は「モック」を使用する必要がありますが、テスト用です。さらに混乱を避けるために、スタブとは何かを定義する必要があります。

一般的なコンテキストでは、スタブはプログラム(通常は関数またはオブジェクト)であり、別のプログラム(通常は別のマシン、VM、またはプロセスにある)の呼び出しの複雑さをカプセル化します。オブジェクト)。呼び出す実際のプログラムは通常、同じメモリ空間に配置されていないため、呼び出すには、アドレス指定、実際のリモート呼び出しの実行、渡されるデータ/引数のマーシャリング/シリアル化(および潜在的な結果と同じ)などの多くの操作が必要です。おそらく認証/セキュリティなども扱います。一部のコンテキストでは、スタブはプロキシとも呼ばれます(Javaの動的プロキシなど)。

モックはテスト用の別の関数またはオブジェクトの置き換えであるため、モックは非常に限定的で限定的な種類のスタブです。実際には、テスト環境でリモートプログラムを置き換えるために、ローカルプログラム(関数またはオブジェクト)としてモックを使用することがよくあります。いずれの場合でも、モックは制限されたコンテキストで置き換えられたプログラムの実際の動作をシミュレートする場合があります。

リモートプロシージャ(RPC)またはリモートオブジェクト(RMICORBA)を呼び出す必要がある場合、最も有名な種類のスタブは明らかに分散プログラミング用です。ほとんどの分散プログラミングフレームワーク/ライブラリは、スタブの生成を自動化するため、手動で記述する必要はありません。スタブは、たとえばIDLで記述されたインターフェース定義から生成できます(ただし、任意の言語を使用してインターフェースを定義することもできます)。

通常、RPC、RMI、CORBAなどでは、主に引数のマーシャリング/シリアル化とリモート呼び出しの実行を処理するクライアント側スタブと、主にアンマーシャリング/逆シリアル化を処理するサーバー側スタブを区別します。引数と実際にリモート関数/メソッドを実行します。明らかに、クライアントスタブはクライアント側にあり、サーバースタブ(スケルトンと呼ばれることが多い)はサーバー側にあります。

オブジェクト参照を処理する場合、優れた効率的で汎用的なスタブを作成することは非常に困難になります。RMIやCORBAなどのほとんどの分散オブジェクトフレームワークは分散オブジェクト参照を処理しますが、これは、たとえばREST環境ではほとんどのプログラマが避けていることです。通常、REST環境では、JavaScriptプログラマーが単純なスタブ関数を作成してAJAX呼び出しをカプセル化します(オブジェクトのシリアル化はJSON.parseおよびによってサポートされていますJSON.stringify)。闊歩codegenののプロジェクトは自動的にさまざまな言語でRESTスタブを生成するための広範なサポートを提供します。


4

スタブは、正しい関数名、正しいパラメーター数を持ち、正しい型のダミー結果を生成する関数定義です。

テストの記述に役立ち、関数の設計が完了する前でもサンプルを実行できるようにする一種の足場として機能します


3

そのようなスタブを作成するための非常に優れたテストフレームワークもあります。私preferrableの一つはMockitoのもありEasyMockなど...しかし、Mockitoは素晴らしいです、あなたがそれを読んでください-非常にエレガントかつ強力なパッケージ


3

このフレーズは、ほぼ間違いなく、住宅建設のフェーズとの類似点です。建設中、壁がまだ開いている間に、大まかな配管が行われます。これは、建設を続行するために必要です。次に、周りの準備がすべて整ったら、戻ってきて蛇口とトイレ、そして実際の最終製品を追加します。(たとえば、配管スタブアウトをインストールする方法を参照してください。)

プログラミングで関数を「スタブアウト」すると、(テストまたは他のコードを書くために)回避するのに十分な関数が構築されます。次に、後で戻って、完全な実装に置き換えます。


0

RPCスタブ

  • 基本的に、クライアント側スタブは、呼び出し可能なサーバープロシージャであるかのようにクライアントに見えるプロシージャです。
  • サーバー側スタブは、まるで呼び出し側クライアントであるかのようにサーバーにアクセスします。
  • クライアントプログラムは、サーバーを呼び出していると見なします。実際、クライアントスタブを呼び出しています。
  • サーバープログラムは、クライアントによって呼び出されたと見なします。実際には、サーバースタブによって呼び出されます。
  • スタブはRPCを発生させるために互いにメッセージを送信します。

ソース


0

「関数をスタブアウトするとは、その関数が呼び出されたことを示すのに十分なだけ書き、後で時間のあるときに詳細を残すことを意味します。」

From:SAMS自分にC ++、Jesse Liberty、Bradley Jonesを教えてください

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.