API開発・テスト便利ツール Postmanの使い方メモ


基本的に直感的に使える[Postman](https://www.getpostman.com/)ですが、Collection、Test、環境変数、Pre-request Scriptの使い方とかあまり理解してなかったの調べたメモ。

## やりたいこと

私がやりたいことはおおよそ下記のようなものです。

* 基本操作（済み）
* Collectionの使い方を調べる
* Testのやり方を調べる
* 環境および環境変数の使い方を調べる
* Pre-request Scriptの使い方を調べる
* その他

## 準備

### postman

postmanのページから自分のプラットフォームに合ったものをダウンロードします。
その他詳細は、他のページに譲ります。

### テスト用APIの用意

ローカルに環境を用意します。環境変数によるURL変更等をテストするために下記2つのURLを用意します。
api.phpの内容は一旦同じです。

* http://localhost/test/api.php
* http://localhost/production/api.php

>違いはtestとproductionのところだけです。

### APIの内容

api.phpのコードです。簡単なjsonを返すだけなので、お好みの言語でどうぞ。

```php:api.php
<?php

	//POSTで受け取り
	$message = ($_POST['message'] ?? "no message");
	$datetime = ($_POST['datetime'] ?? "no datetime");
	
	//変数代入
	$response['status'] = 'OK';
	$response['message'] = $message;
	$response['datetime'] = $datetime;
	
	//jsonで返す
	echo json_encode($response);
```

こんなjsonが返る予定。

```json
{"status":"OK","message":"no message","datetime":"no datetime"}
```

## 基本的な使い方

### APIにリクエストを投げる

特に説明はいらないと思いますが、URLを入力し、Methodを選択（ここではPOST）、送るパラメータをセットし、[Send]ボタンをクリックします。すると、レスポンスがBodyに表示されます。まあ、これだけでも十分便利です。

<img width="1234" alt="001.png" src="https://qiita-image-store.s3.amazonaws.com/0/55188/b7eed05e-defc-3786-9c06-d6eebd1ea797.png">


ただ、今回はCollections、test、Pre-request Script等の使い方をチェックしたいので、先に進みます。

## Collection(s)

「作成したテストを分類・まとめる機能」と勝手に理解しています。定義後はCollection単位でテストを実行したりできますが、テストの「フォルダ分類機能」くらいに思っていても十分役に立ちます。

新規Collectionを利用するには、左ペインでCollectionsを選び、+アイコンをクリックするだけ。

<img width="1234" alt="002.png" src="https://qiita-image-store.s3.amazonaws.com/0/55188/d92961e6-0ab0-598e-954e-37cc913f625c.png">

名前を入力して[Create]。

<img width="1234" alt="003.png" src="https://qiita-image-store.s3.amazonaws.com/0/55188/9b05b06a-5367-75ed-6aa3-cfa5e96e4797.png">

サブディレクトリ？も作成可能なようです。

>１階層目をCollection、2階層目をFolderと表現しているようですが。

<img width="2478" alt="004.png" src="https://qiita-image-store.s3.amazonaws.com/0/55188/b4736b20-39a6-fa6d-e742-57a55cee6323.png">

では、作成したCollection/Folderにテストを保存してみます。ここでは、Local API TestというCollectionにmessage apiというFolderを作成してみました。

ウインドウ右端の[Save]ボタンをクリックします。

<img width="1234" alt="005.png" src="https://qiita-image-store.s3.amazonaws.com/0/55188/e8496f45-b353-e6af-e663-912a64d8cf1f.png">

ダイアログが表示されるのでテストの名前を記入、保存先を選択して[Save to ***]をクリックします。
日本語でも保存できるようです。

<img width="1234" alt="006.png" src="https://qiita-image-store.s3.amazonaws.com/0/55188/0b562488-54e0-7b09-9bae-7252cad4a562.png">

テストが保存されました。これで同じリクエストをいつでも実行できます。

>なお、CollectionをExportして、別のPostmanで開いたりもできるようです（有料版だとチームで共有もできるようです）。

<img width="1234" alt="007.png" src="https://qiita-image-store.s3.amazonaws.com/0/55188/a1985baa-ec02-5876-5eca-5fb3c616c4cf.png">

## Test

タブの順番はPre-request Scriptが先ですが、先にTestの機能を見てみます。
いままでのリクエスト機能でも十分テストになっていますが、Test機能では、実行結果の評価などが行えるようです。

### テスト実行の基本

テストを定義するには、Testタブをクリックし、右ペインのSNIPPETSから、目的に近いものを選びます。
ここではjsonのレスポンス内容を評価したいのでResponse body : Json value checkというのを選びました。

必要な箇所を変更し、[Send]をクリックすることでテストが実行されます。
テスト結果はTest Resultsをクリックすれば見ることができます。

<img width="1234" alt="008.png" src="https://qiita-image-store.s3.amazonaws.com/0/55188/32fae6d4-8da4-0122-4782-40c9d1be0aad.png">

### 環境(Environment)および環境変数の利用

Collectionでリクエストやテストパターンを保存しておけるのは非常に便利ですが、test環境、本番環境用に同じスクリプトを用意するのは効率が悪いです。Postmanでは環境毎に変数を定義して簡単に切り替えられるようになっています。

ここでは、test(Test Env)環境とproduction(Production Env)環境を用意して、それに応じてリクエストするURLを変更したいと思います。

#### 環境と環境変数の定義

まず、環境から定義します。右上の歯車ボタンをクリックします。

<img width="1234" alt="009.png" src="https://qiita-image-store.s3.amazonaws.com/0/55188/3184d3e9-745c-d582-5e2e-537a907f8102.png">

環境管理ダイアログが起動するので[Add]をクリック。

<img width="1234" alt="010.png" src="https://qiita-image-store.s3.amazonaws.com/0/55188/8682b8fc-1334-915f-bb06-262f985f670d.png">

作成したい環境名と環境変数、変数値を入力します。

<img width="1234" alt="011.png" src="https://qiita-image-store.s3.amazonaws.com/0/55188/b9e09ce7-914d-fbaf-bce8-ed93e2d745d0.png">

production環境についても同様のことを実施します。

<img width="1234" alt="012.png" src="https://qiita-image-store.s3.amazonaws.com/0/55188/2320994a-ba5d-7e1d-a86f-ad2d2765ab28.png">

2つの環境が定義されました。環境や環境変数は自由に追加・編集が可能です。

<img width="1234" alt="013.png" src="https://qiita-image-store.s3.amazonaws.com/0/55188/17409018-23da-bf76-8a4d-a8c59695fe67.png">

リクエスト画面に戻り、リクエストURLの一部を{{PATH}}に置き換えます。
置き換えたら右上のプルダウンで環境を切り替えてテストをしてみて下さい。

<img width="1234" alt="014.png" src="https://qiita-image-store.s3.amazonaws.com/0/55188/482bcd4d-181f-47c8-d8ee-92c84f8d78b0.png">

いろいろ便利に使えそうです。

## Pre-request Script

その名の通り、リクエスト前に実行するスクリプトです。
まあ、「いつも必ず使う機能」ではないかな・・・という感じもしますが、利用方法だけ見ておきます。

ここでは、空で送信していたdatetimeパラメータに値をセットさせてみたいと思います。

POSTするパラメータのdatetimeの値として{{unix_time}}という変数を定義します。

<img width="2478" alt="015.png" src="https://qiita-image-store.s3.amazonaws.com/0/55188/c232bd9f-fc90-70c1-01b5-61889e25f6fb.png">

Pre-request Scriptタブに移動し、右SNIPPETSからSet global variableを選択します。グローバル変数は環境変数より大きな概念で、環境に依存せず利用可能です。

ここではunix_timeにDate.now()で現在の(unix)時間を入れています。JavaScriptの標準関数も利用できるようです。

実行すると、先程までno datetimeだったのが、値が挿入されているのがわかります。

<img width="1234" alt="016.png" src="https://qiita-image-store.s3.amazonaws.com/0/55188/5d23f422-3792-8193-02e0-ffc856d25485.png">

## その他

### リクエスト（テスト）の複製

リクエストをCollectionや単体単位で複製できます。普通の機能ですが、同じようなテストを沢山定義する際には便利。

<img width="2458" alt="020.png" src="https://qiita-image-store.s3.amazonaws.com/0/55188/790919b9-5cdb-7de1-b4a4-96015bd01269.png">


### Collection単位でのテスト実行

ここではCollectionが1つしか無いのであまり意味がないですが、Collection単位でテストを実行することができるようです。

<img width="1234" alt="017.png" src="https://qiita-image-store.s3.amazonaws.com/0/55188/feeb16e9-ae92-3b7c-e4e2-8039adf4f667.png">


### Collection単位での保存（Export）

Collection単位で設定をExportして保存できるようです。もちろんImportもできます。
json形式で出力されるので、gitで管理してもいいかもしれません。

<img width="2456" alt="019.png" src="https://qiita-image-store.s3.amazonaws.com/0/55188/804789df-617e-f828-ba15-e9320a11ae14.png">

### エラーを意図的に返す。

assertionがそれほど充実してないようなので、JSのロジックと連携して成功・失敗を判断したいとき、普通にfalseとかを返してもpassになってしまいます。

```js
pm.test("samaple1", function () {
    return false;
});
```

テストをFailにした場合は、Error()を返す必要があるようです。

```js
pm.test("samaple2", function () {
    throw new Error();
});
```

### Workspace

Collection?の更に上位概念としてWorkspaceがあります。

### 今後

その他、CI連携やコマンドラインツールの利用など気になることがありますが、随時追加したいと思います。