10
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

REST Assured を使ったREST API テスト その2

Posted at

はじめに

前回の「REST Assured を使ったREST API テスト」 で、REST Assuredを使ったREST APIのテストの書き方についての入門を書きました。前回はさわりだけでしたが、今回はより実践的な内容を書いていきます。

使い方

Responseについて

JSONPathを利用してResponseを検証する

JSONPathでの解析方法を使って記述します。
Requestの投げ方は通常どおりgiven().get()given().post()で行い、then()以降でResponseの解析を行います。

    @Test
    public void テスト() {
        given()
                .get("/v1/clients/15930/account-periods")
        .then()
                .body("accountPeriods", hasSize(3))
                .body("accountPeriods.accountPeriodId", hasItems(24216, 24582, 24583))
                .body("accountPeriods[0].accountPeriodId", equalTo(24216))

        ;
    }

hasSize()hasItem(),equalTo()import static org.hamcrest.Matchers.*; としていることで呼出せます。
JSONPathでJSONの解析は、基本的には.を区切りとしてRootから辿っていきます。
記法は色々あるので試してみてください。

Response BodyのJSONを解析し、特定部分をStringで受け取る

先ほどの例ではResponseを直接アサーションしていますが、一旦変数で受け取る方法を書きます。

    @Test
    public void テスト() {
        String response = get("/v1/clients/15930/account-periods").asString(); // ResponseBody をStringで受け取る
        int id = from(response).get("accountPeriods[0].accountPeriodId"); // JSONとしてパースし、JSONPathで対象を取得
        out.println(id);
    }

get()で直接Requestを投げ、その結果をasString()として文字列で一旦受けます。
その後、from(String)でJSONとしてパースして、その後get()でJSONPathを使ってJSON内指定した部分を取得します。

Responseの値を次のRequestに含める場合など、このような方法で記述できます。

Requestについて

次にRequestの投げ方のバリエーションを説明します。

パスパラメータを利用する(可変長引数を使う)

URIのパスパラメータを使い方法の一つ目で、可変部分を可変長引数で渡す方法です。
パスパラメータについての公式ドキュメントに従ってかいてみます。

ここではついでにRequestのlogも吐き出しています。

    @Test
    public void パスパラメータ() {
        given()
                .log()
                .all()
                .get("/v1/clients/{id}/account-periods", 15930)
        .then()
                .body("accountPeriods", hasSize(3))
        ;
    }

get("/v1/clients/{id}/account-periods", 15930)とある部分で、引数の15930{id}の部分にあてはめられ、/v1/clients/15930/account-periodsに対してGETメソッドがよばれます。

log().all()としているので、Requstのログが標準出力に出力され確認することができます。

パスパラメータを利用する(Mapを利用する)

パスパラメータをMapで渡す方法を説明します。
get("/v1/clients/{id}/{api}", params)として引数にMapを渡し、パス中の変数id,api をKeyとしたMapのValueを取得しパスが組み立てられてます。

    @Test
    public void パスパラーメタMap() {
        Map<String, String> params = new HashMap<String, String>();
        params.put("id", "15930");
        params.put("api", "account-periods");
        given()
                .log()
                .all()
                .get("/v1/clients/{id}/{api}", params)
        .then()
                .body("accountPeriods", hasSize(3))
        ;
    }

Request Body にJSONを含める

REST APIでよくある、RequestでJSONを含める方法を説明します。
Request Bodyについての公式ドキュメントどおりに、body()の引数にJSONを設定すればOKです。
Requestのログ出力も設定しているので、実際にPOSTされたか確認できます。

    private static String postJson = "{sessionId: \"abc\"}";

    @Test
    public void JSON送信テスト() {
        given()
                .log() // ログをだす
                .all() // 全部
                .body(postJson) // Request Body の設定
                .post("/v1/clients/15930/account-periods")

        .then()
                .log()
                .body()
        ;
    }

終わりに

REST Assuredを使った幾つかのサンプルをご紹介しました。
これ以外にも実際には様々なパターンがテストでは必要と成ってくるでしょうが、APIが直感的にわかる名称なのと、公式ドキュメトが非常に充実しているため迷うことはないと思います。

認証時の定型的な処理を行うSessionFilterや、サンプルでも使ったロギングJSON Schema Validationなども説明されています。ぜひ公式ドキュメントを読んで試してみてください。

10
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
10
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?