Postman是一款非常流行的支援HTTP/HTTPS協議的介面除錯與測試工具,其功能非常強大,易用。
1 基礎知識
1.1 下載與安裝
Postman的安裝步驟,本例以Windows為例,如下所示:
- 1、訪問官網,下載Postman,官網地址如下所示:
- 2、進入到主頁面後,下載適合自己的作業系統的版本,如下所示:
直接下載Postman的地址:https://www.postman.com/downloads/
-
3、雙擊下載之後的安裝包,進入安裝介面,按安裝嚮導完成即可。
-
4、點選桌面快捷方式,註冊、登入或者直接使用即可,跳過登入直接使用如下所示:
這裡推薦註冊,在註冊並登入後,Postman會將相應的資料上傳至遠端伺服器,後面在其他地方登入後,可以自動同步之前的資料。
1.2 介面導航說明
初次使用Postman可能對介面上一些選單、導航不太熟悉,可檢視下圖的說明。
1.3 第一個示例
Postman傳送請求非常簡章,我們以最簡單的GET請求為例,操作步驟如下所示:
- 1.開啟Postman,點選左邊Collections,再點選右邊的+,新建一個Collections;
- 2.在上一步新建的Collection上右鍵選擇Rename輸入新名字,按Enter鍵即可。
- 3、在Postman填寫好相應的內容,點選Send即可:
請求方法:選擇GET
請求地址中輸入:http://httpbin.org/get
Params中輸入引數zq和lyl
以下輸入如下圖所示:
2 基礎功能
2.1 常見HTTP介面型別
在HTTP中常見的介面主要有以下幾種型別
- 帶查詢引數的介面
- 表單型別的介面
2.1.1 帶查詢引數的介面
帶查詢引數的介面通常為GET方法,在URL地址中通過?進行分隔,多個引數使用&進行連線,常見表現形式為param=value。示例如下所示:
http://httpbin.org/get?zq=diana&lyl=surpass
以上為GET方法請求的完整URL地址,可拆分為如下所示:
- URL地址:http://httpbin.org/get
- 引數有兩個:zq和lyl,其對應的值分別為diana和surpass
2.1.2 表單型別的介面
表單型別的介面通常為POST方法,常見的提交資料方式有以下幾種方式:
- application/x-www-form-urlencoded
- multipart/form-data
- application/json
- text/xml
2.1.2.1 application/x-www-form-urlencoded
這是最常見的POST提交資料的方式。在POST提交資料中Content-Type被指定為application/x-www-form-urlencoded,提交的資料按照 key1=value1&key2=value2 的方式進行編碼,其中key和value都會進行URL轉碼
2.1.2.2 multipart/form-data
這是另外一個常見的POST提交資料的方式。一般這種方式用於上傳檔案
2.1.2.3 application/json
application/json這是目前用得最多的資料提交方式,做為請求時,用來告訴伺服器資料是序列化化的JSON資料。
2.1.2.4 text/xml
text/xml是一種使用HTTP作為傳輸協議,XML作為編碼方式的遠端呼叫規範,它的使用也很廣泛,能很好的支援已有的 XML-RPC 服務。不過,XML 結構還是過於臃腫,一般場景用 JSON 會更靈活方便
2.1.3 Postman實現示例
2.1.3.1 帶查詢引數的介面
可參考前面的第一個示例,結果如下所示:
2.1.3.2 application/x-www-form-urlencoded
操作步驟如下所示:
- 1.新建一個請求
- 2.請求方法為POST
- 3.輸入請求地址:
http://httpbin.org/post
- 4.切換至Body,編碼型別選擇x-www-form-urlencoded
- 5.填寫相應的引數
username:diana
password:surpass
code:loveyou
- 6.點選Send
2.1.3.3 multipart/form-data
multipart/form-data一般常用於上傳檔案,比如更新使用者頭像、License授權等,操作步驟如下所示:
- 1.新建一個請求
- 2.請求方法為POST
- 3.輸入請求地址:
http://httpbin.org/post
- 4.切換至Body,編碼型別選擇form-data
- 5.在key中填入引數file,移動滑鼠至其他地方
- 6、再次移動滑鼠至引數file後面,設定引數型別為File
- 7.在value點選Select Files
- 8.點選Send
上傳檔案中的key(該示例為file)需要根據實際介面地址進行替換,該例僅為演示
2.1.3.4 application/json
這是介面最常見一種的資料型別,操作步驟如下所示:
- 1.新建一個請求
- 2.請求方法為POST
- 3.輸入請求地址:
http://httpbin.org/post
- 4.切換至Headers,輸入Conten-Type
- 5.切換至Body,編碼型別選擇raw,輸入以下資料
{
"username": "diana",
"password": "surpass",
"code": "loveyou"
}
- 6.點選Send
2.1.3.5 text/xml
- 1.新建一個請求
- 2.請求方法為POST
- 3.輸入請求地址:
http://httpbin.org/post
- 4.切換至Headers,輸入Conten-Type
- 5.切換至Body,編碼型別選擇raw,輸入以下資料
<?xml version="1.0" encoding="UTF-8" ?>
<userinfo>
<username>diana</username>
<password>surpass</password>
<code>loveyo</code>
</userinfo>
- 6.點選Send
2.2 介面響應資料解析
響應資料是在傳送請求後經過伺服器處理後返回的結果,通過由三部分組成,分別是狀態行、響應頭、響應體。在Postman的展示如下所示:
在Postman中的響應資料中,對介面測試的主要參考如下所示:
- Body和Status是重點,可以用來驗證響應資料和響應狀態碼
- Test Result用來我們編寫的斷言執行結果
- Time和Size可用作效能測試的簡單判斷條件
Body的顯示主題,常用的是Pretty、Raw、Preview
- Pretty:直譯是美化,如果選中該標籤,則意味著返回的資料Postman會自動進行格式化處理,使資料看起來更加美觀。若返回的資料是json格式,則格式化為json再進行展示
- Raw:即返回的資料,不做任何美化處理,直接顯示最原始的資料。
- Priview:直譯為預覽,一般常用於返回為HTML的響應中,可以直接顯示為網頁形式,示例如下所示:
2.3 介面管理
2.3.1 介面管理功能
當我們對一個或多個系統中的介面用例進行維護時,需要進行分類管理,方便後期維護或批量做迴歸測試。在Postman提供該功能為Collections,通過Collections可以實現以下功能:
- 用例分類管理
- 批量回歸測試用例
假設一個系統按模組劃分有以下幾個模組和介面,如下所示:
--使用者模組
|--使用者新增介面
|--使用者刪除介面
|--使用者修改密碼介面
|--使用者查詢介面
--訂單模組
|--訂單管理
|--訂單查詢介面
|--訂單刪除介面
|--訂單跟蹤
|--訂單物流資訊查詢
我們按以上結構進行建立Collections,操作步驟如下所示:
- 1.點選左邊Collection選項卡,再點選+,如下所示:
- 2.在建立的Collections右鍵,在彈出的選單中選擇Rename,輸入新的名稱CollectionSample即可
- 3.建立子模組,在CollectionSample右鍵,在彈出的選單中選擇Add Folder,再次在剛新建立的子模組中右鍵,在彈出的選單中選擇Rename,輸入新的名稱使用者模組即可,如下所示:
- 4.建立請求,在子模組使用者模組右鍵,在彈出的選單中選擇Add Request,再次在剛新建立的請求右鍵,在彈出的選單中選擇Rename,輸入新的名稱使用者模組即可,如下所示:
- 5.重複上面步驟,依次建立各模組和相應的介面請求,最終效果如下所示:
2.3.2 批量執行介面
有一些時間,想單獨執行系統中某一模組的全部介面用例,該如何操作呢?Postman提供了批量執行介面用例的功能,對應於Run,操作步驟如下所示:
- 1.選中一個需要批量執行的Collections,在選單中選擇Run,如下所示:
- 2.在彈出的視窗中勾選需要執行的介面用例,並設定對應的引數,點選Run CollectionSample即可
Iterations:代表需要執行的次數
Delay:在執行完一個介面後的休眠時間
Data:從檔案中讀取並替換引數化變數
- 3.在等待執行完成,可以檢視相應的結果
All Tests:所有執行的測試介面用例
Passed:斷言通過的介面用例
Failed:斷言失敗的介面用例
2.3.3 日誌除錯
在介面測試時,會因為程式碼有問題導致報錯,這時則可以利用Postman的日誌除錯功能實現快速定位問題。
在Postman中編寫日誌列印的語句是使用JavaScript,可以在Pre-request Script和Tests中編寫。
在Postman中預設Console是隱藏的可以通過以下兩種方式開啟
- 選單欄View->Show Postman Console
- 點選左下角的Console
搜尋日誌:輸入URL或日誌關鍵字即可搜尋出對應的請求和日誌記錄
日誌級別:可以按日誌級別進行快速查詢,日誌級別有:All logs、Log、Info、Warning、Error
檢視原始日誌:提供格式化後的請求日誌和原生日誌,可以進行切換
Show timestamps:是否顯示時間戳
Hides network:隱藏介面請求,僅顯示日誌
2.3.4 斷言
如果沒有斷言,就需要人工去判斷返回的結果是否正確,而有了斷言之後,就為介面自動化提供一個基礎條件,相應Postman也提供對應的斷言功能,在Postman中的斷言有以下幾個特點:
- 斷言編寫位置:Tests選項卡
- 斷言編寫語言:JavaScript
- 斷言執行順序:在響應資料返回後執行
- 斷言結果檢視:Test Results
JavaScript如果不會怎麼辦?Postman非常貼心的提供了一些常用的內建斷言,從右側點選對應的斷言,就可以在左邊Tests標籤中生成斷言程式碼片斷。
常用斷言程式碼,按響應又可以分為狀態碼、響應頭、響應體
- 斷言狀態碼:Status code: code is 200
pm.test("Status code is 200", function () {
// 響應的狀態碼為200
pm.response.to.have.status(200);
});
- 斷言狀態訊息:Status code:code name has string
pm.test("Status code name has string", function () {
// 響應的狀態訊息包含的字元OK
pm.response.to.have.status("OK");
});
- 成功的POST請求狀態碼:Successful POST request
pm.test("Successful POST request", function () {
pm.expect(pm.response.code).to.be.oneOf([200, 201, 202]);
});
- 斷言響應頭中包含:Response headers:Content-Type header check
pm.test("Content-Type is present", function () {
//斷言響應頭存在Content-Type
pm.response.to.have.header("Content-Type");
});
- 斷言響應體中包含字串:Response body:Contains string
pm.test("Body matches string", function () {
// 響應資料中包含字串loveyou
pm.expect(pm.response.text()).to.include("loveyou");
});
- 斷言響應體等於字串:Response body : is equal to a string
pm.test("Body is correct", function () {
// 響應資料等於字串loveyou
pm.response.to.have.body("loveyou");
});
- 斷言響應體(json)中某個鍵名對應的值:Response body : JSON value check
響應的資料如下所示:
{
"args": {},
"data": "",
"files": {},
"form": {
"code": "loveyou",
"password": "surpass",
"username": "diana"
},
"headers": {
"Accept": "*/*",
"Accept-Encoding": "gzip, deflate, br",
"Cache-Control": "no-cache",
"Content-Length": "392",
"Content-Type": "multipart/form-data; boundary=--------------------------885313293587233892669712",
"Host": "httpbin.org",
"Postman-Token": "9d61a0e9-d938-4263-90fb-b2acb696e700",
"User-Agent": "PostmanRuntime/7.28.4",
"X-Amzn-Trace-Id": "Root=1-6159c71c-65ecce4342403def289304d9"
},
"json": null,
"origin": "183.192.232.183",
"url": "http://httpbin.org/post"
}
斷言程式碼如下所示:
pm.test("Your test name", function () {
// 獲取響應Json資料
var jsonData = pm.response.json();
// 獲取jsonData鍵名為form的子鍵名為username的值為diana,然後再與期望的值進行對比
pm.expect(jsonData.form.username).to.eql("diana");
});
- 響應時間:Response time is less than 1000ms
pm.test("Response time is less than 1000ms", function () {
pm.expect(pm.response.responseTime).to.be.below(1000);
});
一般用於簡單的效能測試參考指標
2.3.5 變數
變數可以指令碼中儲存和重複使用,通過設定變數,可以在集合、環境或請求中引用。在Postman中常用的變數有以下全域性變數、環境變數、集合變數。
- 全域性變數:一旦申明,則全域性有效,即在Postman中的任何集合中都可以使用該變數,作用域最大
- 環境變數:要申明環境變數,先要建立環境,然後在該環境中建立變數。如果要想使用環境變數,必須先匯入這個環境,這樣才可以使用這個環境下的變數了。環境可以建立多個,每個環境下又可以有多個變數。
- 集合變數:集合變數是針對集合的,即申明的變數只能用於某個集合,使用範圍也僅限於該集合之內。
以上三種變數的範圍從大到小依次為全域性變數 > 集合變數 > 環境變數,如果要想使用變數,則需要進行兩步操作定義變數 、訪問變數
2.3.5.1 定義變數
定義全域性變數和環境變數,點選Postman右上角眼睛圖示,在彈出的介面就可以根據需要定義全域性變數和環境變數。
- 定義全域性變數
操作步驟如下所示:
1.點選Postman右上角眼睛圖示
2.在彈出的介面中,點選Globals後面的Add
3.在上面第2步彈出的介面填寫全域性變數名稱及其相應的值,最後點選Save,儲存全域性變數
以上操作步驟如下所示:
- 定義環境變數
操作步驟如下所示:
1.在Postman左側點選Environments,再點選左上角+
2.在彈出的介面中輸入環境名稱,並新增對應的環境變數
3.點選Save,儲存環境變數
以上操作步驟如下所示:
- 檢視全域性變數和環境變數
操作步驟如下所示:
1.在右側點選下拉選單列表,選擇其中一個環境
2.點選Postman右上角眼睛圖示,即可檢視對應環境變數和全域性變數
以上操作步驟如下所示:
- 定義集合變數
操作步驟如下所示:
1.在Postman左側點選Collections,選擇任意一個Collection
2.在彈出的右側中,選擇Variable選項卡
3.填寫相應的集合變數資訊即可
以上操作步驟如下所示:
- 程式碼定義變數
除了以上三種方式定義變數,也可以在Tests和Pre-requests Script中進行定義
定義全域性變數:pm.globals.set("變數名",變數值)
定義環境變數:pm.environment.set("變數名",變數值)
定義集合變數:pm.collectionVariables.set("變數名",變數值)
示例如下所示:
- 其他定義變數
定義變數除了以上幾種方式,還有另外一種方式。這種方式定義變數在不同的位置,編寫也有所不同,通過可以在URL、Params、Authorization、Headers和Body中定義,其操作步驟如下所示:
1.在URL、Params、Authorization、Headers和Body建立一個空的變數名
2.在以上位置把要建立變數的值右鍵選擇Set:環境|全域性
3.選擇其中一個變數名即可
以上操作步驟如下所示:
2.3.5.2 獲取變數
在定義好變數就可以獲取並使用變數了。在不同的位置獲取變數,編寫的規則也不盡相同,需要注意一下:
- 如果是在請求引數中獲取變數(URL、Params、Authorization、Headers和Body),無論是全域性變數、環境變數,還是集合變數,獲取的方式都是如下的規則:
{{變數名}}
- 如果變數位於Tests和Pre-requests Script,則獲取不同型別的變數,編寫的程式碼有所區別,如下所示:
獲取全域性變數:pm.globals.get("變數名")
獲取環境變數:pm.environment.get("變數名")
獲取集合變數:pm.collectionVariables.get("變數名")
以上示例如下所示:
變數的使用地方非常多,如介面關聯等,請求前置指令碼中會使用到變數等。
2.3.6 前置指令碼
前置指令碼其實就是在Pre-requests Script中編寫的JavaScript指令碼。
2.3.6.1 執行順序
在請求傳送之前,會先執行Pre-requests Script中的程式碼
2.3.6.2 使用場景
一般常用在傳送請求前,需要對介面資料做進一步處理。如呼叫一個介面前,需要獲取到使用的cookie等。
前置指令碼主要用於在傳送請求之前,需要對傳送的介面資料做進一步處理都可以使用前置指令碼功能
2.3.6.2 實戰示例
我們以一個登入介面為示例,該介面基本資訊如下所示:
- 請求的登入介面地址,有一個引數是需要獲取當前系統時間
- 介面地址:http://httpbin.org/post
- 介面引數如下所示:
實現步驟如下所示:
- 1.在前置指令碼中編寫獲取系統時間戳的程式碼,如下所示:
var timestamp=Date.parse(new Date())/1000
- 2.將該值儲存為環境變數,如下所示:
pm.environment.set("timestamp",timestamp)
- 3、獲取變數的值並傳遞給引數timestamp
以下詳細操作結果如下所示:
2.4 介面關聯
2.4.1 介面關聯定義
在日常測試過程,經常會碰到這種情況。介面A返回的資料需要做為介面B的請求引數(即介面A的輸出引數做為介面B的輸入引數),我們稱這種情況為 介面關聯
2.4.2 介面關聯實現思路
我們拋開Postman來整理下通用思路,如下所示:
- 1、獲取上一個介面的返回資料
- 2、將返回的資料儲存一個變數
- 3、在下一個介面傳送請求前,獲取變數的值
在Postman中如何實現呢?我們可以參考通用思路整理成以下的方式:
- 1、傳送請求並獲取到上一個介面的返回資料
- 2、將返回的資料儲存為全域性或環境變數
- 3、在下一個介面傳送請求前,獲取全域性或環境變數的值
2.4.3 介面關聯實踐示例
示例相應的介面說明如下所示:
- 1.介面A實現登入示例,其返回資料中會有一個引數timestamp引數
- 2.介面B實現傳送請求前,需要獲取介面A返回資料中的timestamp值,做為本身的請求引數
介面A的返回資料如下所示:
{
"args": {},
"data": "",
"files": {},
"form": {
"password": "surpass",
"timestamp": "1633851549",
"username": "diana"
},
"headers": {
"Accept": "*/*",
"Accept-Encoding": "gzip, deflate, br",
"Cache-Control": "no-cache",
"Content-Length": "52",
"Content-Type": "application/x-www-form-urlencoded",
"Host": "httpbin.org",
"Postman-Token": "0247d754-25a1-4775-9673-348ce30678a1",
"User-Agent": "PostmanRuntime/7.28.4",
"X-Amzn-Trace-Id": "Root=1-6162989d-329af5e75ae151953220e30d"
},
"json": null,
"origin": "183.192.236.236",
"url": "http://httpbin.org/post"
}
最終實現步驟如下所示:
- 1.獲取介面A的返回資料並儲存為環境變數
- 2、在介面B中獲取環境/全域性變數的值
2.5 返回資料獲取
在做介面測試,返回資料比較多的一般為JSON格式,可能存在多層巢狀,所以對返回的JSON進行取值也不全一樣,我們來看看在Postman裡面如何獲取,在Postman中獲取JSON資料的格式通常如下所示:
-
單層結構: .key
-
多層巢狀:.key.key
-
多層巢狀帶陣列:.key[index]
-
請求資料如下所示:
{
"personInfo": [
{
"nickName": "Surpass",
"realName": "lyl"
},
{
"nickName": "Diana",
"realName": "zq"
}
],
"location": "sh"
}
- 介面返回資料如下所示:
{
"args": {},
"data": "{\r\n \"personInfo\":[\r\n {\"nickName\":\"Surpass\",\"realName\":\"lyl\"},\r\n {\"nickName\":\"Diana\",\"realName\":\"zq\"}\r\n ],\r\n \"location\":\"sh\"\r\n}",
"files": {},
"form": {},
"headers": {
"Accept": "*/*",
"Accept-Encoding": "gzip, deflate, br",
"Cache-Control": "no-cache",
"Content-Length": "149",
"Content-Type": "application/json",
"Host": "httpbin.org",
"Postman-Token": "6bbae7e9-3ef5-4f52-8737-fc4dcd80cf8f",
"User-Agent": "PostmanRuntime/7.28.4",
"X-Amzn-Trace-Id": "Root=1-6162a8bf-0e14645445d34fe042ea136b"
},
"json": {
"location": "sh",
"personInfo": [
{
"nickName": "Surpass",
"realName": "lyl"
},
{
"nickName": "Diana",
"realName": "zq"
}
]
},
"origin": "183.192.236.236",
"url": "http://httpbin.org/post"
}
1.單層結構
獲取返回資料中origin值,程式碼如下所示:
// 1.獲取請求返回的資料
var returnJsonData=pm.response.json()
console.log("Retuen json data is:",returnJsonData)
// 2.獲取對應變數的值
var returnDataValue=returnJsonData.origin
console.log("Retuen json data value is:",returnDataValue)
2.多層巢狀
獲取返回資料中json中location值,程式碼如下所示:
// 1.獲取請求返回的資料
var returnJsonData=pm.response.json()
console.log("Retuen json data is:",returnJsonData)
// 2.獲取對應變數的值
var returnDataValue=returnJsonData.json.location
console.log("Retuen json data value is:",returnDataValue)
3.多層巢狀帶陣列
獲取返回資料中json中personInfo第二個值,程式碼如下所示:
// 1.獲取請求返回的資料
var returnJsonData=pm.response.json()
console.log("Retuen json data is:",returnJsonData)
// 2.獲取對應變數的值
var returnDataValue=returnJsonData.json.personInfo[1]
console.log("Retuen json data value is:",returnDataValue)
在JavaScript索引從0開始
原文地址:https://www.cnblogs.com/surpassme/p/15390018.html
本文同步在微信訂閱號上釋出,如各位小夥伴們喜歡我的文章,也可以關注我的微信訂閱號:woaitest,或掃描下面的二維碼新增關注: