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

# はじめに

前回の[「REST Assured を使ったREST API テスト」](http://qiita.com/shimashima35/items/b85228d5bf5ec2708c5a) で、[REST Assured](http://rest-assured.io/)を使ったREST APIのテストの書き方についての入門を書きました。前回はさわりだけでしたが、今回はより実践的な内容を書いていきます。

# 使い方

## Responseについて

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

[JSONPath](https://github.com/rest-assured/rest-assured/wiki/Usage#json-using-jsonpath)での解析方法を使って記述します。
Requestの投げ方は通常どおり`given().get()`や`given().post()`で行い、`then()`以降でResponseの解析を行います。

```Java
    @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を直接アサーションしていますが、一旦変数で受け取る方法を書きます。

```Java
    @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のパスパラメータを使い方法の一つ目で、可変部分を可変長引数で渡す方法です。
[パスパラメータについての公式ドキュメント](https://github.com/rest-assured/rest-assured/wiki/Usage#path-parameters)に従ってかいてみます。

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

```Java
    @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を取得しパスが組み立てられてます。

```Java
    @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についての公式ドキュメント](https://github.com/rest-assured/rest-assured/wiki/Usage#request-body)どおりに、`body()`の引数にJSONを設定すればOKです。
Requestのログ出力も設定しているので、実際にPOSTされたか確認できます。

```Java
    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が直感的にわかる名称なのと、[公式ドキュメト](https://github.com/rest-assured/rest-assured/wiki/Usage)が非常に充実しているため迷うことはないと思います。

認証時の定型的な処理を行う[SessionFilter](https://github.com/rest-assured/rest-assured/wiki/Usage#session-support)や、サンプルでも使った[ロギング](https://github.com/rest-assured/rest-assured/wiki/Usage#logging)、[JSON Schema Validation](https://github.com/rest-assured/rest-assured/wiki/Usage#json-schema-validation)なども説明されています。ぜひ公式ドキュメントを読んで試してみてください。