ジャージーテストフレームワークの調査

Jerseyテストフレームワークの探索

1. 概要

このチュートリアルでは、Jersey Test Frameworkを見て、それを使用して統合テストをすばやく作成する方法を確認します。

以前の記事ですでに見たように、Jersey is an open source framework for developing RESTful Web Services。 ジャージーと春の記事でAPIを作成するための紹介で、ジャージーについて詳しく知ることができます–here

2. アプリケーションのセットアップ

Jersey Test Frameworkは、サーバー側コンポーネントの正しい実装を検証するためのツールです。 後で説明するように、it provides a fast and fuss-free way for writing integration testsは、HTTPAPIとの通信を非常にうまく処理できます。

Likewise, it works almost out-of-the-box and it’s easy to integrate with our Maven-based projects。 このフレームワークは主にJUnitに基づいていますが、TestNGで使用することもでき、ほぼすべての環境で使用できます。

次のセクションでは、フレームワークを使用するためにアプリケーションに追加する必要がある依存関係を確認します。

2.1. Mavenの依存関係

まず、Jersey Test Frameworkのコア依存関係をpom.xmlに追加しましょう。


    org.glassfish.jersey.test-framework
    jersey-test-framework-core
    2.27
    test

いつものように、Maven Centralから最新バージョンを取得できます。

ほとんどすべてのJerseyテストでは、事実上のGrizzlyテストコンテナーファクトリを使用していますが、これも追加する必要があります。


    org.glassfish.jersey.test-framework.providers
    jersey-test-framework-provider-grizzly2
    2.27
    test

ここでも、Maven Centralで最新バージョンを見つけることができます。

3. 入門

この次のセクションでは、簡単なテストを作成するために必要な基本的な手順について説明します。

まず、サーバー上の単純なGreetingsリソースをテストします。

@Path("/greetings")
public class Greetings {

    @GET
    @Path("/hi")
    public String getHiGreeting() {
        return "hi";
    }
}

3.1. テストの構成

それでは、テストクラスを定義しましょう。

public class GreetingsResourceIntegrationTest extends JerseyTest {

    @Override
    protected Application configure() {
        return new ResourceConfig(Greetings.class);
    }
    //...
}

We can see in the above example that to develop a test using the Jersey Test Framework our test needs to subclass JerseyTest

次に、テスト用のカスタムリソース構成を返し、Greetingsリソースのみを含むconfigureメソッドをオーバーライドします。 もちろん、これはテストしたいリソースです。

3.2. 最初のテストを書く

グリーティングAPIからの単純なGETリクエストをテストすることから始めましょう。

@Test
public void givenGetHiGreeting_whenCorrectRequest_thenResponseIsOkAndContainsHi() {
    Response response = target("/greetings/hi").request()
        .get();

    assertEquals("Http Response should be 200: ", Status.OK.getStatusCode(), response.getStatus());
    assertEquals("Http Content-Type should be: ", MediaType.TEXT_HTML, response.getHeaderString(HttpHeaders.CONTENT_TYPE));

    String content = response.readEntity(String.class);
    assertEquals("Content of ressponse is: ", "hi", content);
}

HTTP応答–so we can do things like checking the status code to make sure the operation was actually successful, or work with the actual body of the responseへのフルアクセスがあることに注意してください。

上記の例で何をするかを詳しく説明しましょう。

  1. HTTP GETリクエストをâ€〜/ greetings / hi 'に送信します

  2. HTTPステータスコードとコンテンツタイプの応答ヘッダーを確認する

  3. 文字列「hi」を含む応答の内容をテストします

4. GETをテストしてリソースを取得する

これで、テストの作成に関連する基本的な手順を確認できました。 優れたJersey MVC Support articleで導入した単純なFruitAPIをテストしてみましょう。

4.1. プレーンJSONを取得する

以下の例では、応答本文を標準のJSON文字列として使用しています。

@Test
public void givenFruitExists_whenSearching_thenResponseContainsFruit() {
    final String json = target("fruit/search/strawberry").request()
        .get(String.class);
    assertThat(json, containsString("{\"name\":\"strawberry\",\"weight\":20}"));
}

4.2. JSONの代わりにエンティティを取得する

また、応答をリソースエンティティクラスに直接マップすることもできます。たとえば、次のとおりです。

   @Test
    public void givenFruitExists_whenSearching_thenResponseContainsFruitEntity() {
        final Fruit entity = target("fruit/search/strawberry").request()
            .get(Fruit.class);

        assertEquals("Fruit name: ", "strawberry", entity.getName());
        assertEquals("Fruit weight: ", Integer.valueOf(20), entity.getWeight());
    }

今回は、応答エンティティが変換されるJavaタイプをgetメソッド(Fruitオブジェクト)で指定します。

5. リソースを作成するためのPOSTのテスト

APIで新しいリソースを作成するために、POSTリクエストを活用します。 次のセクションでは、APIのこの部分をテストする方法を説明します。

5.1. プレーンJSONを投稿する

プレーンなJSON文字列を投稿して、新しいフルーツリソースの作成をテストすることから始めましょう。

@Test
public void givenCreateFruit_whenJsonIsCorrect_thenResponseCodeIsCreated() {
    Response response = target("fruit/created").request()
        .post(Entity.json("{\"name\":\"strawberry\",\"weight\":20}"));

    assertEquals("Http Response should be 201 ", Status.CREATED.getStatusCode(), response.getStatus());
    assertThat(response.readEntity(String.class), containsString("Fruit saved : Fruit [name: strawberry colour: null]"));
}

上記の例では、Entityオブジェクトパラメータを受け取るpostメソッドを使用しています。 We use the convenient json method to create an entity from the corresponding JSON string

5.2. JSONの代わりにエンティティを投稿する

As we’ve already seen with get requests we can also post a Resource entity class directly –例:

@Test
public void givenCreateFruit_whenFruitIsInvalid_thenResponseCodeIsBadRequest() {
    Fruit fruit = new Fruit("Blueberry", "purple");
    fruit.setWeight(1);

    Response response = target("fruit/create").request(MediaType.APPLICATION_JSON_TYPE)
        .post(Entity.entity(fruit, MediaType.APPLICATION_JSON_TYPE));

    assertEquals("Http Response should be 400 ", 400, response.getStatus());
    assertThat(response.readEntity(String.class), containsString("Fruit weight must be 10 or greater"));
}

今回は、entityメソッドを使用してFruitエンティティを投稿し、メディアタイプをJSONとして指定します。

5.3. POSTを使用したフォーム送信

最後の投稿の例では、投稿リクエストを介してフォーム送信をテストする方法を確認します。

@Test
public void givenCreateFruit_whenFormContainsNullParam_thenResponseCodeIsBadRequest() {
    Form form = new Form();
    form.param("name", "apple");
    form.param("colour", null);

    Response response = target("fruit/create").request(MediaType.APPLICATION_FORM_URLENCODED)
        .post(Entity.form(form));

    assertEquals("Http Response should be 400 ", 400, response.getStatus());
    assertThat(response.readEntity(String.class), containsString("Fruit colour must not be null"));
 }

同様に、Entityクラスを使用しますが、今回は、いくつかのパラメーターを含むフォームをPOSTリクエストに渡します。

6. 他のHTTP動詞のテスト

PUTやDELETEなどの他のHTTPエンドポイントをテストする必要がある場合があります。 This is of course perfectly possible using the Jersey Test Framework.

簡単なPUTの例を見てみましょう。

@Test
public void givenUpdateFruit_whenFormContainsBadSerialParam_thenResponseCodeIsBadRequest() {
    Form form = new Form();
    form.param("serial", "2345-2345");

    Response response = target("fruit/update").request(MediaType.APPLICATION_FORM_URLENCODED)
        .put(Entity.form(form));

    assertEquals("Http Response should be 400 ", 400, response.getStatus());
    assertThat(response.readEntity(String.class), containsString("Fruit serial number is not valid"));
}

requestメソッドを呼び出すと、現在のリクエストオブジェクトで任意のHTTPメソッドを呼び出すことができます。

7. 追加機能

ジャージーテストフレームワークには、デバッグとテストに役立ついくつかの追加の構成プロパティが含まれています。

次の例では、指定された名前の機能をプログラムで有効にする方法を示します。

public class FruitResourceIntegrationTest extends JerseyTest {

    @Override
    protected Application configure() {
        enable(TestProperties.LOG_TRAFFIC);
        enable(TestProperties.DUMP_ENTITY);
        //...

テスト対象のJerseyアプリケーションを作成および構成するとき。 追加のプロパティを有効にすることもできます。 この場合、LOG_TRAFFICDUMP_ENTITYwhich will provide useful additional logging and debug information during test runs.の2つのロギングプロパティを有効にします。

8. サポートされているコンテナ

すでに述べたように、Jersey TestFrameworkでテストを作成するときに使用される事実上のコンテナーはGrizzlyです。 However, a number of other containers are supported:

  • インメモリコンテナ

  • Oracle JDKのHttpServer

  • シンプルなコンテナ(org.simpleframework.http

  • 桟橋コンテナ(org.eclipse.jetty)

これらのコンテナを構成する方法の詳細については、ドキュメントhereを参照してください。

9. 結論

要約すると、このチュートリアルでは、Jersey Test Frameworkを調査しました。 最初に、Jersey Test Frameworkの構成方法を紹介することから始め、次に、非常に単純なAPIのテストを作成する方法を見ました。

次のセクションでは、さまざまなGETおよびPOST APIエンドポイントのテストを作成する方法を説明しました。 最後に、いくつかの追加機能と、supportsJersey Test Frameworkがサポートするコンテナに注目しました。

いつものように、記事の完全なソースコードはover on GitHubで入手できます。