PostmanでAPIのレスポンスが正しいかテストする

## Postman
[Postman | The Collaboration Platform for API Development](https://www.getpostman.com/)
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299271/3aef4203-3b41-8f23-37c2-ba7906807894.png" width="250" />

> そもそもPostmanとは?

APIの動作を確認するツール、、だけに留まらず今や認証、テスト、ドキュメント作成、バージョン管理など幅広く活用できる便利なツール&サービスです。:sparkles:

## Postmanでテストする
[Test examples | Postman Learning Center](https://learning.getpostman.com/docs/postman/scripts/test_examples)

Postmanではレスポンスの値をテストする事ができます。
Postmanを開いて `Params`, `Authorization`... などがあるタブの左端に `Tests` というタブがあるので
そちらにテストを書く事ができます。
![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299271/74f29c83-6772-6fb9-1e13-42a6bdad0118.png)

## 試しに簡単なテストを書いてみる
試しに、GithubAPIを使ってリポジトリのブランチ一覧を取得してみます。
[GitHub API v3 | GitHub Developer Guide](https://developer.github.com/v3/)

今回は`rails/rails`のブランチ一覧を取得するAPIをPostmanでリクエストしてみます。

```
https://api.github.com/repos/rails/rails/branches
```
↑をPostmanに設定し「Send」を押すとズラズラっとブランチが取得できるかと思います :ok_hand:
![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299271/89cd7b52-8f3e-de97-fab1-92e6e90f2c47.png)


レスポンスとしては以下の様なフォーマットで返って来ます。(※ 2019年9月16日時点)

```json
[
    {
        "name": "1-2-stable",
        "commit": {
            "sha": "5b3f7563ae1b4a7160fda7fe34240d40c5777dcd",
            "url": "https://api.github.com/repos/rails/rails/commits/5b3f7563ae1b4a7160fda7fe34240d40c5777dcd"
        },
        "protected": true
    },
    {
        "name": "2-0-stable",
        "commit": {
            "sha": "81d828a14c82b882e31612431a56f830bdc1076f",
            "url": "https://api.github.com/repos/rails/rails/commits/81d828a14c82b882e31612431a56f830bdc1076f"
        },
        "protected": true
    },
    ...
]
```
今回はテストとして
・ ステータス200でレスポンスが返ってくる事
・ ↑のjson schemaで返ってくる事
のテストを書いてみます。 :heavy_check_mark: 

### ステータス200でレスポンスが返ってくる事
こちらは簡単で以下の様に記述します。

```javascript
pm.test("Status code is 200", function () {
    pm.response.to.have.status(200);
});
```
↑を「Tests」タブ内に書いて、「Send」を押すと下の「Test Results」に
テスト結果が表示されます。
![4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299271/8aad97bf-d64c-371f-a68f-5f6b56411de1.png)

失敗すると赤くなって、失敗理由が表示されます。
![5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299271/d0630479-a125-27a2-d2bf-807cc408444a.png)


### json schemaのチェック
Postmanではjosn schemaのチェックに「tv4」と「ajv」が使用できます。

<a href="https://github.com/geraintluff/tv4"><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299271/473a84c5-f440-d353-4ab6-fab59d5ead57.png" width="460px"></a>

<a href="https://github.com/epoberezkin/ajv"><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299271/5856793e-4529-d8fe-88a3-2c6cb03e61e6.png" width="460px"></a>

今回は、「tv4」を使ってチェックを行いたいと思います。

```javascript
let schema = {
    "title": "branches",
    "type": "array",
    "properties": {
        "name": {
            "type": "string"
        },
        "commit": {
            "type": "object",
            "properties": {
                "sha": {
                    "type": "string"
                },
                "url": {
                    "type": "string"
                }
            }
        },
        "protected": {
            "type": "boolean"
        }
    }
};

pm.test("Body matches", function () {
    var jsonData = pm.response.json();
    pm.expect(tv4.validate(jsonData, scheme)).to.be.true;
});
```
↑やっている事はレスポンスのjson schemaを事前に定義して `let schema`
実際のレスポンスと合っているかチェックしています。
※ 定義に関しての詳細は[こちら](https://github.com/geraintluff/tv4#demos)を参照

「Tests」に追記し、「Send」を実行しテスト結果がグリーンであれば成功です :sparkles: 
## 参考URL
- [APIの開発がむちゃくちゃ捗る「Postman」の使い方 - WPJ](https://www.webprofessional.jp/master-api-workflow-postman/)