Postman でテストを作成する

+ [Writing tests in Postman](https://blog.postman.com/writing-tests-in-postman/)

# Postman のテストとは何ですか?

Postman を使用すると、リクエストにスクリプトを追加して、動的変数を使用したり、リクエスト間でデータを渡したり、テストを作成したりできます。「Pre-request Script」タブに追加されたコードはリクエストが送信される前に実行され、「Tests」タブに追加されたコードはレスポンスが受信された後に実行されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/0a9c8d79-1c71-27ea-1d5a-75ea654754c0.png)


テストは、応答の受信後に実行される JavaScript で記述されたスクリプトです。テストは、単一のリクエストの一部として実行することも、リクエストのコレクションを使用して実行することもできます。

Postman アプリでは、上部のリクエスト ビルダーにテストを作成する[テスト]タブが含まれています。下部の応答ビューアには、テストの結果を表示できる対応する「テスト結果」タブが含まれています。

テスト ケースの構築をすぐに開始できるように、よく使用されるスニペットがテスト エディターの横にリストされます。スニペットを選択してコードをテスト エディターに追加します。必要に応じて、エンドポイントの予期される応答に固有のアサーションを使用してスタブを更新します。次に、下部にあるテスト結果を表示するリクエストを送信します。

# テストの作成

JavaScript で独自のカスタム テストを作成することもできます。Postman には、古いスタイルのテスト記述のサポートに加えて、pm.*より強力なテスト記述方法である新しい PM API (API と呼ばれる) があります。

**pm.test()**

この関数は、 Postman テスト サンドボックスpm.test()内にテスト仕様を記述するために使用されます。この関数内にテストを作成すると、テストに正確な名前を付けることができ、エラーが発生した場合でもスクリプトの残りの部分がブロックされないようにすることができます。

関数について知っておくべきことpm.test():

+ この関数は、テストの名前 (文字列として) とブール値を返す関数の 2 つのパラメーターを受け入れます。
+ これは、プライマリ Postman リクエストが送信された後、[テスト]タブでのみ使用できます。

```
// pm.response.to.have を使用した例
pm.test("応答はOK", function () {
    pm.response.to.have.status(200);
});
```

pm.expect()
アサーション関数は、人気のある JavaScript テスト ライブラリChaiJS BDDpm.expect()を基盤として構築されました。同様の構文を使用すると、pm.expect()読みやすいテストを簡単に作成でき、応答または変数からのデータのアサーションを処理できます。

```
// pm.expect() を使用した例
pm.test("本番環境", function () {
    pm.expect(pm.environment.get("env")).to.equal("production");
});
```

```
// 応答アサーションを使用した例
pm.test("応答は処理しても問題ないはずです", function () {
    pm.response.to.not.be.error;
    pm.response.to.have.jsonBody("");
    pm.response.to.not.have.jsonBody("error");
});
```

pm.response.to.be.*
このpm.resonse.to.beオブジェクトは、頻繁に使用される応答ベースのチェックの省略表現を提供します。このアサーション ファミリを使用すると、応答ステータスのタイプと本体のバリエーションのテストが合理化されます。

```
// pm.response.to.be* を使用した例
pm.test("応答は有効であり、本文が必要です", function () {
     // ステータスコードが 200 であることをアサートします
     pm.response.to.be.ok; // info、success、redirection、clientError、serverError は他のバリアントです
     // 応答に有効な JSON 本文があることをアサートします
     pm.response.to.be.withBody;
     pm.response.to.be.json; // このアサーションはボディが存在するかどうかもチェックするため、上記のチェックは必要ありません
});
```

-----------------

+ [応答からのデータの抽出とリクエストの連鎖](https://blog.postman.com/extracting-data-from-responses-and-chaining-requests/)


。テスト スクリプトを使用すると、このフローが大幅に簡素化されます。必要なのは、**postman.setEnvironmentVariable(key, value)** または **postman.setGlobalVariable(key, value)** を呼び出して、応答から抽出した値を変数に設定することだけです。Javascript を通じて動的に生成されたものを追加することもできます。

BulkAPI2.0のCreatJobで使っているテストスクリプト

responsから_jobIdを抽出して環境変数があれば、環境変数に追加/上書き。なければコレクション変数に追加/上書きする。

```
const context = pm.environment.name ? pm.environment : pm.collectionVariables;

const response = JSON.parse(pm.response.text())
context.set("_jobId", response.id);
```

同じようにBulkAPIのCreatJobを見るともう少し複雑です。Bulk APIはxmlとJsonが選べるのでどちらかを判定していますね。pm.response.text()は念のため一旦強制的にtext型にキャストしているのだろうか？

```
const context = pm.environment.name ? pm.environment : pm.collectionVariables;

const contentType = pm.response.headers.get("Content-Type");
if (contentType.indexOf("xml") !== -1) {
    const jsonData = xml2Json(pm.response.text());
    context.set("_jobId", jsonData['jobInfo']['id']);    
}
else if (contentType.indexOf("json") !== -1) {
    const jsonData = pm.response.json();
    context.set("_jobId", jsonData.id);
}
```

同じくBulk Create BatchではxmlTree['batchInfo']['id']の２次元配列みたいに使ってますね。

```
const context = pm.environment.name ? pm.environment : pm.collectionVariables;

var xmlTree = xml2Json(pm.response.text());
console.log(xmlTree);
context.set("_batchId", xmlTree['batchInfo']['id']);
```


 JSON.parse(pm.response.text())とpm.response.json()とは結果は同じみたい

```
pm.test('reportName', () => {
    //const response = JSON.parse(pm.response.text())
    const response = pm.response.json();
     console.log(response.attributes.reportName)    
 })
```

----------------------
配列の処理

+ [How to extract data from response body (JSON & XML) in Postman](https://medium.com/@banait.ankita/how-to-extract-data-from-response-body-json-xml-in-postman-3fe134e2d8ed)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/b5187e5b-b694-3957-ad08-6d055c83f47c.png)

 first_name の値を取得するには: x.data[3].first_name
 last_name を取得するには: x.data[3].last_name