Postman 工作區目錄架構 :

Postman 的工作區目錄架構為 Collection、Folder、Request、Example,如下圖 :

注意只有 Folder 可以自己包自己。

我們可以寫測試的範圍有 Collection、Folder、Request,不包含 Example,原因為 Example 只是把一些參數取出來單獨設定而已,他要執行時會將這些參數覆寫到繼承的 Request 並執行,但終究還是歸附於 Request,所以也會執行 Request 寫好的測試。

自動測試的執行順序 :

在 Collection、Folder、Request 界面中我們都可找到和設定「Pre-request Script」以及「Tests」,顧名思義就是一個是先跑的腳本、另一個是最後才跑的腳本,我們假設範例為 Collection 包 Folder 包 Request,且都有設定「Pre-request Script」以及「Tests」,那麼當你按下 Send Request 後的執行順序就是 :

  1. Collection Pre-request Script
  2. Folder Pre-request Script
  3. Request Pre-request Script
  4. Request 本身
  5. Request Tests
  6. Folder Tests
  7. Collection Tests

從這樣的順序也很明顯可以看出 :

  • Pre-request Script 在打 api 前就執行了,可以做的事有檢查參數、預打其他 api 拿 token 等等…。
  • Tests 是在打 api 後執行的,可以做的事有檢查回傳狀態、檢查回傳內容等等…。

如何撰寫測試 :

Postman 的腳本撰寫語法是基於 JavaScript,並提供物件 pm 以供操作,至於詳細有哪些用法官網已經寫得很清楚了,參考 :

範例一,打 api 前檢查當前用的 Postman 環境變數 :

情境 : 因為有時候打不同台伺服器或本地時忘了切換環境變數,會導致我對應的 domain 值壞掉。

1
2
3
4
5
6
pm.test("檢查環境變數", function () { 
pm.expect(pm.environment.get("domain")).to.be.oneOf([
"打卡系統正式機",
"打卡系統測試機"
]);
});

像這個範例你就可以寫在 Collection 的 Pre-request Script,因為通常一個 Collection 就對應一個系統、服務,其底下的 Request 應該都是吃同一種環境變數。

範例二,檢查 api response 的狀態 :

情境 : 我希望知道此次回傳是否成功(這範例其實蠻雞肋的啦,因為本來界面就會顯示了)。

1
2
3
pm.test("檢查回傳狀態", function () {
pm.response.to.have.status(200);
});

範例三,檢查 api request 的 JSON Schema :

情境 : 有時候你邊寫邊打就忘了有些 request 參數忘了改,這時候就能檢查。
注意 : Postman 用的 jsonSchema 是最新版的,你需要注意自己使用的版本是否有落差,因為寫法會變。
以筆者撰寫這篇文章的時間點來說是 3.1 或以上。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
// 定義期望的 JSON Schema
let schema = {
"type": "object",
"properties": {
"orderId": {
"type": ["integer", "null"],
},
"isVoid": {
"type": ["boolean", "null"],
}
}
}

// 檢查
pm.test("檢查請求 json 是否符合期望的 jsonSchema", function () {
pm.request.to.have.jsonSchema(schema);
});

範例四,檢查 api response 的 JSON Schema :

情境 : 我希望回傳的 key 都符合我的期望,例如期望是整數那就不能回傳字串。
用法跟上面幾乎一樣,只是你要改從 response 拿而已。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
// 定義期望的 JSON Schema
let schema = {
"type": "object",
"properties": {
"typeId": {
"type": ["integer", "null"],
},
"statusId": {
"type": ["integer", "null"],
},
"supplierCode": {
"type": ["integer", "null"],
},
"customerName": {
"type": ["string", "null"],
}
}
};

// 檢查
pm.test("檢查回傳 json 是否符合期望的 jsonSchema", function () {
pm.response.to.have.jsonSchema(schema);
});

你可能會覺得定義 jsonSchema 很麻煩,沒錯!因為我也這樣覺得,所以在這邊提供方法 :

  1. 一般來說都會有寫 swagger 給前端對接用,那你就直接拿這個用就好了,簡單粗暴,像 Laravel 框架可以使用 : php artisan l5-swagger:generate 的指令快速產出。

  2. 你的 request 或 response 在 Postman 上都有完整 JSON 了,所以你可以使用 JSON Schema – json 轉 jsonschema 快速轉換,但最麻煩的就是 nullable 你要自己加。

參考我的另一篇文章 - 常用的第三方工具