我們現在經常在專案中大量的使用 Postman 進行 API 測試,不但 API 測試變的非常方便,搭配 Postbot 這套內建的 AI 助理,更能夠大幅提昇 API 測試的開發效率。這篇文章我就來分享幾個撰寫 API 測試的小技巧。
如何使用 Postman 進行 API 測試
我覺得大致上來說,使用 Postman 進行 API 測試的流程,可以分成以下幾個步驟:
- 新增 HTTP 要求 (Add request)
- 先確認可以順利按下
Send 發出 HTTP 要求
- 切換至
Tests 頁籤撰寫測試案例 ( 使用 JavaScript 即可 )
- 再次按下
Send 發出 HTTP 要求,並查看測試結果 ( Test Results )
圖示如下:

一個最簡單的例子如下:
pm.test("response is ok", function () {
pm.response.to.have.status(200);
});
你可以看到右上角有個 Script with Postbot 功能,按下去之後,輸入一些提示(Prompt),例如 Add tests to this request,他就會全自動產生測試程式碼,這個功能非常方便,可以大幅提昇 API 測試的開發效率!

這裡需要特別注意的地方是,你一定要先確認可以順利按下 Send 發出 HTTP 要求,並且得到一些結果,然後才能透過 Postbot 幫你撰寫測試案例。
撰寫測試案例的基本結構
基本上 Postman 中的每一個 HTTP 要求,都可以撰寫一個以上的測試案例,每個測試案例的程式碼結構如下:
pm.test("測試案例名稱", function () {
// Assertions
});
你也可以用以下程式碼片段,在 pm.test 後面加上 .skip 即可讓這段測試案例跳過執行:
pm.test.skip("測試案例名稱", () => {
// Assertions
});
你也可以有條件的跳過特定幾個測試案例,例如:
const shouldBeSkipped = true; // some condition
(shouldBeSkipped ? pm.test.skip : pm.test)("測試案例名稱", () => {
// Assertions
});
各種 Assertions 撰寫範例
-
直接失敗的測試案例
有時候我們後端開發人員尚未把 API 開發完成,或程式只有骨架而已,尚未實作任何商業邏輯,此時我們其實也可以先寫好一個會報「紅燈」的測試,也就是讓該 API 的測試案例直接失敗,此時你可以這樣寫測試案例程式:
pm.test('開發完成度', () => {
pm.expect.fail('API 尚未開發完成');
});
事實上在執行時,會得到以下結果,訊息非常清楚:
開發完成度 | AssertionError: API 尚未開發完成
-
測試 HTTP 狀態碼
驗證 HTTP 狀態碼是否為 200
pm.response.to.have.status(200);
你也可以這樣寫 (我個人比較喜歡這種統一的撰寫風格)
pm.expect(pm.response.code).to.equal(200);
驗證 HTTP 狀態碼是否為 201 或 202
pm.expect(pm.response.code).to.be.oneOf([201,202]);
驗證 HTTP 狀態碼的「文字」部分
pm.response.to.have.status("Created");
-
測試 HTTP 回應標頭 (Response Headers)
驗證 HTTP 回應標頭包含了 Cache-Control 標頭
pm.response.to.have.header('Cache-Control');
驗證 HTTP 回應標頭包含了 Cache-Control 標頭且內容等於 no-cache
pm.expect(pm.response.headers.get('Cache-Control')).to.eql('no-cache');
驗證 HTTP 回應標頭包含了 Content-Type 標頭且內容等於 application/json
pm.expect(pm.response.headers.get('Content-Type')).to.eql('application/json');
注意: .to.eq() 等同於用 === 做比較,這意味著 {a: 1} 不會等於 {a: 1} 的。而 .to.eql() 則是採用 deep equal 的方式做比較,可以比較兩個物件,這意味著 {a: 1} 將會等於 {a: 1} 喔!
-
測試 HTTP 回應 Cookies
驗證 HTTP 回應標頭包含了 .AspNet.ApplicationCookie Cookie
pm.expect(pm.cookies.has('.AspNet.ApplicationCookie')).to.be.true;
驗證 HTTP 回應標頭包含了 isLoggedIn Cookie 且內容等於 1
pm.expect(pm.cookies.get('isLoggedIn')).to.eql('1');
-
測試 HTTP 回應時間 (Response Time)
驗證 HTTP 回應時間要小於 1000ms
pm.expect(pm.response.responseTime).to.be.below(1000);
-
測試 HTTP 回應內容 (Response Body)
驗證 HTTP 回應內容等於 OK
pm.response.to.have.body("OK");
驗證 HTTP 回應內容包含 新增成功 (這種方式用於無法解析回應格式的狀況)
pm.expect(pm.response.text()).to.include('新增成功');
驗證 HTTP 回應內容為 JSON 格式
pm.response.to.have.jsonBody();
-
測試 HTTP 回應內容 (Response Body) - 驗證 JSON 格式
要對 API 回應的 JSON 內容做出斷言,首先要取得 JSON 物件!
const jsonData = pm.response.json();
如果回應內容為 XML 的話,可以使用 xml2Json 內建函式將 XML 轉換為 JSON 物件:
const jsonData = xml2Json(responseBody);
驗證 JSON 結果一定是從一個「物件」開始:
pm.expect(jsonData).to.be.an('object');
驗證 JSON 結果一定是從一個「陣列」開始:
pm.expect(jsonData).to.be.an('array');
驗證 JSON 結果的各屬性型別:
pm.expect(jsonData.name).to.be.a("string");
pm.expect(jsonData.age).to.be.a("number");
pm.expect(jsonData.website).to.be.undefined;
pm.expect(jsonData.email).to.be.null;
注意: to.be.a(type) 或 to.be.an(type) 的第一個參數為型別名稱,例如: string、number、boolean、object、array、function、null、undefined 等等。
驗證 JSON 結果的第 1 層的 url 屬性必須是個「字串」型別,且長度至少為 1 以上:
pm.expect(jsonData.url).to.be.a('string').and.to.have.lengthOf.at.least(1, "Value should not be empty");
驗證 JSON 結果的第 1 層的 type 屬性必須是清單中的其中一個字串:
pm.expect(jsonData.type).to.be.oneOf(["Subscriber", "Customer", "User"]);
驗證 JSON 結果的第一層必須包含特定屬性名稱:
pm.expect(jsonData.count).to.exist;
pm.expect(jsonData.items).to.exist;
驗證 JSON 結果的第 2 層的 options 屬性必須是個物件,且必須包含特定屬性名稱:
pm.expect(jsonData.options).to.exist.and.to.be.an('object');
pm.expect(jsonData.options).to.have.property('foo1');
pm.expect(jsonData.options).to.have.property('foo2');
pm.expect(jsonData.options).to.have.all.keys('foo1', 'foo2'); // 物件必須找到所有屬性 (完全比對)
pm.expect(jsonData.options).to.have.any.keys('foo1', 'foo2'); // 物件必須找到任何屬性 (部分比對)
使用內建的動態變數 (Dynamic variables)
在 Postman 之中有一些內建的動態變數,可以讓你在測試案例中使用,例如使用 $guid 可以產生一個亂數的 GUID 來用。
不過在 Tests 頁籤中,必須透過 pm.variables.replaceIn() 函式來取得動態變數的值,例如:
var guid = pm.variables.replaceIn('{{$guid}}');
完整的動態變數清單可參考官網的 Dynamic variables 文件。
相關連結