Javaを使用したREST APIのテストのコピー

  • REST

  • link:/category/testing/ [テスト]

1. 概要

このチュートリアルでは、* JSONペイロードを使用したライブ統合テストを使用したREST APIのテスト*の基本原則とメカニズムに焦点を当てています。
主な目標は、APIの基本的な正確さをテストするための概要を提供することです。最新バージョンのhttp://developer.github.com/v3/[GitHub REST API]を使用する予定です。例のために。
内部アプリケーションの場合、この種のテストは通常​​、継続的インテグレーションプロセスの後半のステップとして実行され、REST APIが既にデプロイされた後に消費されます。
RESTリソースをテストする場合、通常、テストが焦点を当てるべきいくつかの直交する責任があります。
  • HTTP 応答コード

  • 応答内の他のHTTP ヘッダー

  • * payload *(JSON、XML)

    *各テストは単一の責任にのみ焦点を合わせ、単一のアサーションを含める必要があります*明確な分離に焦点を当てることには常に利点がありますが、この種のブラックボックステストを行う場合は、一般的な傾向として複雑なテストシナリオを記述することがさらに重要です初めに。
    統合テストのもう1つの重要な側面は、「単一レベルの抽象化原則」の順守です。つまり、テスト内のロジックは高レベルで記述する必要があります。 リクエストの作成、サーバーへのHTTPリクエストの送信、IOの処理などの詳細は、インラインではなく、ユーティリティメソッドを使用して行う必要があります。

参考文献:

link:/integration-testing-in-spring [春の統合テスト]

Spring Webアプリケーションの統合テストを作成するためのクイックガイド。
link:/integration-testing-in-spring [続きを読む]↠’

Spring Bootでのテスト

ユニットテストを効率的に記述するために、Spring Bootがテストをサポートする方法について学びます。
link:/spring-boot-testing [詳細]↠’

REST-assuredガイド

REST保証の基本-REST APIのテストと検証を簡素化するライブラリーを調べてください。
link:/rest-assured-tutorial [詳細]↠’

2. ステータスコードのテスト

@Test
public void givenUserDoesNotExists_whenUserInfoIsRetrieved_then404IsReceived()
  throws ClientProtocolException, IOException {

    // Given
    String name = RandomStringUtils.randomAlphabetic( 8 );
    HttpUriRequest request = new HttpGet( "https://api.github.com/users/" + name );

    // When
    HttpResponse httpResponse = HttpClientBuilder.create().build().execute( request );

    // Then
    assertThat(
      httpResponse.getStatusLine().getStatusCode(),
      equalTo(HttpStatus.SC_NOT_FOUND));
}
これはかなり単純なテストです-テストスイートにあまり複雑さを追加することなく、基本的なハッピーパスが機能していることを検証します*。
何らかの理由で失敗した場合、これが修正されるまで、このURLの他のテストを調べる必要はありません。

3. メディアタイプのテスト

@Test
public void
givenRequestWithNoAcceptHeader_whenRequestIsExecuted_thenDefaultResponseContentTypeIsJson()
  throws ClientProtocolException, IOException {

   // Given
   String jsonMimeType = "application/json";
   HttpUriRequest request = new HttpGet( "https://api.github.com/users/eugenp" );

   // When
   HttpResponse response = HttpClientBuilder.create().build().execute( request );

   // Then
   String mimeType = ContentType.getOrDefault(response.getEntity()).getMimeType();
   assertEquals( jsonMimeType, mimeType );
}
*これにより、レスポンスに実際にJSONデータが含まれるようになります。*
お気づきかもしれませんが、*私たちはテストの論理的進行*に従っています-最初に応答ステータスコード(要求が正常であることを確認するため)、次に応答のメディアタイプ、そして次のテストのみ実際のJSONペイロードを見てみましょう。

4. JSONペイロードのテスト

@Test
public void
  givenUserExists_whenUserInformationIsRetrieved_thenRetrievedResourceIsCorrect()
  throws ClientProtocolException, IOException {

    // Given
    HttpUriRequest request = new HttpGet( "https://api.github.com/users/eugenp" );

    // When
    HttpResponse response = HttpClientBuilder.create().build().execute( request );

    // Then
    GitHubUser resource = RetrieveUtil.retrieveResourceFromResponse(
      response, GitHubUser.class);
    assertThat( "eugenp", Matchers.is( resource.getLogin() ) );
}
この場合、GitHubリソースのデフォルトの表現はJSONですが、通常、応答の__Content-Type__ヘッダーはリクエストの_Accept_ヘッダーと一緒にテストする必要があります。クライアントは特定のタイプの表現を要求します_Accept_を介して、サーバーはこれを尊重する必要があります。

5. テスト用ユーティリティ

Jackson 2を使用して、生のJSON文字列を型保証されたJavaエンティティに非整列化します。
public class GitHubUser {

    private String login;

    // standard getters and setters
}
テストをクリーンで読みやすく、抽象度を高く保つために、単純なユーティリティのみを使用しています。
public static <T> T retrieveResourceFromResponse(HttpResponse response, Class<T> clazz)
  throws IOException {

    String jsonFromResponse = EntityUtils.toString(response.getEntity());
    ObjectMapper mapper = new ObjectMapper()
      .configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
    return mapper.readValue(jsonFromResponse, clazz);
}
link:/ jackson-deserialize-json-unknown-properties [Jacksonは未知のプロパティを無視しています] GitHub APIが私たちの方法を送信していることに注目してください。 €」とここにその情報は必要ありません。

6. 依存関係

ユーティリティとテストは、Mavenセントラルで利用可能な以下のライブラリを使用します。

7. 結論

これは、完全な統合テストスイートがすべきことの一部にすぎません。 テストは、より複雑なシナリオに進むことなく、REST APIの基本的な正確性を確認することに重点を置いています。
たとえば、以下は対象外です:APIの検出可能性、同じリソースの異なる表現の消費など。
これらのすべての例とコードスニペットの実装は、https://github.com/eugenp/tutorials/tree/master/spring-boot-rest [Github上]にあります。これはMavenベースのプロジェクトです。インポートしてそのまま実行するのは簡単です。