2017-09-03 45 views
3

API POSTリクエストを使用してGuzzle経由で外部サービス/プロバイダに接続するためのサービスクラスにいくつかのメソッドを作成しました。phpunit - サービスに接続する偽のAPI応答または実際の応答?

私はテストにphpunitを使いたいのですが、サービスに接続せずにHTTP Jsonレスポンスを使うか、サービスから実際の応答を得るためにサービスに接続する必要がありますか?

+0

サービスを偽装すると、さまざまな回答、特にテストするのが難しい(エラーなど)さまざまな回答を返すことができます。 –

+0

@NigelRenあなたは詳細とどのようにサービスを模擬するか答えてください –

+0

もしあなたがいくつかのコードを持っていたら、助けてくれるかもしれません。 http://guzzle3.readthedocs.io/testing/unit-testing.htmlを見てみてください。 –

答えて

2

テストの一般的な教義は、「あなたが所有していないものを嘲笑しないでください」です。これらのAPIコールを偽ると、テストの信頼性が低下し、false positiveが発生する可能性があるため、誤ったセキュリティ感が与えられます。

たとえば、APIが突然変更を導入すると、テストは緑色になり、プロダクションにデプロイすると、最終的に何かが間違っていることがわかります。これはおそらく、あなたのテストで捕まえたいものです。

実際のAPIに対してテストすると、信頼性が得られます。サービス停止やタイムアウトのためにテストが失敗することはありますか?そうであれば、再試行メカニズム、回路ブレーカー、APIコールをアプリケーションの残りの部分から切り離すなどの手段を導入することができます。

APIをモックすると、あなたのコードはサービスの(おそらく時代遅れの)仕様に従って動作することが分かります。それは大丈夫ですが、実際のサービスに頼るほど有用ではありません。

あなたができることは、これらのテストを個別に実行するためにグループを使用することです。これにより、残りのテストから、これらの可能性がある遅い、時には薄れたテストを含める/除外しやすくなります。これはレートリミットにも役立ちます。クリティカルブランチでこれらのテストを実行するだけです。

+0

あなたは実際のAPIに対するテストについて非常に良い点を作っています。生産中 - x時間ごとにテストを自動的に実行する方法はありますか?これにより、実際のAPIサービスはまだ動作していますか? –

+1

はい、ブランチベースのテストに加えて、稼動システムに対してテストを実行する場所を知っています。特に電子商取引を行っているときは、データを実際のデータから識別できるようにデータをマークすることに注意するだけです。たとえば、Jenkinsでスケジュールされたジョブを設定してから、アプリケーションで認識されるリクエストに特殊なX-TESTヘッダーを使用できます。 – dbrumann

+1

CI/CDサーバがスケジュールされたジョブを簡単にサポートしない場合は、テストスイートを実行するcronジョブでもこれを実行できます。繰り返しますが、これを行う場合は注意してください。データベースの状態を変更する操作(または悪化するとデータベースをクリーンアップする操作)。有害な副作用のリスクを減らすために、このために別のテストスイートを用意することをお勧めします。 – dbrumann

関連する問題