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


13

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

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

私の唯一の手段は、自分でゲームをシミュレートするコードを書くことですが、多くの作業のように思えます。これにどのようにアプローチしますか?


5
このデータはどのくらい複雑ですか?ほとんどの場合、着信データを処理するオブジェクトをスタブするだけです。以前のゲームセッションのデータを使用するか(テストするには複雑すぎる場合があります)、データを分析して関連する種類の情報を抽出します。これをファイルに保存し、実際のソースから来るかのようにメインプログラムにフィードします。
トーステンミュラー14年

2
モックオブジェクトの完璧なユースケースhttp://en.wikipedia.org/wiki/Mock_object
ケビンクライン14年

回答:


15

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


1
ここでの問題は、それほど多くのコードではありません。データの1つです。私は、APIのモックやスタブをモックすることができますが、問題は、それは私を与えることを偽のデータを作成している
dferraro

@dferraro:次回ゲームがあるときにサービスをポーリングし、そのデータをファイルにダンプするのを妨げているのは何ですか。それができるようになり、フォーマットに慣れたら、特定のテストケースで新しいファイルを作成できます。
スティーブンエバーズ14年

4

ゲームが行われるまで待ちます。フィードからすべてのイベントをキャプチャします。適切なタイミングでイベントを再生するシミュレーターを作成します。これで、実際のデータを備えたフィードシミュレータができました。


Rubyユーザーの場合、VCRを使用してHTTP応答をキャプチャおよび再生できます。
デュサン14

2

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

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

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

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


ありがとう。「特別な」価値について何を意味するか例を挙げていただけますか?
dferraro 14年

1
私の答えを詳しく述べました。
ロリーハンター

2

おそらくブックメーカーがいくつかのサンプルデータを提供することを考慮して(そしてこれは統合フェーズ中に保存できます)、私のアドバイスはこれらのフィードを次のように整理することです:

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

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

この時点で

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

開発とテストを管理する

使用するテクノロジーの詳細に立ち入らずに、4つのURL(またはプロバイダーが提供するものに応じて必要なURL)にのみ応答するミニサーバーと、ミニプッシュサービスを取得します

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

個人的には、Nodejsを使用して、単純なPerlサーバーまたは同じサーバーを実行します。データの注入に関しては、オフラインブラウザ(CURL、WGET)を起動するタイマーで十分です。


2

cucumberjs、phantomjsの組み合わせを使用してプロキシサーバーを127.0.0.1に設定し、node.jsプロセスをフックしてREST APIをシミュレートhttp-proxynockました。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である場合)。

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