Postman小工具大妙用

小江的学习日记發表於2024-08-10

目錄
  • 寫在前面
  • 基本概念
    • UI基本結構
    • collections
    • variables
      • 變數優先順序
    • environments
  • Scripts
  • Collection Runner
    • Data File
    • 執行效果
  • 實踐技巧
    • 介面快速匯入匯出
    • Collection Runner
      • 如何直接匯入json報文
      • 如何快速收集失敗的case
      • 響應報文解密如何展示
  • 參考文獻

寫在前面

postman 大家都會用,但是很多人只是把它當作一個簡單的http客戶端。大部分時候,這就夠了,因為http呼叫就是它的最核心的功能。

那麼,這樣一個“小”工具,究竟還有什麼值得再說兩句呢?

開發完一個restful功能,後端應該自測完畢後等待與前端聯調。這個自測包括單元測試和介面測試,只要完成其中之一,都能大大減少聯調的耗時,但是往往兩個都沒好好完成。更可能的情況是,因為介面複製、設值麻煩、更習慣使用圖形化介面操作等原因,最終介面測試與前端聯調並行。

假如你自測做的很好,那麼可以再考慮一些細節,比如

  1. 使用 environment 來避免測試不同的環境時反覆修改host
  2. 使用 collection runner 透過介面處理一些線上小規模資料,不用再寫程式碼進行處理

總之,postman 提供了所見即所得、方便、快捷的一種選擇,所謂技多不壓身。

基本概念

UI基本結構

img

collections

collection 是一組請求的集合,和普通的資料夾的區別不大,完全可以一樣看待。

collection` 可以定義指令碼、執行 `collection runner
collection` 下可以繼續遞迴建立子資料夾,這些子資料夾和 `collection` 一樣可以定義指令碼、執行 `collection runner

variables

variable 即變數,允許你透過引用在 collection、request、script 等處複用。引用的方式就是使用佔位符,如 {{變數名}} ,這樣只要修改 variable 的值,所有 {{變數名}} 的地方都會一起變更。

變數優先順序

img

global、environment 變數可以直接在 postman 右上角配置。

img

collection 變數需要點選 collection > Variables 進行新增

img

data 變數則是來源於外部檔案,一般在 collection runner 時會使用到。

local 變數則是在指令碼處定義,生命週期最短。

environments

可以理解為是特殊的 variable 的集合, 因為一些變數如 url 不同環境使用的是不同的值,為了避免反覆修改 variable 的值,可以將 variable 定義在 environment 裡,透過右上角切換。

{{url}}/api/resource/id=3

Scripts

我們可以在 collection 、各資料夾、request 定義指令碼。

指令碼分為 Pre-request 和 Post-response 兩類,顧名思義,不需要多加解釋。

img

request 會先按順序執行自身、當前資料夾、父資料夾...collection 的 Pre-request 指令碼,然後執行 request ,再按相反順序執行 Post-response 指令碼。

因此, Pre-request 指令碼一般負責處理加簽、資料加密、資料預處理等; Post-response 指令碼處理解密、測試斷言等。官網 有很多案例可以參考。

回顧下前面所說的 variable 的優先順序範圍,可以用指令碼來測試下

// global var 'score' = 0
// collection var 'score' = 1
// environment var 'score' = 2

// first request run
console.log(pm.variables.get('score')); // outputs 2
console.log(pm.globals.get('score')); // outputs 0
console.log(pm.collectionVariables.get('score')); // outputs 1
console.log(pm.environment.get('score')); // outputs 2

// second request run
pm.variables.set('score', 3);//local var
console.log(pm.variables.get('score')); // outputs 3

// third request run
console.log(pm.variables.get('score')); // outputs 2

Collection Runner

位置:workspace 右下角、資料夾右鍵選單 > Run Folder

注意事項: 免費版一個月最多隻能執行 25次,還算夠用。

img

需要特別注意的是

  1. 延遲無所謂,runner 實際執行為單執行緒
  2. 匯入data檔案後,注意使用預覽功能檢查下postman解析和預期是否一致
  3. 勾選 Persist responses,方便檢視失敗請求的響應
  4. runner 是單執行緒,特別大的資料不適用

Data File

支援 csv 和 json 兩種格式,注意,json 格式並不是將 json 報文直接匯入,舉個例子,以下兩種格式效果是一致的。

id,name
1,alice
2,bob
[
{"id":"1","name":"alice"},
{"id":"2","name":"bob"}
]

執行效果

img

實踐技巧

介面快速匯入匯出

postman左上角的 import 功能提供了多種方式匯入

img

只是 debug 少量介面的時候,不需要使用抓包工具,可以使用瀏覽器自帶的開發者工具來快速匯入介面。

img

同理,也可以使用 postman 的程式碼功能快速生成 curl、wget 命令。

img

Collection Runner

如何直接匯入json報文

有的時候,為了方便,我們想要一行放一個json報文,便於 request 裡直接引用,csv檔案內容如下

json
{"id":"1","name":"alice"}
{"id":"2","name":"bob"}

可惜,postman 會解析失敗,原因是雙引號和逗號在csv中都有特殊邏輯,我們可以採用如下辦法解決

  1. 將原 data 檔案的雙引號先替換為單引號,同時前後新增雙引號表明是一個資料
json
"{'id':'1','name':'alice'}"
"{'id':'2','name':'bob'}"
  1. request 中的請求報文先置為空,即 {}
  2. 新增 Pre-request 指令碼進行處理
// 將修改的單引號恢復為雙引號
let s = pm.iterationData.get("json").replaceAll("'", '"');
// 將前後多餘的雙引號去除,並設定為請求報文
pm.request.body.raw = s.substring(1, s.length - 1);

如何快速收集失敗的case

使用 collection runner 後,有時候會遇見部分失敗的情況,但是 postman 沒有提供僅重試失敗資料的功能,必須自己將失敗的資料單獨取出來重試。

而 collection runner 提供的匯出功能,並不包含請求報文和響應報文,但是匯出資料可以發現包含了url和測試的名字,因此可以在這裡做文章,如透過下面的做法將關鍵資料匯出,然後再透過正則取出失敗資料,再重新跑 collection runner

pm.test(pm.iterationData.get("billCode"), function () {
    var jsonData = pm.response.json();
    pm.expect(jsonData.success).to.eql(true);
});

響應報文解密如何展示

postman 的 response body 不能透過 post-response 指令碼修改,直接輸出到控制檯總覺得不太方便。此時,我們可以使用 postman 的 visualize 功能來近似

// 使用<pre>標籤可以保留文字格式,當然也可以自己實現更復雜的html功能
pm.visualizer.set('<pre>{{json}}</pre>', {
            json: decryptJson
        });

參考文獻

Postman JavaScript Reference

相關文章