PostmanのPre-request ScriptとTestsが便利

## 流れ
 - 何をしたかったか
 - どんなAPIアプリを立てたか
 - Postmanの基本的なリクエストの作り方(環境変数の設定)
 - Pre-request scriptを使ってのpost
 - Testsを Post-request scriptとして使ってみる

### 何をしたかったか
単純なAPIの機能のテストならば、RSpecなどを用いても良いのですが、
今回は、
Postmanを使いテスト環境へテストしたい各種リクエストを送り、"現在の状態値"を調べ、その後にPostmanのRunnerでテスト用データを作成。
`現在の状態値 + 仕様通りに動作した場合のテスト用データ追加による増減値`
から機能のテストを行いたく、Postmanの機能を利用しました。

### どんなAPIアプリを立てたか

内容はこちらになります. https://github.com/k-karen/api_test_190215
一応routeだけ記します。(よくあるベーシックなエンドポイントだと思います)
なおapi_test_trashでcreateされるレコードは、
alphaとbetaという属性値を持っています。

```ruby
Rails.application.routes.draw do
  namespace 'api' do
    namespace 'v1' do
      resources :api_test_trash
    end
  end
end
```

### Postmanの基本的なリクエストの作り方(環境変数の設定)

ダウンロードしていない方はこちらから→ https://www.getpostman.com/downloads/

#### 環境の作成・環境変数の設定

ダウンロードしたPostmanを立ち上げて、右上の⚙(Sign Inの下)をクリックしてください 

Add > Nameを適当に設定 > 
VARIABLE urlというキーでお使いのAPIのルートを入力 > Add
<img width="300" alt="スクリーンショット 2019-02-15 23.50.11.png" src="https://qiita-image-store.s3.amazonaws.com/0/268490/48b17cf9-5fd0-d0c6-f4de-4b78ed298f0a.png">

モーダルを閉じて、右上の⚙の左側の `No Environment` から先程追加したEnvironment Nameを指定(私の場合`localhost`)

#### indexリクエストの作成
`+`からタブを開いて、以下のように入力すれば、今回のAPIアプリのindexを叩けます。
環境変数で指定した値は、`{{url}}`のように引用することができます。
<img width="308" alt="index" src="https://qiita-image-store.s3.amazonaws.com/0/268490/fc8fb01c-68b0-8c44-35a3-1a1d05e8db77.png">
右側の青いSendをクリックすると、実際にGETリクエストが送られ、indexのレスポンスが得られるかと思います。
<img width="870" alt="index send"src="https://qiita-image-store.s3.amazonaws.com/0/268490/1f537fe3-803c-8672-c22d-a541ff76e909.png">

#### createリクエストの作成

タブを開いて左側のプルダウンリストで`POST`を選択
→ Bodyをひらいて、rawにして、右側のドロップダウンリストからJSON(application/json)を選択
→ 適当に値を指定してSendを押せばPOST完了
<img width="853" alt="post" src="https://qiita-image-store.s3.amazonaws.com/0/268490/479b2c4b-f0bd-222f-1160-ca86373ca1a5.png">

このようにして、他のupdate, destroy, show のメソッドを呼び出すAPIリクエストも作成可能です。

### Pre-request scriptを使ってのpost

#### Pre-request Scriptでbodyの生成

Pre-request Scriptを以下のように設定し、
Bodyを`{{request_body}}`として、Sendしてみてください。

```pre-request.js
var alpha = 1
var beta = 2
var body = {
  "alpha": alpha,
  "beta": beta
}
pm.environment.set("request_body", JSON.stringify(body))
```
<img width="300" alt="prs" src="https://qiita-image-store.s3.amazonaws.com/0/268490/40eaa49a-aa4e-8b8d-b7b7-3120ffe5b64f.png"> <img width="300" alt="bd" src="https://qiita-image-store.s3.amazonaws.com/0/268490/73b1810e-ae18-ae39-eb31-f04c067ed7b9.png">

リクエストがPre-request Scriptで指定した値から生成できることがわかります。

#### ループ用カウンタの設定

環境変数に`url`を設定したときのように、
今度は`counter`を設定し、その値を0として下さい。
そして、pre-request scriptを以下のように設定し、
Sendを6回押してみてください。


```javascript
var alpha = [1,2,3,4,5,6]
var beta = [10,20,30,40,50,60]
var counter = Number(pm.environment.get("counter"))

var body = {
	"alpha": alpha[counter],
	"beta": beta[counter]
}
pm.environment.set("request_body", JSON.stringify(body))
pm.environment.set("counter", counter + 1)
```

配列の値をもとに、6種の異なるレコードが作成できたかと思います。
ただ、6回押すのは面倒なので、Runnerの紹介をします

### Runnerでループさせる
まず、先程設定した`counter`を0に設定し直してください。

左上のNewからCollectionを作成、作成したpre-script入りのPostリクエストを、
今作ったcollectionへ保存してください。
左側のサイドバーから、作ったcollectionを選択、青いRunボタンからRunnerを立ち上げます
(※collection単位でRunnerがループするので、Postリクエストだけのcollectionを作ってください)
<img width="504" alt="" src="https://qiita-image-store.s3.amazonaws.com/0/268490/41ae1735-b7f6-a375-c700-4521ec2ccd70.png">

Runnerが立ち上がったら、Iterationsを6,delayを適当につけてRun testをクリック

<img width="494" alt="スクリーンショット 2019-02-16 0.45.01.png" src="https://qiita-image-store.s3.amazonaws.com/0/268490/f002952b-9807-2c20-b977-025d958ed0e5.png">

これで6回クリックしなくても、6回POSTリクエストが送られたかと思います。

### Testsを Post-request scriptとして使ってみる
紛らわしいですがこのPost-はrequestのあとに走るscriptという意味で私が勝手にそう呼んでます。
Testsは各リクエストの間に、レスポンスが正しいかどうかなどをチェックするためのスクリプトを記述する項目ですが、ここでも環境変数へのセットなどが行えるため、
実質的にPost-request scriptとしても使うことができます。

#### Runnerでのresponseから欲しい情報だけを抜き取って記録する
実際にTestsを利用し、Runnerで作ったデータのidを記録します。

環境変数に`id`を設定してください。
Pre-reqest Script　の隣りにあるTestsに 

```javascript
var jsonData = pm.response.json()
var current_ids = pm.environment.get("id")
pm.environment.set("id",current_ids+','+jsonData["data"]["id"])
```

と入力し、もう一度先ほどと同じようにRunnerを回します。
(ただし、今回は `Keep variable vlues` にチェックを入れてください。

Runnerを回したあと、`id`を確認すると、Runnerで作成されたレコードのidがカンマ区切りで入っているかと思います。おめでとうございます。


### 最後に
3ヶ月ほどPostmanを使っていたのですが、つい最近scriptの存在に気づきました。
Pre-,Post-(本当はTest)のscriptと、
それぞれのリクエスト間を跨いで変数を持ち越せる環境変数を利用すると、
Postmanを使ってテストデータの作成をしたりするのが楽しくなってきますね。

collection単位でRunnerは回るので、
`create→show→update→show→destroy→show`
という一連の流れをテスト化出来ます。

皆さんのPostman活用術ありましたらぜひお教えください。
ここまでお読みいただきありがとうございました。