web-dev-qa-db-ja.com

REST APIをシミュレートする方法は?

私はサードパーティからデータをクエリする新しいプロジェクトに取り組んでいますREST API。これはリアルタイムのスポーツデータフィード用であるため、フィードはゲームが実際に行われているときにのみ機能します。

サードパーティは優れたドキュメント(XSDなど)を提供していますが、ゲームの発生をシミュレートする方法がないため、このAPIに対して作成したコードをテストするには、実際のゲームが発生するまで待機する必要があります。

私の唯一の手段は、自分でゲームをシミュレートするコードを書くことですが、それは大変な作業のようです。これにどのように取り組みますか?

13
dferraro

これは mock object の完全なユースケースです。すべての一般的な言語用のモックライブラリがあります。 RESTサービスレスポンスを提供するオブジェクトをモックしてテストデータを返す必要があります。テストデータを手動で生成するか、ライブシステムへの以前の呼び出しから収集することができます。

15
kevin cline

ゲームが行われるまで待ちます。フィードからすべてのイベントをキャプチャします。 リプレイ適切なタイミングでイベントが発生するシミュレータを作成します。ほら、あなたは実際のデータを持つフィードシミュレーターを持っています。

4
AakashM

独自のシミュレーターを作成することをお勧めします。これを使用して、あらゆる種類のシナリオをテストできます。

  • サーバーは接続を受け入れますが、応答しません
  • サーバーがタイムアウトしました
  • サーバーはガベージ応答などを送り返します...

過去にこれを行ったとき、要求メッセージで「特別な」値を使用して、シミュレータに必要なことを実行するように指示しました。これにより、開発環境の外に出ることなく、エンドツーエンドのテストを実行することもできます。

編集:たとえば、プロジェクトがXMLをサードパーティのサービスに送信する場合、リクエストには、たとえば<value>50.00</value>。シミュレーターは、50.00 =>分解、60.00 =>ガーベッジ、70.00 =>接続を閉じるなどのようにコーディング(またはより適切に構成)できます。アイデアは、シミュレータの動作は、各テストケースで制御する入力に依存するということです。

2
Rory Hunter

おそらくbookmakerがいくつかのサンプルデータを提供することを考慮して(そしてこれは統合フェーズ中に保存できます)、これらのフィードを次のように整理することをお勧めします。

  • イベントのリスト
  • スケジュールされたイベントの更新
  • オッズの更新
  • 結果

プロバイダーはおそらくプッシュ(POST)とプル(GET)の2種類の更新を提供しています。

この時点で

  1. プログラマーがアルゴリズムを作り出すことができるように、GETリクエストを処理するだけの単純なサーバーを作成します。
  2. 同じ情報の送信を管理する自動化を作成し、システムに負荷をかけることができます。

開発とテストを管理する

使用するテクノロジーの詳細には触れずに、mini-serverを取得します。これは、4つのURL(または、プロバイダー提供)、およびミニプッシュサービス

「ミニサーバー」で作業するときに心に留めておくべき非常に良いことは、HTTPプロトコルのハンドラーです。ポート80でサーバーを作成することは非常に簡単で、問題を解決します。プロバイダーが行うように、応答GETのすべての情報を必ず注入する必要があります(これにより、運用環境に配置するときの問題を回避できます)。

個人的には 単純なPerlサーバー または 同じ を行いますが、Nodejsを使用します。データの注入に関しては、オフラインブラウザーを呼び出すタイマーで十分です([〜#〜] curl [〜#〜] 、WGET

2
marcocs

私はcucumberjs、phantomjsの組み合わせを使用してプロキシサーバーを127.0.0.1に設定し、node.jsプロセスをhttp-proxynockでフックすることにより、REST APIをシミュレートしました。 CucumberJSは重要な部分ではありません。テストシナリオはどのように記述してもかまいません。残りはシミュレーションの鍵です。match-request-return-dataによって単純にモックを作成できますが、パターンでフィルタリングしてコールバックをフックすることもできます応答を生成する関数。これにより、必要な粒度のレベルまでシミュレーションできます(極端な場合、完全なデモサーバーで終了しますが、段階的に実行できます)。

それはうまくいきます:

  1. PhantomjsはURIを要求します。
  2. 要求は127.0.0.1:port上のプロキシサーバーに送信されます。
  3. Node.jsプロセスは、http-proxyを使用して透過的に転送をプロキシします。したがって、「通常の」ロード(ページ、画像)はすべて機能します。
  4. 一部のリクエスト(主にAPI)をインターセプトすることを選択した場合は、nockを使用します。

私のシナリオでは、同じプロセスでキュウリのjsテストと組み合わせたため、次のようになりました。

  1. テストを実行します。
  2. テストするシナリオのnock HTTPモッキングを設定します。
  3. Seleniumプロトコルを介してphantomjsでページをロードします。

残りはこの段落の前半で示したとおりです(つまり、これは少しサイクルです。テストランナーとしてphantomjsにページをロードするように指示し、すべてのリクエストを自分に転送し、ネットに転送します。またはインターセプトします。テスト済みのAPIの場合は、それらを参照してください)。

2
herby