web-dev-qa-db-ja.com

プログラミングで「スタブへ」とはどういう意味ですか?

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

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

102
janko-m

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

外部依存関係-既存の依存関係:
これは、テスト対象のコードが対話するシステム内のオブジェクトであり、制御することはできません。 (一般的な例は、ファイルシステム、スレッド、メモリ、時間などです。)

以下のコードの例:

public void Analyze(string filename)
    {
        if(filename.Length<8)
        {
            try
            {
                errorService.LogError("long file entered named:" + filename);
            }
            catch (Exception e)
            {
                mailService.SendEMail("[email protected]", "ErrorOnWebService", "someerror");
            }
        }
    }

mailService.SendEMail()メソッドをテストしたいが、それを行うには、テストメソッドでExceptionをシミュレートする必要がある、したがって、必要な結果をシミュレートするために偽のスタブerrorServiceオブジェクトを作成するだけで、テストコードはmailService.SendEMail()メソッドをテストできます。ご覧のとおり、ErrorServiceクラスオブジェクト(既存の依存関係オブジェクト)である別の依存関係からの結果をシミュレートする必要があります。

94
Mustafa Ekici

スタブ は、このコンテキストでは、モック実装を意味します。

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

90
Oded

レイマンの用語、それはあなた(または相手)が実際のデータを提示/受信する準備ができるまでコードをテストまたは開発するために使用できるダミーデータ(または偽のデータ、テストデータなど)です。それはプログラマーの「Lorem Ipsum」です。

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

52
Noon Time

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

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

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

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

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

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

7
Renaud Pawlak

このようなスタブを作成するための非常に優れたテストフレームワークもあります。私が好むものの1つは Mockito もあります EasyMock と他の...

3
Julias

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

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

1

このフレーズは、ほぼ確実に住宅建設の段階、つまり「スタブアウト」配管と類似しています。建設中、壁がまだ開いている間に、粗い配管が挿入されます。これは、建設を継続するために必要です。次に、周囲のすべての準備が整ったら、戻って蛇口とトイレ、そして実際の最終製品を追加します。 (例を参照してください 配管スタブアウトのインストール方法

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

0
mattdm