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,或掃描下面的二維碼添加關注: