2017-05-03 10 views
0

私は、HTTP REST APIに基づいてWebアプリケーションのテストをいくつか作成しようとしています。私はGETリクエストでPOSTリクエストを通してアップロードされた内容を確認するために使用しました。しかし、私は他のリクエストを使ってリクエストをテストしたことに気付きました。言い換えれば、私のテストはほとんどの場合お互いに依存していました。このような状況のため、API仕様を変更するたびに、間接的に影響を受けるすべてのテストを変更する必要がありました。例えばPOSTリクエスト後に投稿内容を確認する必要がありますか?

testGetA() => 
    expect(app.get('/A')).to.have.json('this', '{"foo":"bar"}') 
testPostA() => { 
    expect(app.delete('/A')).to.have.status(200) 
    expect(app.post('/A', '{"foo":"bar"}')).to.have.status(200) 
    expect(app.get('/A')).to.have.json('this', '{"foo":"bar"}') 
} 

testPostAは、投稿を削除し、resource A転記テストするために順次GETを使用します。しかし、GET /Aの仕様を変更してが{"foo":"barzoo"}と応答する場合、testGetAだけでなく、testPostAも変更する必要があります。

+0

あなたはどの言語であなたが使っているテストスイートを教えてください。 – DaSourcerer

+0

@DaSourcerer現在、私はWebアプリケーションを持っていません。私はJava、JUnit、Mockitoを使用していました。しかし今回は、Javascript、Mocha、Chai、[Chakram](http://dareid.github.io/chakram/jsdoc/index.html)の使用を考えています。 – dyong

答えて

1

HTTP REST APIのユニットテストの場合、POSTリクエストが200 OKを返す場合は、投稿されたコンテンツをGETで確認する必要はありません。 HTTP API単体テストの目的は、サーバー側のロジック(投稿されたデータがデータベースに格納されているかどうかなど)を検証するのではなく、クライアントとサーバー間の通信を検証することです。ここで

は、いくつかの詳細の理由です:

  1. POST /A 100%の作品だけ(何らかのサーバ側のバグに)90%のケースでGET /A作品場合はどうなりますか。この状況では、POST /Aというテストケースが失敗することがありますが、これは意味をなさないものです。
  2. サーバー側のロジックがPOST /Aの場合、データは1つのグローバル変数にのみ保存され、次に200 OKが返されます。 (2番目のPOST /A要求が最初の要求を上書きするため、この動作は間違っています)。この場合、POST - GETの検証は終わりますが、明らかにサーバー側のロジックを保証することはできません。
  3. テストケースは、サーバー側のステータスに依存します。複数のテスト実行間、または複数のテストケース間で競合が発生し、テストケース番号が増加すると非常に複雑になります。

要約すると、HTTP APIの単体テストとサーバー側ロジックの単体テストは2つの異なるものです。 HTTP APIテストは通信にのみ重点を置くようにしてください(POST /A要求が正しい形式で送信されている場合は200 OKになります)。形式が間違っている場合は400 BAD REQUESTなどとなります。 。

+0

詳細な回答ありがとうございます!私は、複数のレイヤーを使って統合テストを作成しようとしていたようです。そして、あなたが言ったように、私はネットワーク層のテストと論理層のテストを認識する必要があります。 – dyong

関連する問題