Postman 是一個建立和使用API的應用,Postman 對於Web開發者來說非常有用,Postman 帶來的便利有很多,諸如:

  • RESTFul介面測試不依賴其他端,進度不受影響
  • 測試指令碼即文件,減低溝通成本,對接時直接匯出給前端即可
  • 造資料,Runner指定執行N次,構造大量資料,對統計、分頁測試很有用
  • 減少問題排查時間,有時候對接端由於HTTP Header或引數指定有誤導致資料異常,可直接用Postman測試,同時直接提供證據

總的來說,Postman是一個非常有用且好用的 API 測試和管理工具。

應用結構

Postman 程式的應用結構可以左、中、右三個區域,左邊是功能區、中間是介面測試區,右邊是文件區域,這三個區域是平時經常接觸的地方,除此之外,底部還有控制檯和Postamn Runner,如下圖:

發起請求

發起 HTTP 請求進行介面測試是 Postman 的核心功能,很多開發者用 Postman 最初的目的就是用它發起 HTTP 請求進行介面測試,其實 Postman 的發起 HTTP 請求也涉及很多操作,如:

  1. 簡單介面測試
  2. 前置指令碼
  3. 後置指令碼
  4. 環境變數
  5. 結果渲染

下面通過案例,逐一說明 Postman 這些功能的使用方式。

簡單介面測試

Postman 的簡單介面測試是最基本但用得最多的測試,這個操作跟使用瀏覽器直接訪問介面差不多,不同的是 Postman 可以選擇請求方式,比如 GET,POST,DELETE等,假設需要測試下面這樣的一個 SpringMVC 介面:

@GetMapping("/{id}")
public ResponseEntity<User> user(@PathVariable("id") String id) {
User user = new User();
user.setId(id);
user.setName("HiIT青年");
return ResponseEntity.ok(user);
}

你只需要在 Postman 建立 GET 請求介面,然後填寫對應的請求地址,然後點選 Send 即可,如果請求的介面沒有異常,那麼可以看到下面這樣的結果:

這種操作方式是最簡單的,也是最常用的,其中:

  • GET 下拉可以切換請求方式
  • Params 指定掛在URL上的引數
  • Authrization 指定介面授權方式
  • Headers 可以設定額外的請求頭
  • Body 主要用於設定 POST 請求體,可以用多種資料格式
  • Pre-request Script 是前置指令碼
  • Tests 是後置測試指令碼
  • Settings 是一些設定,如SSL證書校驗、URL編碼等

簡單的方式,存在很多弊端,最明顯的就是請求介面的返回值需要肉眼校驗是否正確,當然 Postman 支援用 JavaScript 來編寫測試。

前置指令碼

在簡單介面測試部分,使用一個隨機引數 t=20210814,這個引數對於介面來說沒有任務作用,但有時候,介面測試就真都需要這些隨機引數,Postman 設定隨機引數的方式有多種,如:

  1. 使用 Postman 隨機值
  2. 使用變數 + 前置指令碼設值

Postman 提供了動態變數可以用於設定引數隨機值,如:

{{$guid}}:用於生成guid隨機值
{{$timestamp}}:以當前時間秒數作為隨機值
{{$randomInt}}:隨機生成0~1000的整數
....

另外,可以隨機引數還可以使用前置指令碼來設定。

首先,在Collections建立一個變數(timestamp),也可以用環境變數,效果都一樣。

編寫前置指令碼,在請求發起前,為變數 timestamp 設定值:

var timestamp = new Date().getTime()
pm.collectionVariables.set('timestamp', timestamp)

最後把 t 的取值由 {{$guid}} 改為 {{timestamp}} 即可。

後置指令碼

Postman 後置指令碼是指 Tests 部分編寫的 JavaScript 指令碼,這部分功能非常強大,不僅可以使用 JavaScript 程式設計來獲取返回值資料,還可以將返回結果渲染成頁面(圖表),而且還支援引入外部 JavaScript 庫。

http://localhost:8080/user/1?t={{timestamp}}

這個介面拉取的是 ID=1 的使用者資料,假如需要測試返回的資料 ID 是不是等於 1,那麼可以用下面的指令碼來測試。

可以看到,測試結果為 “PASS” 如果把 equal("1") 改成 equal("2") 那麼測試將會失敗:

FAIL test id == 1 | AssertionError: expected '1' to equal '2'

可以說,使用後置指令碼就像給整個介面測試流程注入生命,比如,一些授權介面需要獲取 ticket,然後其他介面需要用這個 ticket 來授權,那麼就可以在請求 ticket 後將它設定到變數中:

var jsonData = pm.response.json();
pm.test("ticket exists", function () {
pm.expect(jsonData.ticket).exist
});
pm.collectionVariables.set('ticket', jsonData.ticket)

另外,Tests 還可以發起新的 HTTP 請求:

pm.sendRequest('http://localhost:8080/user/ticket/1', (error, response) => {
if (error) {
console.log(error);
}
pm.collectionVariables.set('ticket', response.json().ticket)
});

關於 Tests 的除錯資訊,可以通過 Postman 底部的 Console 來檢視。

環境變數

Postman 的環境變數方便開發針對不同的環境進行切換,而介面方面不用做任何調整,這一點對開發者來說也是很有用的,因為在開發中過程一般都有很多個環境,比如:

  1. 開發環境:開發自己的電腦執行的程式
  2. 測試環境:測試伺服器上執行的程式
  3. 預釋出環境:測試通過後,進行試執行的程式
  4. 線上環境:真正為伺服器上執行的環境

Postman 執行使用者建立多個執行環境,舉個例子,建立 “開發” 和 “測試” 這兩個環境,並在不同的環境中定義不同的變數(host:IP,port:埠)

將請求 URL 調整為取環境變數值:

http://{{host}}:{{port}}/user/1?t={{timestamp}}

這樣,針對不同的環境測試,就不用改IP、埠,只需要切換執行環境即可。

結果渲染

結果渲染這部分感覺實際用得不是很多,但也不是說沒有用,比如:想要將結果渲染成表格,或者說報表就可以用到這個功能。

這一塊還是在後置指令碼(Tests)中處理,以渲染表格為例:

渲染圖表案例:

介面文件

Postman 介面文件位於 Postman 介面的最後測,介面文件支援 Markdown 編寫,這個對於程式設計師來說非常友好,可以根據需要為集合(Collections)或者介面編寫對應的文件。

另外,除介面文件外,Postman 的 example 也是非常有用,它可以把每種請求介面儲存為一份示例,這樣,不管是成功,還是失敗,都可以快速檢視返回資料格式(這對對接非常有用)。

下面是一份成功請求的示例:

介面授權

Postman 的介面鑑權管理在 Collections 的 Authoriztion 中,開發者可以通過 Type 選擇鑑權的方式,包括 ApiKey,BasicAuth,OAuth2.0等等,傳值可以選擇 Header 獲取 URL引數。

對於鑑權值,可以選擇直接填寫,也可以使用變數值的形式,比如{{ticket}},如果將其他介面(比如登入介面)的返回值,設定到環境變數中。

var jsonData = pm.response.json();
pm.test("ticket exists", function () {
pm.expect(jsonData.ticket).exist
});
pm.collectionVariables.set('ticket', jsonData.ticket)

關於 Postman Jenkins 持續整合測試的方法,可以關注公眾號 “HiIT青年” 傳送 “postman” 檢視。

=========================================================



關注公眾號,閱讀更多文章。