web-dev-qa-db-ja.com

REST Apiの自動テスト

REST AP​​Iの自動テストスイートを作成したいと思います。新しいサービスを完了する際に、以前に作成したすべてのサービスが期待どおりに機能することを確認したいと思います。これを達成するために使用する最適なツールに関する提案はありますか? Apigeeのようなツールを使用すると、一度に1つのサービスをテストできますが、ボタンをクリックするだけですべてのサービスをテストする方法が必要です。

79
user1492422

私の仕事では、最近Javaで記述されたいくつかのテストスイートをまとめて、構築したRESTful APIをテストしました。サービスは、依存する他のRESTful APIを呼び出すことができます。これを2つのスイートに分割しました。


  • Suite 1-各サービスを単独でテストする
    • APIが依存しているピアサービスを restito を使用してモックします。他の選択肢には、 rest-driverwiremock 、および betamax が含まれます。
    • テストするサービスをテストし、モックはすべて単一のJVMで実行されます
    • Jettyでサービスを開始します

これを絶対にお勧めします。それは私たちにとって本当にうまくいきました。主な利点は次のとおりです。

  • ピアサービスはモックされているため、複雑なデータセットアップを実行する必要はありません。各テストの前に、restitoを使用して、Mockitoを使用した単体テストのクラスの場合と同様に、ピアサービスの動作を定義します。
  • モックされたピアサービスが呼び出されたかどうかを確認できます。これらのアサートは、実際のピアサービスでは簡単に行えません。
  • モックされたサービスが事前に定義されたメモリ内応答を提供するため、このスイートは非常に高速です。そのため、スイートの実行に時間がかかることなく、適切なカバレッジを取得できます。
  • スイートは独自のJVMで分離されているため、信頼性と再現性が高いため、スイートの実行中に他のスイートや人が共有環境をいじり回すことを心配する必要はありません。

  • スイート2-フルエンドツーエンド
    • Suiteは、複数のマシンに展開された完全な環境に対して実行されます
    • 環境のTomcatにデプロイされたAPI
    • ピアサービスは、実際の「ライブ」フル展開です

このスイートを使用するには、ピアサービスでデータを設定する必要があります。つまり、テストの作成には一般に時間がかかります。可能な限り、RESTクライアントを使用して、ピアサービスでデータをセットアップします。

通常、このスイートでのテストは記述に時間がかかるため、ほとんどのカバレッジをスイート1に置きます。スイート1のモックは実際のサービスとまったく同じように動作しない可能性があるため、このスイートにはまだ明確な価値があると言われています。


36
theon

Frisbyは、node.jsとJasmineに基づいて構築されたREST AP​​Iテストフレームワークであり、APIエンドポイントのテストを簡単、迅速、かつ楽しいものにします。 http://frisbyjs.com

例:

var frisby = require('../lib/frisby');

var URL = 'http://localhost:3000/';
var URL_AUTH = 'http://username:password@localhost:3000/';

frisby.globalSetup({ // globalSetup is for ALL requests
  request: {
    headers: { 'X-Auth-Token': 'fa8426a0-8eaf-4d22-8e13-7c1b16a9370c' }
  }
});

frisby.create('GET user johndoe')
  .get(URL + '/users/3.json')
  .expectStatus(200)
  .expectJSONTypes({
    id: Number,
    username: String,
    is_admin: Boolean
  })
  .expectJSON({
    id: 3,
    username: 'johndoe',
    is_admin: false
  })
  // 'afterJSON' automatically parses response body as JSON and passes it as an argument
  .afterJSON(function(user) {
    // You can use any normal jasmine-style assertions here
    expect(1+1).toEqual(2);

    // Use data from previous result in next test
    frisby.create('Update user')
      .put(URL_AUTH + '/users/' + user.id + '.json', {tags: ['jasmine', 'bdd']})
      .expectStatus(200)
    .toss();
  })
.toss();
25
chx007

この理由から、同僚の1人と協力してPyRestTestフレームワークを開始しました。 https://github.com/svanoort/pyresttest

Pythonでテストを使用できますが、通常のテスト形式はYAMLです。

基本的なRESTアプリのサンプルテストスイート-APIがHTTPステータスコードをチェックして正しく応答することを確認しますが、応答本文も検査することができます。

---
- config:
    - testset: "Tests using test app"

- test: # create entity
    - name: "Basic get"
    - url: "/api/person/"
- test: # create entity
    - name: "Get single person"
    - url: "/api/person/1/"
- test: # create entity
    - name: "Get single person"
    - url: "/api/person/1/"
    - method: 'DELETE'
- test: # create entity by PUT
    - name: "Create/update person"
    - url: "/api/person/1/"
    - method: "PUT"
    - body: '{"first_name": "Gaius","id": 1,"last_name": "Baltar","login": "gbaltar"}'
    - headers: {'Content-Type': 'application/json'}
- test: # create entity by POST
    - name: "Create person"
    - url: "/api/person/"
    - method: "POST"
    - body: '{"first_name": "Willim","last_name": "Adama","login": "theadmiral"}'
    - headers: {Content-Type: application/json}
19
BobMcGee

機能テストと自動テストに SOAP UI を使用しました。 SOAP UIを使用すると、ボタンをクリックするだけでテストを実行できます。 Ted Youngによって作成された スプリングコントローラーテスト ページもあります。この記事を使用して、アプリケーションでRest単体テストを作成しました。

APIの自動テストを行う際の問題の1つは、テストスイートを実行する前に、多くのツールでAPIサーバーを稼働させる必要があることです。完全に自動化されたテスト環境でAPIを実行およびクエリできるユニットテストフレームワークがあることは、大きな利点になります。

Node.JS/Expressで実装されたAPIに適したオプションは、自動テストにmochaを使用することです。単体テストに加えて、APIに対する機能テストを簡単に記述でき、さまざまなテストスイートに分けられます。ローカルテスト環境でAPIサーバーを自動的に起動し、ローカルテストデータベースをセットアップできます。 make、npm、およびビルドサーバーを使用して、コードの一部がリポジトリに送信されるたびにテストスイート全体を実行する「make test」ターゲットとインクリメンタルビルドを作成できます。本当に気難しい開発者向けに、コードベースのどの部分がテストでカバーされているかどうかを示すNice HTMLコードカバレッジレポートも生成します。これがおもしろそうな場合は、ここに ブログ投稿 があり、すべての技術的な詳細を提供しています。

ノードを使用していない場合、言語のデファクトユニットテストフレームワーク(jUnit、cucumber/capybaraなど)は何でも-ローカルテスト環境でのサーバーの起動とHTTPクエリの実行のサポートを確認してください。大規模なプロジェクトの場合、自動化されたAPIテストと継続的な統合作業を行う努力は、すぐに成果を上げます。

お役に立てば幸いです。

2
Darren

Runscope は、一連のテストを使用してWeb APIを監視できるクラウドベースのサービスです。テストは、パラメータ化されたWebフックを介して、スケジュール、および/または実行できます。また、世界中のデータセンターからテストを実行して、グローバルクライアントベースに応答時間が許容できることを確認できます。

Runscopeの無料利用枠では、1か月あたり最大10,000件のリクエストがサポートされます。

免責事項:私はRunscopeの開発者支持者です。

2
Darrel Miller

Rest Assuredライブラリを使用することもできます。サンプルスクリプトを使用したデモについては、 http://artoftesting.com/automationTesting/restAPIAutomationGetRequest.html を参照してください。

1
Kuldeep Rana

REST Assuredに基づいて、安らかなサービスをテストするためのjave DSLに基づく多くの自動化ケースを実装しました。 https://code.google.com/p/rest-assured/

構文は簡単で、jsonとxmlをサポートしています。 https://code.google.com/p/rest-assured/wiki/Usage

その前に、SOAPUIを試してみましたが、無料版にいくつかの問題がありました。さらに、ケースはxmlファイルに含まれており、拡張や再利用が困難です。単に好きではありません

1
Max Shen

1分に1回までのAPIテスト自動化は、 theRightAPI を介して利用可能なサービスです。テストシナリオを作成し、実行します。これらのテストが期待どおりに実行されたら、スケジュールを設定できます。認証を必要とするシナリオでは、テストを「連鎖」することができます。たとえば、TwitterにOAuthリクエストを作成し、他のテストで使用できる共有トークンを作成するテストを作成できます。テストには、httpステータスコードを確認するための検証基準、またはjavascriptまたはスキーマ検証を使用した応答の詳細な検査を添付することもできます。テストがスケジュールされたら、特定のテストが検証に失敗するか、応答時間または応答サイズの確立された範囲外で動作しているとすぐにアラートを通知することができます。

0
Roger

TestNGおよびApache HTTPクラスを使用して独自のREST AP​​Iテストフレームワークを構築しました。Seleniumで2年間働いた後、この概念を開発しました。

Seleniumクラスの代わりにApache HTTPクラスを使用する必要があることを除いて、すべて同じです。

試してみてください。本当に可愛くて良いので、テストフレームワークを最大限にカスタマイズすることができます。

0
Karthic.K