一文全面解析 Postman 工具

基礎功能 常見類型的接口請求 接口響應數據的解析 接口管理(Collection) 批量執(zhí)行接口請求 日志調試 斷言 變量 請求前置腳本 接口關聯 常見的返回值獲取 便捷功能快 速填寫查詢參數 快速填寫請求頭信息 快速實現添加一個請求 如何繼承集合認證 批量斷言 快速查詢和替換 高級功能 讀取文件進行參數化 生成測試報告 代碼中發(fā)送請求 編寫接口文檔 mock服務 監(jiān)控 使用工作空間 代碼同步與分支管理 連接數據庫 apis
一. postman安裝說明



如果你是第一次使用postman發(fā)送請求,下面這個例子可以作為一個最基本的入門,可以幫我們建立一個初始印象 。
3. 點擊Send按鈕,這時就可以在下部的窗格中看到來自服務器的json響應數據。

二.postman基礎功能
1.常見類型的接口請求
常見的接口有如下四種類型,分別是含有查詢參數的接口,表單類型的接口,json類型的接口以及含有上傳文件的接口,以下就對這四種類型接口及如何在postman中請求進行說明 。
1.1 .查詢參數的接口請求
什么是查詢參數?
postman如何請求
在postman中實現對這類接口請求非常簡單,一般就需要明確倆個參數即可,一個是請求方法,一個請求地址。
針對上面的那個接口,地址已經給出 ,而它的請求方法是get 。那么在postman中只需要把這倆個參數填寫上即可請求 。
具體實現步驟:
1. 打開postman,新建一個請求。
2. 在請求方法中選擇請求方法:GET,因為在postman中默認的請求方法就是GET,所以這一步可以忽略

說明:查詢參數的URL一般直接拷貝到輸入的URL地址欄中就可以了,當然也可以把查詢參數在Params中輸入,倆者的效果是一樣的 。
1.2 表單類型的接口請求
什么是表單 ?
我們都知道,在發(fā)送HTTP請求的時候,一個請求中一般包含三個部分,分別是請求行,請求頭,請求體 。
不同的接口,請求體的數據類型是不一樣的,比較常見的一種就是表單類型,那么什么是表單類型呢 ?簡單理解就是在請求頭中查看Content-Type,它的值如果是:application/x-www-form-urlencoded .那么就說明客戶端提交的數據是以表單形式提交的 。見下圖:

postman中如何請求?
請求方法:POST 請求URL: http://localhost/index.php?m=Home&c=User&a=do_login&t=0.21942974229794432 請求頭:Content-Type:application/x-www-form-urlencode 請求體:username=13088888888&password=123456&verify_code=8888
打開postman,新建一個請求 。 在請求中設置以上四個參數,點擊Send按鈕。在postman中設置請求體類型為,需要選擇body-> x-www-form-urlencoded 查看響應數據。

1.3 上傳文件的表單請求
在做接口測試時,我們經常會遇到需要上傳文件的接口,比如微信的更新頭像。這就需要用到:multipart/form-data。它也屬于一種表單,但它既支持表單請求,也支持文件上傳。它的請求報文中數據往往是下面這樣的。
POST http://localhost/index.php/home/Uploadify/imageUp/savepath/head_pic/pictitle/banner/dir/images.html HTTP/1.1
Content-Type: multipart/form-data
file=a1.jpg這種類型的接口,在postman中該如何請求呢 ?我們先分析需要填寫的參數 。
請求方法:POST 請求URL: http://localhost/index.php/home/Uploadify/imageUp/savepath/head_pic/pictitle/banner/dir/images.html 請求類型:multipart/form-data 請求體:file=a1.jpg
打開postman,新建一個請求 。 在請求中設置以上四個參數,點擊Send按鈕。注意:在postman中設置請求體類型,需要選擇body-> form-data 。file中要選擇File類型,然后上傳本地的文件 。 查看響應數據。

1.4 json類型的接口請求
這應該是接口測試中最常見的一種情況了 , 也就是請求體類型為json,我們來看下這個請求報文 。
POST http://xxx/api/sys/login HTTP/1.1
Content-Type: application/json;charset=UTF-8
{"account":"root","password":"123456"}根據以上報文,我們可以分析出,我們在postman只需要填寫四個參數即可,具體如下:
請求方法:POST 請求地址:http://xxx/api/sys/login 請求體類型:json 請求體數據:{"account":"root","password":"123456"}
打開postman,新建一個請求 。 在請求中設置以上四個參數,點擊Send按鈕。注意:在postman中設置請求體類型,需要選擇body-> raw -JSON 查看響應數據。

響應數據是發(fā)送請求后經過服務器處理后返回的結果,響應由三部分組成,分別是狀態(tài)行、響應頭、響應體。我們來看下postman的響應數據展示。

在postman中的響應數據展示:
狀態(tài)行:Status:200 OK 響應頭:Headers + Cookies,需要注意的是Cookies是包含在響應頭中的,但是為了明顯,工具會分開顯示 響應體:Body
Body和Status是我們做接口測試的重點,一般來說我們都會驗證響應體中的數據和響應狀態(tài)碼 Test Results 是我們編寫斷言后,可以查看斷言的執(zhí)行結果 ,所以這個對我們也很有用 。 Time 和Size 是我們做性能測試時,可以根據這兩個參數來對所測接口的性能做一個簡單的判斷。

Pretty:翻譯成中文就是漂亮 , 也就是說返回的Body數據在這個標簽中查看 ,都是經過格式化的,格式化后的數據看起來更加直觀,所以postman默認展示的也是這個選項。比如返回html頁面,它會經過格式化成HTML格式后展示,比如返回json,那么也會格式化成json格式展示 。
Raw:翻譯成中文未經過加工的,也就是原始數據 ,原始數據一般都是本文格式的,未經過格式化處理的,一般在抓包工具中都有這個選項 。
Preview:翻譯成中文就是預覽,這個選項一般對返回HTML的頁面效果特別明顯,如請求百度后返回結果,點擊這個選項后就直接能查看到的頁面 ,如下圖 。同時這個選項和瀏覽器抓包中的Preview也是一樣的 。

當我們對一個或多個系統(tǒng)中的很多用例進行維護時,首先想到的就是對用例進行分類管理,同時還希望對這批用例做回歸測試 。在postman也提供了這樣一個功能,就是Collection 。通過這個Collection就可以滿足我們的上面說的需求。
先對Collection功能的使用場景做個簡單總結 。
用例分類管理,方便后期維護 可以進行批量用例回歸測試 。
那么Collection是如何去管理用例的呢 ?先想象我們要測試一個系統(tǒng),系統(tǒng)下有多個模塊,每個模塊下有很多的被測接口用例 。那么基于這個場景,我們來通過Collection來進行實現:
1. 點擊Collection,點擊+New Collection,在彈出的輸入框中輸入Collection名稱(這個就可以理解為所測試的系統(tǒng))




當我們在一個Collection中編寫了很多的接口測試用例,想一起執(zhí)行這批用例,在postman中是如何操作呢 ?
1. 選中一個Collection,點擊右三角,在彈出的界面點擊RUN



對上面的幾個紅框內的功能進行簡單說明:
斷言統(tǒng)計:左上角的兩個0是統(tǒng)計當前Collection中斷言成功的執(zhí)行數和失敗的執(zhí)行數,如果沒有編寫斷言默認都為0 。 Run Summary: 運行結果總覽,點擊它可以看到每個請求中具體的測試斷言詳細信息 。Export Result:導出運行結果,默認導出的結果json文件 。 Retry: 重新運行,點擊它會把該Collection重新運行一遍 New:返回到Runner,可以重新選擇用例的組合 。
總體來說,這個功能主要是用于對一個Collection中的所有用例或部分用例進行批量運行,已達到手工回歸測試的目的。
在做接口測試時,經常會因為代碼寫的有問題導致報錯,這時通過查看日志就顯得非常重要了,postman也提供了這樣的功能,它允許我們在腳本中編寫打印語句,查看打印的結果 ; 同時也可以查看每個請求的日志信息 。
在postman中編寫日志打印語句使用的是JavaScript,編寫的位置可以是Pre-request Script 或Tests標簽中。編寫打印語句如:console.log("我是一條日志")

那么打印的日如何看呢 ?在postman中有倆個入口,第一個入口就是:view-show postman console 。
第二個入口就是左下角第三個圖標 。


這里面有幾個比較實用的功能:
搜索日志:輸入URL或者打印的日志就能直接搜索出我們想要的請求和日志,這對我們在眾多日志中查找某一條日志是非常方便的 。 按級別搜索:可以查詢log,info,warning,error級別的日志 ,有助于我們更快定位到錯誤 。 查看原始報文(Show raw log):如果習慣看原始請求報文的話,這個功能可能更方便些 。 隱藏請求(Hide network):把請求都隱藏掉,只查看輸出日志 。
總之,通過這個功能,我們在請求接口報錯時,通過打印響應的日志,就能很輕松的找到問題原因了 。
如果沒有斷言,我們只能做接口的功能測試,但有了斷言后,就為我們做自動化提供了條件,并且在postman中的斷言是非常方便和強大的 。
我們先來了解下postman斷言的一些特點 ,具體如下
斷言編寫位置:Tests標簽 斷言所用語言:JavaScript 斷言執(zhí)行順序:在響應體數據返回后執(zhí)行 。 斷言執(zhí)行結果查看:Test Results

接下來就讓我們了解一些常用斷言,還是按響應的組成來劃分,分別是狀態(tài)行,響應頭,響應體。
狀態(tài)行中的斷言:
斷言狀態(tài)碼:Status code: code is 200
pm.test("Status code is 200", function () {
pm.response.to.have.status(200); //這里填寫的200是預期結果,實際結果是請求返回結果
});斷言狀態(tài)消息:Status code:code name has string
pm.test("Status code name has string", function () {
pm.response.to.have.status("OK"); //斷言響應狀態(tài)消息包含OK
});響應頭中的斷言
斷言響應頭中包含:Response headers:Content-Type header check
pm.test("Content-Type is present", function () {
pm.response.to.have.header("Content-Type"); //斷言響應頭存在"Content-Type"
});斷言響應體(重點)
斷言響應體中包含XXX字符串:Response body:Contains string
pm.test("Body matches string", function () {
pm.expect(pm.response.text()).to.include("string_you_want_to_search");
});
//注解
pm.expect(pm.response.text()).to.include("string") 獲取響應文本中包含string斷言響應體等于XXX字符串:Response body : is equal to a string
pm.test("Body is correct", function () {
pm.response.to.have.body("response_body_string");
});
//注解
pm.response.to.have.body("response_body_string"); 獲取響應體等于response_body_string斷言響應體(json)中某個鍵名對應的值:Response body : JSON value check
pm.test("Your test name", function () {
var jsonData = pm.response.json();
pm.expect(jsonData.value).to.eql(100);
});
//注解
var jsonData = pm.response.json() 獲取響應體,以json顯示,賦值給jsonData .注意:該響應體必須返會是的json,否則會報錯
pm.expect(jsonData.value).to.eql(100) 獲取jsonData中鍵名為value的值,然后和100進行比較響應時間(一般用于性能測試)
斷言響應時間:Response time is less than 200ms
pm.test("Response time is less than 200ms", function () {
pm.expect(pm.response.responseTime).to.be.below(200); //斷言響應時間<200ms
});案例說明:
針對以下接口返回的數據進行斷言:
{
"cityid": "101120101",
"city": "濟南",
"update_time": "2020-04-17 10:50",
"wea": "晴",
"wea_img": "qing",
"tem": "16",
"tem_day": "20",
"tem_night": "9",
"win": "東北風",
"win_speed": "3級",
"win_meter": "小于12km/h",
"air": "113"
}斷言響應狀態(tài)碼為200 斷言city等于濟南 斷言update_time包含2020-04-17

7. 變量(全局/集合/環(huán)境)
變量可以使我們在請求或腳本中存儲和重復使用其值,通過將值保存在變量中,可以在集合,環(huán)境或請求中引用。
對我們做接口測試來說,又是一個非常重要的功能 。
在postman常用的三種變量分別是全局變量,環(huán)境變量,集合變量 。
全局變量:一旦申明了全局變量,全局有效,也就是說postman中的任何集合,任何請求中都可以使用這個變量。它的作用域是最大的 。 環(huán)境變量:要申明環(huán)境變量,首先的創(chuàng)建環(huán)境,然后在環(huán)境中才能創(chuàng)建變量 。如果要想使用環(huán)境變量,必須先選擇(導入)這個環(huán)境,這樣就可以使用這個環(huán)境下的變量了 。需要說明的是環(huán)境也可以創(chuàng)建多個 。每個環(huán)境下又可以有多個變量 。 集合變量:集合變量是針對集合的,也就是說申明的變量必須基于某個集合,它的使用范圍也只是針對這個集合有效 。
其中,他們的作用域范圍依次從大到小:全局變量>集合變量>環(huán)境變量 。當在幾個不同的范圍內都申明了相同的變量時,則會優(yōu)先使用范圍最小的變量使。
想要使用變量中的值只需倆個步驟,分別是定義變量和獲取變量 。
定義變量(設置變量) 獲取變量(訪問變量)
定義全局變量和環(huán)境變量,點擊右上角的小齒輪,彈出如下界面,就可以根據需求定義全局變量或者環(huán)境變量了。


選擇一個集合,打開查看更多動作(...)菜單,然后點擊編輯 。選擇“變量”選項卡以編輯或添加到集合變量。

定義變量除了以上方式,還有另外一種方式 。但是這種方式在不同的位置定義,編寫不一樣。

定義全局變量:pm.collectionVariables.set("變量名",變量值) 定義環(huán)境變量:pm.environment.set("變量名",變量值) 定義集合變量:pm.variables.set("變量名",變量值)
定義好變量,接下來就可以使用變量了 。需要注意的是,在不同的位置獲取變量,編寫的規(guī)則也是不一樣的 。
如果在請求參數中獲取變量,無論是獲取全局變量,還是環(huán)境變量,還是集合變量,獲取的方式都是一樣的編寫規(guī)則:{{變量名}} 。
請求參數指的是:URL,Params , Authorization , Headers , Body
如果是在編寫代碼的位置(Tests,Pre-requests Script)獲取變量,獲取不同類型的變量,編寫的代碼都不相同,具體如下:
獲取環(huán)境變量:pm.environment.get(‘變量名’) 獲取全局變量:pm.globals.get('變量名') 獲取集合變量:pm.pm.collectionVariables.get.get('變量名')

前置腳本其實就是在Pre-requests Script中編寫的JavaScript腳本,想要了解這個功能,需要先了解它的執(zhí)行順序。那么下面就來看下它的執(zhí)行順序 。
可以看出,一個請求在發(fā)送之前,會先去執(zhí)行Pre Request Script(前置腳本)中的代碼 。那么這個功能在實際工作中有什么作用呢 ?
主要場景:一般情況下,在發(fā)送請求前需要對接口的數據做進一步處理,就都可以使用這個功能,比如說,登錄接口的密碼,在發(fā)送前需要做加密處理,那么就可以在前置腳本中做加密處理,再比如說,有的接口的輸入參數有一些隨機數,每請求一次接口參數值都會發(fā)送變化,就可以在前置腳本中編寫生成隨機數的代碼 。
總體來說,就是在請求接口之前對我們的請求數據進行進一步加工處理的都可以使用前置腳本這個功能。
案例:
請求的登錄接口URL,參數t的值要求的規(guī)則是每次請求都必須是一個隨機數。 接口地址: http://localhost/index.php?m=Home&c=User&a=do_login&t=0.7102045930338428

在前置腳本中編寫生成隨機數 將這個值保存成環(huán)境變量 將參數t的值替換成環(huán)境變量的值 。

在我們測試的接口中,經常出現這種情況 。上一個接口的返回數據是下一個接口的輸入參數 ,那么這倆個接口就產生了關聯。這種關聯在做接口測試時非常常見,那么在postman中,如何實現這種關聯關系呢 ?
實現思路:
提取上一個接口的返回數據值, 將這個數據值保存到環(huán)境變量或全局變量中 在下一個接口獲取環(huán)境變量或全局變量
用戶上傳頭像功能,需要用戶先上傳一張圖片,然后會自動預覽 。那么在這個過程中,會調用到倆個接口 ,第一個上傳頭像接口,第二個預覽圖像接口 。 其中調用上傳頭像接口成功后會返回如下信息:
{
"url": "/public/upload/user//head_pic//ba51d1c2f7f7b98dfb5cad90846e2d79.jpg",
"title": "banner",
"original": "",
"state": "SUCCESS",
"path": "images"
}http://localhost/public/upload/user//head_pic//ba51d1c2f7f7b98dfb5cad90846e2d79.jpg 。可以看出這個接口的URL后半部分其實是上一個接口返回的url的值 。那么這倆個接口就產生了關聯。那么在postman 可以通過以下三步完成這倆個接口的關聯實現 。
獲取上傳頭像接口返回url的值 將這個值保存成全局變量(環(huán)境變量也可以) 在圖像預覽中使用全局變量

在做接口測試時,請求接口返回的數據都是很復雜的json數據,有著多層嵌套,這樣的數據層級在postman怎么獲取呢 ?
案例1:多層json嵌套, 獲取user_id的值
{
"code": 0,
"message": "請求成功!",
"data": {
"user_id": "1252163151781167104"
}
}//獲取json體數據
var jsonData = pm.response.json()
// 獲取user_id的值,通過.獲取
var user_id = jsonData.data.user_id案例2:json中存在列表,獲取points中的第二個元素
{
"code": 0,
"message": "請求成功!",
"data": {
"roles": {
"api": [
"API-USER-DELETE"
],
"points": [
"point-user-delete",
"POINT-USER-UPDATE",
"POINT-USER-ADD"
]
},
"authCache": null
}
}//獲取json體數據
var jsonData = pm.response.json()
// 獲取user_id的值,通過下標獲取列表中某個元素
var user_id = jsonData.data.roles.points[1]案例3:列表中取最后一個元素
{
"code": 0,
"message": "請求成功!",
"data": {
"total": 24,
"rows": [
{
"id": "1066370498633486336",
"mobile": "15812340003",
"username": "zbz"
},
{
"id": "1071632760222810112",
"mobile": "16612094236",
"username": "llx"
},
...
{
"id": "1075383133106425856",
"mobile": "13523679872",
"username": "test001",
},//獲取json體數據
var jsonData = pm.response.json()
// 獲取id的值,通過slice(-1)獲取列表中最后一個元素。
var id = jsonData.data.rows.slice(-1)[0]來源:
