進化したPostmanでAPIをテストする


[前回のエントリー](http://qiita.com/bisque33/items/8fe656bf7b863d45384d)でざっと機能を紹介したので、このエントリーではサンプルアプリケーションを使って実際にテストを行ってみます。


# サンプルアプリケーションの仕様

Ruby on Railsで簡単なユーザ管理のAPIを作ります。

|リソース|メソッド|用途|備考|
|:--|:--|:--|:--|
|/users|GET|ユーザ情報一覧の取得|-|
|/users|POST|ユーザ情報の作成|-|
|/users/signin|POST|ユーザでログイン|-|
|/users/signout|POST|ユーザでログアウト|-|
|/users/:id|GET|ユーザ情報の取得|要ログイン|
|/users/:id|PUT|ユーザ情報の変更|要ログイン|-|
|/users/:id|DELETE|ユーザ情報の変更|要ログイン|

# 環境変数の設定

一連のテストで変数を使用する場合、変数名の定義が必要でした。
環境変数は画面右上から登録します。

![Kobito.JcJaHK.png](https://qiita-image-store.s3.amazonaws.com/0/32701/99b4e029-617c-db96-689b-8d1045c97d66.png "Kobito.JcJaHK.png")


![Kobito.cClaNO.png](https://qiita-image-store.s3.amazonaws.com/0/32701/aff64b95-1564-2538-bc8d-a22c30c8bd62.png "Kobito.cClaNO.png")

この後のテストでtokenという変数を使いたいので、変数名の定義だけしておきます。

![Kobito.CpC7fB.png](https://qiita-image-store.s3.amazonaws.com/0/32701/9d956944-b43c-e3df-2713-21b9e916ef19.png "Kobito.CpC7fB.png")

# テスト

勢い余ってAPIの仕様をたくさん考えてしまいましたが、ひとまず以下の3パターンのテストをしてみます。

## ユーザ情報の登録

アカウントの新規作成にあたる機能です。
Bodyにemailとpasswordパラメータをセットします。

![Kobito.Kd3oDA.png](https://qiita-image-store.s3.amazonaws.com/0/32701/0eb6a236-32f6-2da2-ba89-b64afc8b5333.png "Kobito.Kd3oDA.png")

Testsタブに以下のテストコードを記述します。
レスポンスにemailが返されるので、bodyをjsonにしてemailが一致することを確認します。
tests[]の中の文字列はテストケース名になります。

```javascript
var data = JSON.parse(responseBody);
tests["it has email"] = data.email === "user01@example.com";
```

Sendを押して実行します。

テストの結果はレスポンスエリアのTestsタブで確認します。
成功の場合はTests(1/1)、失敗の場合はTests(0/1)になりました。

![Kobito.G6JgJZ.png](https://qiita-image-store.s3.amazonaws.com/0/32701/cb48606f-a43a-a72d-7c00-eeddf7ebefb4.png "Kobito.G6JgJZ.png")


![Kobito.hw9zXS.png](https://qiita-image-store.s3.amazonaws.com/0/32701/92bcc340-544e-ab98-c92c-02d14de49585.png "Kobito.hw9zXS.png")


## ログイン

先程と同様のemailとpasswordでログイン（signin）します。

![Kobito.Kb5gds.png](https://qiita-image-store.s3.amazonaws.com/0/32701/e1d66857-0f94-f763-b39a-16665c4bdb4b.png "Kobito.Kb5gds.png")

Testsタブには、tokenが返却されることと、そのtokenを次のリクエストで使用できるように変数にセットしておきます。

```javascript
var data = JSON.parse(responseBody);
tests["it has token"] = data.token;

postman.setEnvironmentVariable("token", data.token);
```

signinが成功し、tokenが返るとTestsが成功します。

## ユーザ情報の取得

ユーザ情報の取得にはログイン（signin）が必要という仕様なので、リクエストのパラメータでtokenを渡します。
tokenがあればユーザの情報を返し、なければ何も返さないことをテストします。おな、このサンプルアプリケーションではtokenの正当性はチェックしていません。

変数は、`{{変数名}}`で参照することができます。
GETリクエストの場合、URLで変数を参照することも可能です。

![Kobito.lOctEI.png](https://qiita-image-store.s3.amazonaws.com/0/32701/d4efcef4-48cb-9f8a-5d66-290dcb7b9366.png "Kobito.lOctEI.png")

Testsにはjsonデータが返ることを確認します。

```
var data = JSON.parse(responseBody);
tests["it has json body"] = data;
```

tokenがない場合のテストは、Pre-request scriptタブで、tokenの値を空にしてからリクエストします。

```
postman.setEnvironmentVariable("token", "");
```

Testsにはjsonデータが返らないことを確認します。

```
var data = JSON.parse(responseBody);
tests["it has none data"] = data === null;
```

# まとめてテストする

画面上部のRunnerボタンをクリックするとRunner Collectionが起動します（ここは有料($9.99)ですが、14日間のFreeTrialがあります）。Runner CollectionはCollectionのTestをまとめて実行します。

CollectionとEnviromentを選択し、Delayを設定します。

![Kobito.7eXue4.png](https://qiita-image-store.s3.amazonaws.com/0/32701/98e5afb9-4b72-0f3c-c3df-f1863d0317f2.png "Kobito.7eXue4.png")

実行されると、テスト結果が下のように表示されます。

![Kobito.Pm4yW4.png](https://qiita-image-store.s3.amazonaws.com/0/32701/bd48fad2-2550-cb88-548c-b90c6af1c95d.png "Kobito.Pm4yW4.png")


# まとめ

テストスクリプトや変数を使用することで、ある程度は柔軟にテストが出来ました。もちろんこの程度ならRspecなどのテストフレームワークを使うほうが断然楽ですが、提供されたAPIをテストする際のテストツールとしては使えるのではないでしょうか。

今回使った以外にもたくさんの機能はありますし、Postmanの開発チームはもっと広範囲にAPIの開発をサポートするツールを目指しているようなので、今後どうなっていくか楽しみです。

# 使用したソース・テストデータ
### サンプルアプリケーションのソース

[bisque33/sample_user_api](https://github.com/bisque33/sample_user_api)

### Postmanのテストデータ

https://www.getpostman.com/collections/ef2527a6d42a11db8f33

Postmanを起動し、ImportからURLを指定することでテストデータを取り込むことができます。

# 参考

- [[Ruby on Rails]sorceryによる認証 – (1)メールアドレスとパスワードによる認証のチュートリアル ｜ Developers.IO](http://dev.classmethod.jp/server-side/ruby-on-rails/ruby-on-rails_sorcery_auth_no1/)
- [RailsでAPIサーバを開発する(AngularJS, Ruby on Rails, SPA) ｜ Developers.IO](http://dev.classmethod.jp/server-side/spa_ruby-on-rails_api_angularjs/)