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

1概要

このチュートリアルでは、Jersey Test Frameworkを見て、統合テストをすばやく書くためにそれを使用する方法を説明します。

前の記事ですでに見たように、 Jersey は、RESTful Webサービスを開発するためのオープンソースフレームワークです 。 JerseyとSpringでAPIを作成するための入門記事 - ここ で、Jerseyについてさらに学ぶことができます。

2アプリケーション設定

Jersey Test Frameworkは、サーバーサイドコンポーネントの正しい実装を確認するためのツールです。後で見るように、これは 統合テストを書くための速くて手間のかからない方法を提供します そして私達のHTTP APIとのコミュニケーションを非常にうまく処理できます。

  • 同様に、それはほとんどそのまま使用でき、Mavenベースのプロジェクトと統合するのは簡単です** 。このフレームワークは主にJUnitをベースにしていますが、TestNGでも使用できるため、ほぼすべての環境で使用できます。

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

2.1. Mavenの依存関係

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

<dependency>
    <groupId>org.glassfish.jersey.test-framework</groupId>
    <artifactId>jersey-test-framework-core</artifactId>
    <version>2.27</version>
    <scope>test</scope>
</dependency>

いつものように、私達はhttps://search.maven.org/classic/#search%7Cga%7C1%7Cg%3A%22org.glassfish.jersey.test-framework%22[Maven Central]から最新版を入手することができます。

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

<dependency>
    <groupId>org.glassfish.jersey.test-framework.providers</groupId>
    <artifactId>jersey-test-framework-provider-grizzly2</artifactId>
    <version>2.27</version>
    <scope>test</scope>
</dependency>

やはり最新版はhttps://search.maven.org/classic/#search%7Cga%7C1%7Cjersey-test-framework-provider-grizzly2[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);
    }
   //...
}
  • 上記の例では、Jersey Test Frameworkを使用してテストを開発するには、テストに 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応答へのフルアクセスがあることに注意してください。** 操作が実際に成功したかどうかを確認するためにステータスコードをチェックする、または実際の応答本体で作業することなどができます。

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

  1. HTTP GETリクエストを「/greetings/hi」に送信します.

  2. HTTPステータスコードとコンテンツタイプの応答ヘッダーを確認してください.

  3. 応答の内容をテストし、文字列“ hi”が含まれている

4リソースを取得するためのGETのテスト

これで、テストの作成に関わる基本的な手順がわかりました。 Jersey MVC Support article で紹介されている簡単なFruit APIをテストしましょう。

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 の代わりにエンティティを取得する

また、応答をResourceエンティティクラスに直接マッピングすることもできます。次に例を示します。

   @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());
    }

今回は、 get メソッドでレスポンスエンティティが変換されるJavaの型、つまり Fruit オブジェクトを指定します。

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

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

5.1. Post Plain 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 メソッドを使用します。 対応するJSON文字列 からエンティティを作成するのに便利な json メソッドを使用します。

5.2. JSON ではなくポストエンティティ

  • getリクエストで既に見たように、Resourceエンティティクラスを直接投稿することもできます** - 例えば、

@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"));
}

今回は、Fruitエンティティを投稿するために entity メソッドを使用し、またメディアタイプを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エンドポイントをテストする必要がある場合もあります。

これはもちろん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. 追加機能

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

次の例では、特定の名前の機能をプログラムで有効にする方法を説明します。

public class FruitResourceIntegrationTest extends JerseyTest {

    @Override
    protected Application configure() {
        enable(TestProperties.LOG__TRAFFIC);
        enable(TestProperties.DUMP__ENTITY);
       //...

テスト対象のJerseyアプリケーションを作成および構成したとき。追加のプロパティを有効にすることもできます。この場合、テスト実行中に有用な追加のロギングとデバッグ情報を提供する LOG TRAFFIC DUMP ENTITY ** の2つのロギングプロパティを有効にします。

** 8対応コンテナ

すでに説明したように、Jersey Test Frameworkでテストを書くときに使用される事実上のコンテナはGrizzlyです。 ** しかし、他の多くのコンテナがサポートされています。

  • インメモリコンテナ

  • Oracle JDKのHttpServer

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

  • Jettyコンテナ(org.eclipse.jetty)

これらのコンテナを設定する方法の詳細については、ドキュメントhttps://jersey.github.io/documentation/latest/test-framework.html#d0e17501[ここ]を参照してください。

9結論

要約すると、このチュートリアルでは、Jersey Test Frameworkについて説明しました。最初に、Jersey Test Frameworkの設定方法を紹介することから始め、次に非常に単純なAPIのテストを書く方法を見ました。

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

いつものように、この記事の完全なソースコードはhttps://github.com/eugenp/tutorials/tree/master/jersey[GitHubで利用可能]です。