?
postman是一款支持http協(xié)議的接口調(diào)試與測(cè)試工具,其主要特點(diǎn)就是功能強(qiáng)大,使用簡(jiǎn)單且易用性好 。
無(wú)論是開(kāi)發(fā)人員進(jìn)行接口調(diào)試,還是測(cè)試人員做接口測(cè)試,postman都是我們的首選工具之一 。
那么接下來(lái)就介紹下postman到底有哪些功能,它們分別都能干些什么 。下面先通過(guò)一張圖來(lái)直觀的來(lái)看下postman中所包含的功能 。
![fc2fde98-037e-11ed-ba43-dac502259ad0.jpg](https://file1.elecfans.com//web2/M00/95/B5/wKgZomTnDE-AKvy8AACpAk0Sm4w321.jpg)
當(dāng)然,以上功能也只是展示了postman的一部分功能,為了能更加全面的體現(xiàn)這款工具的特點(diǎn),我將從以下三個(gè)維度來(lái)加以說(shuō)明。它們分別是:
-
基礎(chǔ)功能
-
?
- 常見(jiàn)類型的接口請(qǐng)求
- 接口響應(yīng)數(shù)據(jù)的解析
- 接口管理(Collection)
- 批量執(zhí)行接口請(qǐng)求
- 日志調(diào)試
- 斷言
- 變量
- 請(qǐng)求前置腳本
- 接口關(guān)聯(lián)
- 常見(jiàn)的返回值獲取
-
便捷功能快
? -
高級(jí)功能
-
?
- 讀取文件進(jìn)行參數(shù)化
- 生成測(cè)試報(bào)告
- 代碼中發(fā)送請(qǐng)求
- 編寫(xiě)接口文檔
- mock服務(wù)
- 監(jiān)控
- 使用工作空間
- 代碼同步與分支管理
- 連接數(shù)據(jù)庫(kù)
- apis
「一. postman安裝說(shuō)明」
postman 在 2018 年之后就不再支持瀏覽器版本,所以,想要使用它就必須先下載客戶端再安裝使用,下面就以 Windows 系統(tǒng)為例進(jìn)行安裝 。
「1. 下載與安裝」
postman安裝步驟:
1. 訪問(wèn)postman官方網(wǎng)站,下載最新版本
訪問(wèn)地址:https://www.getpostman.com/
2. 進(jìn)入到下載頁(yè)面,根據(jù)自己電腦下載對(duì)應(yīng)的版本
![fc4aa1ec-037e-11ed-ba43-dac502259ad0.png](https://file1.elecfans.com//web2/M00/95/B5/wKgZomTnDE-AFp0tAAFcSBW3k9E543.png)
3. 雙擊下載的安裝包,進(jìn)入到安裝界面,直到用戶登錄和注冊(cè)界面。
若個(gè)人使用,選擇跳過(guò)即可,這時(shí)會(huì)進(jìn)入到postman主界面,至此postman安裝成功(下圖)。
若團(tuán)隊(duì)使用,可以進(jìn)行注冊(cè),注冊(cè)后使用賬號(hào)可以加入團(tuán)隊(duì)工作區(qū)
![fc66ac7a-037e-11ed-ba43-dac502259ad0.png](https://file1.elecfans.com//web2/M00/95/B5/wKgZomTnDE-AC1sdAAHxM-MR9aM927.png)
「2.界面導(dǎo)航說(shuō)明」
初次使用postman的朋友可能對(duì)界面上的一些元素不太熟悉,下面就通過(guò)一張圖來(lái)說(shuō)明這些元素的含義 。
![fc73ef20-037e-11ed-ba43-dac502259ad0.png](https://file1.elecfans.com//web2/M00/95/B5/wKgZomTnDE-AendhAAG2Ur340ao791.png)
「3.發(fā)送第一個(gè)請(qǐng)求」
如果你是第一次使用postman發(fā)送請(qǐng)求,下面這個(gè)例子可以作為一個(gè)最基本的入門(mén),可以幫我們建立一個(gè)初始印象 。
1. 打開(kāi)postman,點(diǎn)擊+加號(hào)打開(kāi)一個(gè)新的請(qǐng)求頁(yè)。
2. 在請(qǐng)求的URL中輸入請(qǐng)求地址:
http://www.weather.com.cn/data/sk/101010100.html
3. 點(diǎn)擊Send按鈕,這時(shí)就可以在下部的窗格中看到來(lái)自服務(wù)器的json響應(yīng)數(shù)據(jù)。
![fc957f0a-037e-11ed-ba43-dac502259ad0.png](https://file1.elecfans.com//web2/M00/95/B5/wKgZomTnDE-ANv2EAAFlcZeG3fs923.png)
「二.postman基礎(chǔ)功能」
「1.常見(jiàn)類型的接口請(qǐng)求」
常見(jiàn)的接口有如下四種類型,分別是含有查詢參數(shù)的接口,表單類型的接口,json類型的接口以及含有上傳文件的接口,以下就對(duì)這四種類型接口及如何在postman中請(qǐng)求進(jìn)行說(shuō)明 。
「1.1 .查詢參數(shù)的接口請(qǐng)求」
「什么是查詢參數(shù)?」
所謂的查詢參數(shù),其實(shí)就是URL地址中問(wèn)號(hào)(?)后面的部分就叫查詢參數(shù),比如:http://cx.shouji.#/phonearea.php?number=13012345678 。在這個(gè)接口中,查詢參數(shù)就是:「number=13012345678」 。
而這一部分是由有鍵值對(duì)組成,格式為:key1=value1&key2=value2, 如果有多組鍵值對(duì),要用&隔開(kāi) 。
「postman如何請(qǐng)求」
在postman中實(shí)現(xiàn)對(duì)這類接口請(qǐng)求非常簡(jiǎn)單,一般就需要明確倆個(gè)參數(shù)即可,一個(gè)是請(qǐng)求方法,一個(gè)請(qǐng)求地址。
針對(duì)上面的那個(gè)接口,地址已經(jīng)給出 ,而它的請(qǐng)求方法是get 。那么在postman中只需要把這倆個(gè)參數(shù)填寫(xiě)上即可請(qǐng)求 。
具體實(shí)現(xiàn)步驟:
1. 打開(kāi)postman,新建一個(gè)請(qǐng)求。
2. 在請(qǐng)求方法中選擇請(qǐng)求方法:GET,因?yàn)樵趐ostman中默認(rèn)的請(qǐng)求方法就是GET,所以這一步可以忽略
3. 接口URL中輸入地址,點(diǎn)擊Send按鈕就可以發(fā)送請(qǐng)求了 。
![fca1cea4-037e-11ed-ba43-dac502259ad0.png](https://file1.elecfans.com//web2/M00/95/B5/wKgZomTnDE-AYHu7AAGP2I7JCqQ290.png)
說(shuō)明:查詢參數(shù)的URL一般直接拷貝到輸入的URL地址欄中就可以了,當(dāng)然也可以把查詢參數(shù)在Params中輸入,倆者的效果是一樣的 。
「1.2 表單類型的接口請(qǐng)求」
「什么是表單 ?」
我們都知道,在發(fā)送HTTP請(qǐng)求的時(shí)候,一個(gè)請(qǐng)求中一般包含三個(gè)部分,分別是請(qǐng)求行,請(qǐng)求頭,請(qǐng)求體 。
不同的接口,請(qǐng)求體的數(shù)據(jù)類型是不一樣的,比較常見(jiàn)的一種就是表單類型,那么什么是表單類型呢 ?簡(jiǎn)單理解就是在請(qǐng)求頭中查看「Content-Type,它的值如果是:application/x-www-form-urlencoded」 .那么就說(shuō)明客戶端提交的數(shù)據(jù)是以表單形式提交的 。見(jiàn)下圖:
![fcafd558-037e-11ed-ba43-dac502259ad0.png](https://file1.elecfans.com//web2/M00/95/B5/wKgZomTnDFCAXGX6AAKT-_fxY10082.png)
「postman中如何請(qǐng)求?」
如果在postman請(qǐng)求上圖的接口,我們只需要填寫(xiě)四個(gè)參數(shù),分別是(可以參考上圖):
-
請(qǐng)求方法:POST
-
請(qǐng)求URL:
http://localhost/index.php?m=Home&c=User&a=do_login&t=0.21942974229794432
-
請(qǐng)求頭:Content-Type:application/x-www-form-urlencode
-
請(qǐng)求體:username=13088888888&password=123456&verify_code=8888
實(shí)現(xiàn)步驟:
- 打開(kāi)postman,新建一個(gè)請(qǐng)求 。
- 在請(qǐng)求中設(shè)置以上四個(gè)參數(shù),點(diǎn)擊Send按鈕。在postman中設(shè)置請(qǐng)求體類型為,需要「選擇body-> x-www-form-urlencoded」
- 查看響應(yīng)數(shù)據(jù)。
![fcbea646-037e-11ed-ba43-dac502259ad0.png](https://file1.elecfans.com//web2/M00/95/B5/wKgZomTnDFCAbBiVAAHeW64PtQc185.png)
「1.3 上傳文件的表單請(qǐng)求」
在做接口測(cè)試時(shí),我們經(jīng)常會(huì)遇到需要上傳文件的接口,比如微信的更新頭像。這就需要用到:multipart/form-data。它也屬于一種表單,但它既支持表單請(qǐng)求,也支持文件上傳。它的請(qǐng)求報(bào)文中數(shù)據(jù)往往是下面這樣的。
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中該如何請(qǐng)求呢 ?我們先分析需要填寫(xiě)的參數(shù) 。
-
請(qǐng)求方法:POST
-
請(qǐng)求URL:
http://localhost/index.php/home/Uploadify/imageUp/savepath/head_pic/pictitle/banner/dir/images.html
-
請(qǐng)求類型:multipart/form-data
-
請(qǐng)求體:file=a1.jpg
實(shí)現(xiàn)步驟:
- 打開(kāi)postman,新建一個(gè)請(qǐng)求 。
- 在請(qǐng)求中設(shè)置以上四個(gè)參數(shù),點(diǎn)擊Send按鈕。注意:在postman中設(shè)置請(qǐng)求體類型,需要「選擇body-> form-data」 。file中要選擇File類型,然后上傳本地的文件 。
- 查看響應(yīng)數(shù)據(jù)。
![fccdf6b4-037e-11ed-ba43-dac502259ad0.png](https://file1.elecfans.com//web2/M00/95/B5/wKgZomTnDFCAfRugAAHDSVAMQ6U226.png)
「1.4 json類型的接口請(qǐng)求」
這應(yīng)該是接口測(cè)試中最常見(jiàn)的一種情況了 , 也就是請(qǐng)求體類型為json,我們來(lái)看下這個(gè)請(qǐng)求報(bào)文 。
POST?http://xxx/api/sys/login?HTTP/1.1
Content-Type:?application/json;charset=UTF-8
{"account":"root","password":"123456"}
根據(jù)以上報(bào)文,我們可以分析出,我們?cè)趐ostman只需要填寫(xiě)四個(gè)參數(shù)即可,具體如下:
- 請(qǐng)求方法:POST
- 請(qǐng)求地址:http://xxx/api/sys/login
- 請(qǐng)求體類型:json
- 請(qǐng)求體數(shù)據(jù):{"account":"root","password":"123456"}
實(shí)現(xiàn)步驟:
- 打開(kāi)postman,新建一個(gè)請(qǐng)求 。
- 在請(qǐng)求中設(shè)置以上四個(gè)參數(shù),點(diǎn)擊Send按鈕。注意:在postman中設(shè)置請(qǐng)求體類型,需要「選擇body-> raw -JSON」
- 查看響應(yīng)數(shù)據(jù)。
![fcda1322-037e-11ed-ba43-dac502259ad0.png](https://file1.elecfans.com//web2/M00/95/B5/wKgZomTnDFCAYD3HAAE2B8y9mpk396.png)
「2.接口響應(yīng)數(shù)據(jù)解析」
響應(yīng)數(shù)據(jù)是發(fā)送請(qǐng)求后經(jīng)過(guò)服務(wù)器處理后返回的結(jié)果,響應(yīng)由三部分組成,分別是狀態(tài)行、響應(yīng)頭、響應(yīng)體。我們來(lái)看下postman的響應(yīng)數(shù)據(jù)展示。
![fce8e91a-037e-11ed-ba43-dac502259ad0.png](https://file1.elecfans.com//web2/M00/95/B5/wKgZomTnDFCAQiwqAAFxJK4DK44522.png)
在postman中的響應(yīng)數(shù)據(jù)展示:
- 狀態(tài)行:Status:200 OK
- 響應(yīng)頭:Headers + Cookies,需要注意的是Cookies是包含在響應(yīng)頭中的,但是為了明顯,工具會(huì)分開(kāi)顯示
- 響應(yīng)體:Body
那么這些數(shù)據(jù)對(duì)我們做接口測(cè)試有什么作用呢 ?
- Body和Status是我們做接口測(cè)試的重點(diǎn),一般來(lái)說(shuō)我們都會(huì)驗(yàn)證響應(yīng)體中的數(shù)據(jù)和響應(yīng)狀態(tài)碼
- Test Results 是我們編寫(xiě)斷言后,可以查看斷言的執(zhí)行結(jié)果 ,所以這個(gè)對(duì)我們也很有用 。
- Time 和Size 是我們做性能測(cè)試時(shí),可以根據(jù)這兩個(gè)參數(shù)來(lái)對(duì)所測(cè)接口的性能做一個(gè)簡(jiǎn)單的判斷。
接下來(lái)我們?cè)賮?lái)關(guān)注下Body中的幾個(gè)顯示主題,分別是:Pretty,Raw,Preview .
![fcf53878-037e-11ed-ba43-dac502259ad0.png](https://file1.elecfans.com//web2/M00/95/B5/wKgZomTnDFCAJI0JAACrQd2i5w4375.png)
Pretty:翻譯成中文就是漂亮 , 也就是說(shuō)返回的Body數(shù)據(jù)在這個(gè)標(biāo)簽中查看 ,都是經(jīng)過(guò)格式化的,格式化后的數(shù)據(jù)看起來(lái)更加直觀,所以postman默認(rèn)展示的也是這個(gè)選項(xiàng)。比如返回html頁(yè)面,它會(huì)經(jīng)過(guò)格式化成HTML格式后展示,比如返回json,那么也會(huì)格式化成json格式展示 。
Raw:翻譯成中文未經(jīng)過(guò)加工的,也就是原始數(shù)據(jù) ,原始數(shù)據(jù)一般都是本文格式的,未經(jīng)過(guò)格式化處理的,一般在抓包工具中都有這個(gè)選項(xiàng) 。
Preview:翻譯成中文就是預(yù)覽,這個(gè)選項(xiàng)一般對(duì)返回HTML的頁(yè)面效果特別明顯,如請(qǐng)求百度后返回結(jié)果,點(diǎn)擊這個(gè)選項(xiàng)后就直接能查看到的頁(yè)面 ,如下圖 。同時(shí)這個(gè)選項(xiàng)和瀏覽器抓包中的Preview也是一樣的 。
![fd162aa6-037e-11ed-ba43-dac502259ad0.png](https://file1.elecfans.com//web2/M00/95/B5/wKgZomTnDFCAHjReAAFyxlfKQ1A822.png)
「3. 接口管理(Collection)」
當(dāng)我們對(duì)一個(gè)或多個(gè)系統(tǒng)中的很多用例進(jìn)行維護(hù)時(shí),首先想到的就是對(duì)用例進(jìn)行分類管理,同時(shí)還希望對(duì)這批用例做回歸測(cè)試 。在postman也提供了這樣一個(gè)功能,就是Collection 。通過(guò)這個(gè)Collection就可以滿足我們的上面說(shuō)的需求。
先對(duì)Collection功能的使用場(chǎng)景做個(gè)簡(jiǎn)單總結(jié) 。
- 用例分類管理,方便后期維護(hù)
- 可以進(jìn)行批量用例回歸測(cè)試 。
那么Collection是如何去管理用例的呢 ?先想象我們要測(cè)試一個(gè)系統(tǒng),系統(tǒng)下有多個(gè)模塊,每個(gè)模塊下有很多的被測(cè)接口用例 。那么基于這個(gè)場(chǎng)景,我們來(lái)通過(guò)Collection來(lái)進(jìn)行實(shí)現(xiàn):
1. 點(diǎn)擊Collection,點(diǎn)擊+New Collection,在彈出的輸入框中輸入Collection名稱(這個(gè)就可以理解為所測(cè)試的系統(tǒng))
![fd254112-037e-11ed-ba43-dac502259ad0.jpg](https://file1.elecfans.com//web2/M00/95/B5/wKgZomTnDFCAHEaBAABhZyV48m4251.jpg)
2. 選中新建的Collection右鍵,點(diǎn)擊Add Folder ,在彈出對(duì)話框中輸入文件夾名稱(這個(gè)就可以理解為系統(tǒng)中的模塊)
![fd3ee3f6-037e-11ed-ba43-dac502259ad0.jpg](https://file1.elecfans.com//web2/M00/95/B5/wKgZomTnDFGAF2k4AAD-wrf2vkw321.jpg)
3. 選中新建的Folder,點(diǎn)擊Add Request ,在彈出的對(duì)話框中輸入請(qǐng)求名稱,這個(gè)就是我們所測(cè)試的接口,也可以理解為測(cè)試用例 。
![fd4da260-037e-11ed-ba43-dac502259ad0.jpg](https://file1.elecfans.com//web2/M00/95/B5/wKgZomTnDFGAPdExAACVqqNs7-k244.jpg)
那么通過(guò)以上三個(gè)步驟,達(dá)到的效果就是如圖所示:
![fd64f578-037e-11ed-ba43-dac502259ad0.jpg](https://file1.elecfans.com//web2/M00/95/B6/wKgZomTnDFGARq7zAADsyuj9AfA128.jpg)
總結(jié),通過(guò)上面的操作,我們實(shí)現(xiàn)了一個(gè)最簡(jiǎn)單的demo模型。但實(shí)際上,有了這個(gè)功能才是postman學(xué)習(xí)的開(kāi)始,因?yàn)楹芏喙δ芏际腔A(chǔ)這個(gè)功能的基礎(chǔ)上進(jìn)行的,比如用例的批量執(zhí)行,Mock ,接口文檔等功能 。
「4. 批量執(zhí)行接口請(qǐng)求」
當(dāng)我們?cè)谝粋€(gè)Collection中編寫(xiě)了很多的接口測(cè)試用例,想一起執(zhí)行這批用例,在postman中是如何操作呢 ?
實(shí)現(xiàn)步驟:
1. 選中一個(gè)Collection,點(diǎn)擊右三角,在彈出的界面點(diǎn)擊RUN
![fd6e9880-037e-11ed-ba43-dac502259ad0.png](https://file1.elecfans.com//web2/M00/95/B6/wKgZomTnDFGATU3bAAGHMaF1SCs062.png)
2. 這是會(huì)彈出一個(gè)叫Collection Runner的界面,默認(rèn)會(huì)把Collection中的所有用例選中 。
![fd941b6e-037e-11ed-ba43-dac502259ad0.png](https://file1.elecfans.com//web2/M00/95/B6/wKgZomTnDFGAYvYQAAERMn4pTSw140.png)
3. 點(diǎn)擊界面下方的RUN Collection,就會(huì)對(duì)Collection中選中的所有測(cè)試用例運(yùn)行 。
![fda5cda0-037e-11ed-ba43-dac502259ad0.png](https://file1.elecfans.com//web2/M00/95/B6/wKgZomTnDFGAAY4ZAAFoQoWFwq8471.png)
對(duì)上面的幾個(gè)紅框內(nèi)的功能進(jìn)行簡(jiǎn)單說(shuō)明:
- 「斷言統(tǒng)計(jì)」:左上角的兩個(gè)0是統(tǒng)計(jì)當(dāng)前Collection中斷言成功的執(zhí)行數(shù)和失敗的執(zhí)行數(shù),如果沒(méi)有編寫(xiě)斷言默認(rèn)都為0 。
- Run Summary: 運(yùn)行結(jié)果總覽,點(diǎn)擊它可以看到每個(gè)請(qǐng)求中具體的測(cè)試斷言詳細(xì)信息 。Export Result:導(dǎo)出運(yùn)行結(jié)果,默認(rèn)導(dǎo)出的結(jié)果json文件 。
- Retry: 重新運(yùn)行,點(diǎn)擊它會(huì)把該Collection重新運(yùn)行一遍
- New:返回到Runner,可以重新選擇用例的組合 。
總體來(lái)說(shuō),這個(gè)功能主要是用于對(duì)一個(gè)Collection中的所有用例或部分用例進(jìn)行批量運(yùn)行,已達(dá)到手工回歸測(cè)試的目的。
「5.日志調(diào)試」
在做接口測(cè)試時(shí),經(jīng)常會(huì)因?yàn)榇a寫(xiě)的有問(wèn)題導(dǎo)致報(bào)錯(cuò),這時(shí)通過(guò)查看日志就顯得非常重要了,postman也提供了這樣的功能,它允許我們?cè)谀_本中編寫(xiě)打印語(yǔ)句,查看打印的結(jié)果 ; 同時(shí)也可以查看每個(gè)請(qǐng)求的日志信息 。
在postman中編寫(xiě)日志打印語(yǔ)句使用的是JavaScript,編寫(xiě)的位置可以是Pre-request Script 或Tests標(biāo)簽中。編寫(xiě)打印語(yǔ)句如:console.log("我是一條日志")
![fdb924d6-037e-11ed-ba43-dac502259ad0.png](https://file1.elecfans.com//web2/M00/95/B6/wKgZomTnDFKAIpDEAAErxlEdfK8705.png)
那么打印的日如何看呢 ?在postman中有倆個(gè)入口,第一個(gè)入口就是:view-show postman console 。
第二個(gè)入口就是左下角第三個(gè)圖標(biāo) 。
![fdca38c0-037e-11ed-ba43-dac502259ad0.png](https://file1.elecfans.com//web2/M00/95/B6/wKgZomTnDFKAaDI7AAIUlV2SOH8477.png)
打開(kāi)的日志界面:
![fdef9c8c-037e-11ed-ba43-dac502259ad0.png](https://file1.elecfans.com//web2/M00/95/B6/wKgZomTnDFKANPtiAAHugL-e9aQ342.png)
這里面有幾個(gè)比較實(shí)用的功能:
- 搜索日志:輸入U(xiǎn)RL或者打印的日志就能直接搜索出我們想要的請(qǐng)求和日志,這對(duì)我們?cè)诒姸嗳罩局胁檎夷骋粭l日志是非常方便的 。
- 按級(jí)別搜索:可以查詢log,info,warning,error級(jí)別的日志 ,有助于我們更快定位到錯(cuò)誤 。
- 查看原始報(bào)文(Show raw log):如果習(xí)慣看原始請(qǐng)求報(bào)文的話,這個(gè)功能可能更方便些 。
- 隱藏請(qǐng)求(Hide network):把請(qǐng)求都隱藏掉,只查看輸出日志 。
總之,通過(guò)這個(gè)功能,我們?cè)谡?qǐng)求接口報(bào)錯(cuò)時(shí),通過(guò)打印響應(yīng)的日志,就能很輕松的找到問(wèn)題原因了 。
「6.斷言」
如果沒(méi)有斷言,我們只能做接口的功能測(cè)試,但有了斷言后,就為我們做自動(dòng)化提供了條件,并且在postman中的斷言是非常方便和強(qiáng)大的 。
我們先來(lái)了解下postman斷言的一些特點(diǎn) ,具體如下
- 斷言編寫(xiě)位置:Tests標(biāo)簽
- 斷言所用語(yǔ)言:JavaScript
- 斷言執(zhí)行順序:在響應(yīng)體數(shù)據(jù)返回后執(zhí)行 。
- 斷言執(zhí)行結(jié)果查看:Test Results
在上面我們介紹到,編寫(xiě)的斷言代碼是JavaScript,那如果不會(huì)寫(xiě)怎么辦 ?不用擔(dān)心,因?yàn)閜ostman已經(jīng)給我們內(nèi)置了一些常用的斷言 。用的時(shí)候,只需從右側(cè)點(diǎn)擊其中一個(gè)斷言,就會(huì)在文本框中自動(dòng)生成對(duì)應(yīng)斷言代碼塊 。
![fdf96564-037e-11ed-ba43-dac502259ad0.png](https://file1.elecfans.com//web2/M00/95/B6/wKgZomTnDFKAGtOEAAEevBCHWlA198.png)
接下來(lái)就讓我們了解一些常用斷言,還是按響應(yīng)的組成來(lái)劃分,分別是狀態(tài)行,響應(yīng)頭,響應(yīng)體。
狀態(tài)行中又包括狀態(tài)碼,狀態(tài)消息 。在postman也可以對(duì)這兩個(gè)進(jìn)行斷言
「狀態(tài)行中的斷言」:
- 斷言狀態(tài)碼:「Status code: code is 200」
pm.test("Status?code?is?200",?function?()?{
????pm.response.to.have.status(200);?//這里填寫(xiě)的200是預(yù)期結(jié)果,實(shí)際結(jié)果是請(qǐng)求返回結(jié)果
});
- 斷言狀態(tài)消息:「Status code:code name has string」
pm.test("Status?code?name?has?string",?function?()?{
????pm.response.to.have.status("OK");?//斷言響應(yīng)狀態(tài)消息包含OK
});
「響應(yīng)頭中的斷言」
- 斷言響應(yīng)頭中包含:Response headers:Content-Type header check
pm.test("Content-Type?is?present",?function?()?{
????pm.response.to.have.header("Content-Type");?//斷言響應(yīng)頭存在"Content-Type"
});
「斷言響應(yīng)體(重點(diǎn))」
- 斷言響應(yīng)體中包含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")?獲取響應(yīng)文本中包含string
- 斷言響應(yīng)體等于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");?獲取響應(yīng)體等于response_body_string
- 斷言響應(yīng)體(json)中某個(gè)鍵名對(duì)應(yīng)的值: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()?獲取響應(yīng)體,以json顯示,賦值給jsonData .注意:該響應(yīng)體必須返會(huì)是的json,否則會(huì)報(bào)錯(cuò)
pm.expect(jsonData.value).to.eql(100)?獲取jsonData中鍵名為value的值,然后和100進(jìn)行比較
「響應(yīng)時(shí)間(一般用于性能測(cè)試)」
- 斷言響應(yīng)時(shí)間:Response time is less than 200ms
pm.test("Response?time?is?less?than?200ms",?function?()?{
????pm.expect(pm.response.responseTime).to.be.below(200);?//斷言響應(yīng)時(shí)間<200ms
});
「案例說(shuō)明」:
針對(duì)以下接口返回的數(shù)據(jù)進(jìn)行斷言:
{
????"cityid":?"101120101",
????"city":?"濟(jì)南",
????"update_time":?"2020-04-17?10:50",
????"wea":?"晴",
????"wea_img":?"qing",
????"tem":?"16",
????"tem_day":?"20",
????"tem_night":?"9",
????"win":?"東北風(fēng)",
????"win_speed":?"3級(jí)",
????"win_meter":?"小于12km/h",
????"air":?"113"
}
- 斷言響應(yīng)狀態(tài)碼為200
- 斷言city等于濟(jì)南
- 斷言u(píng)pdate_time包含2020-04-17
![fe202adc-037e-11ed-ba43-dac502259ad0.png](https://file1.elecfans.com//web2/M00/95/B6/wKgZomTnDFKAbLFxAAHU3RsFxOI269.png)
總結(jié),整體來(lái)說(shuō),如果用postman做接口測(cè)試,這個(gè)斷言功能必不可少,其中我們常斷言的響應(yīng)體包含和JSON這倆個(gè)斷言又是重重之重。
「7. 變量(全局/集合/環(huán)境)」
變量可以使我們?cè)谡?qǐng)求或腳本中存儲(chǔ)和重復(fù)使用其值,通過(guò)將值保存在變量中,可以在集合,環(huán)境或請(qǐng)求中引用。
對(duì)我們做接口測(cè)試來(lái)說(shuō),又是一個(gè)非常重要的功能 。
在postman常用的三種變量分別是全局變量,環(huán)境變量,集合變量 。
- 「全局變量」:一旦申明了全局變量,全局有效,也就是說(shuō)postman中的任何集合,任何請(qǐng)求中都可以使用這個(gè)變量。它的作用域是最大的 。
- 「環(huán)境變量」:要申明環(huán)境變量,首先的創(chuàng)建環(huán)境,然后在環(huán)境中才能創(chuàng)建變量 。如果要想使用環(huán)境變量,必須先選擇(導(dǎo)入)這個(gè)環(huán)境,這樣就可以使用這個(gè)環(huán)境下的變量了 。需要說(shuō)明的是環(huán)境也可以創(chuàng)建多個(gè) 。每個(gè)環(huán)境下又可以有多個(gè)變量 。
- 「集合變量」:集合變量是針對(duì)集合的,也就是說(shuō)申明的變量必須基于某個(gè)集合,它的使用范圍也只是針對(duì)這個(gè)集合有效 。
其中,他們的作用域范圍依次從大到?。喝肿兞?集合變量>環(huán)境變量 。當(dāng)在幾個(gè)不同的范圍內(nèi)都申明了相同的變量時(shí),則會(huì)優(yōu)先使用范圍最小的變量使。
想要使用變量中的值只需倆個(gè)步驟,分別是定義變量和獲取變量 。
- 定義變量(設(shè)置變量)
- 獲取變量(訪問(wèn)變量)
「定義變量」
定義全局變量和環(huán)境變量,點(diǎn)擊右上角的小齒輪,彈出如下界面,就可以根據(jù)需求定義全局變量或者環(huán)境變量了。
![fe30646a-037e-11ed-ba43-dac502259ad0.png](https://file1.elecfans.com//web2/M00/95/B6/wKgZomTnDFKALdPHAAF0V3Jxs28596.png)
已經(jīng)定義的全局變量和環(huán)境變量,可以進(jìn)行快速查看:
![fe56e338-037e-11ed-ba43-dac502259ad0.png](https://file1.elecfans.com//web2/M00/95/B6/wKgZomTnDFKAV0cMAAFeFrLM35U669.png)
「定義集合變量」
選擇一個(gè)集合,打開(kāi)查看更多動(dòng)作(「...」)菜單,然后點(diǎn)擊編輯 。選擇“變量”選項(xiàng)卡以編輯或添加到集合變量。
![fe64a37e-037e-11ed-ba43-dac502259ad0.jpg](https://file1.elecfans.com//web2/M00/95/B6/wKgZomTnDFOAPKzNAACljQtbDIg027.jpg)
定義變量除了以上方式,還有另外一種方式 。但是這種方式在不同的位置定義,編寫(xiě)不一樣。
在URL,Params , Authorization , Headers , Body中定義:
1. 手工方式創(chuàng)建一個(gè)空的變量名
2. 在以上的位置把想要的值選中右擊,選中Set:環(huán)境|全局 ,選中一個(gè)變量名,點(diǎn)擊后就會(huì)保存到這個(gè)變量中
![fe7c5410-037e-11ed-ba43-dac502259ad0.png](https://file1.elecfans.com//web2/M00/95/B6/wKgZomTnDFOABTxrAAGadt0I9iE794.png)
在Tests,Pre-requests Script:
- 定義全局變量:pm.collectionVariables.set("變量名",變量值)
- 定義環(huán)境變量:pm.environment.set("變量名",變量值)
- 定義集合變量:pm.variables.set("變量名",變量值)
「獲取變量」
定義好變量,接下來(lái)就可以使用變量了 。需要注意的是,在不同的位置獲取變量,編寫(xiě)的規(guī)則也是不一樣的 。
如果在「請(qǐng)求參數(shù)中」獲取變量,無(wú)論是獲取全局變量,還是環(huán)境變量,還是集合變量,獲取的方式都是一樣的編寫(xiě)規(guī)則:{{變量名}} 。
- 請(qǐng)求參數(shù)指的是:URL,Params , Authorization , Headers , Body
如果是在編寫(xiě)代碼的位置(Tests,Pre-requests Script)獲取變量,獲取不同類型的變量,編寫(xiě)的代碼都不相同,具體如下:
- 獲取環(huán)境變量:pm.environment.get(‘變量名’)
- 獲取全局變量:pm.globals.get('變量名')
- 獲取集合變量:pm.pm.collectionVariables.get.get('變量名')
![fe8b001e-037e-11ed-ba43-dac502259ad0.png](https://file1.elecfans.com//web2/M00/95/B6/wKgZomTnDFOARUTAAAEmhAqlD6I842.png)
變量的使用場(chǎng)景非常廣泛,比如我們后面要提到的接口關(guān)聯(lián),請(qǐng)求前置腳本都會(huì)使用到變量 。
「8. 請(qǐng)求前置腳本」
前置腳本其實(shí)就是在Pre-requests Script中編寫(xiě)的JavaScript腳本,想要了解這個(gè)功能,需要先了解它的執(zhí)行順序。那么下面就來(lái)看下它的執(zhí)行順序 。
可以看出,一個(gè)請(qǐng)求在發(fā)送之前,會(huì)先去執(zhí)行Pre Request Script(前置腳本)中的代碼 。那么這個(gè)功能在實(shí)際工作中有什么作用呢 ?
主要場(chǎng)景:一般情況下,在發(fā)送請(qǐng)求前需要對(duì)接口的數(shù)據(jù)做進(jìn)一步處理,就都可以使用這個(gè)功能,比如說(shuō),登錄接口的密碼,在發(fā)送前需要做加密處理,那么就可以在前置腳本中做加密處理,再比如說(shuō),有的接口的輸入?yún)?shù)有一些隨機(jī)數(shù),每請(qǐng)求一次接口參數(shù)值都會(huì)發(fā)送變化,就可以在前置腳本中編寫(xiě)生成隨機(jī)數(shù)的代碼 。
總體來(lái)說(shuō),就是在請(qǐng)求接口之前對(duì)我們的請(qǐng)求數(shù)據(jù)進(jìn)行進(jìn)一步加工處理的都可以使用前置腳本這個(gè)功能。
接下來(lái)通過(guò)一個(gè)案例來(lái)看下該功能是如何使用 ?
案例:
-
請(qǐng)求的登錄接口URL,參數(shù)t的值要求的規(guī)則是每次請(qǐng)求都必須是一個(gè)隨機(jī)數(shù)。
-
接口地址:
http://localhost/index.php?m=Home&c=User&a=do_login&t=0.7102045930338428
![fe9eb37a-037e-11ed-ba43-dac502259ad0.png](https://file1.elecfans.com//web2/M00/95/B6/wKgZomTnDFOAcAuhAAEsiqZfsJ0543.png)
實(shí)現(xiàn)步驟:
- 在前置腳本中編寫(xiě)生成隨機(jī)數(shù)
- 將這個(gè)值保存成環(huán)境變量
- 將參數(shù)t的值替換成環(huán)境變量的值 。
![feb81496-037e-11ed-ba43-dac502259ad0.png](https://file1.elecfans.com//web2/M00/95/B6/wKgZomTnDFOAUkdhAAF-GmPcmeU411.png)
總之,這個(gè)前置腳本對(duì)我們做接口測(cè)試也非常有用,對(duì)一些復(fù)雜的場(chǎng)景,都可以使用前置腳本進(jìn)行處理后再請(qǐng)求接口 。
「9. 接口關(guān)聯(lián)」
在我們測(cè)試的接口中,經(jīng)常出現(xiàn)這種情況 。上一個(gè)接口的返回?cái)?shù)據(jù)是下一個(gè)接口的輸入?yún)?shù) ,那么這倆個(gè)接口就產(chǎn)生了關(guān)聯(lián)。這種關(guān)聯(lián)在做接口測(cè)試時(shí)非常常見(jiàn),那么在postman中,如何實(shí)現(xiàn)這種關(guān)聯(lián)關(guān)系呢 ?
實(shí)現(xiàn)思路:
- 提取上一個(gè)接口的返回?cái)?shù)據(jù)值,
- 將這個(gè)數(shù)據(jù)值保存到環(huán)境變量或全局變量中
- 在下一個(gè)接口獲取環(huán)境變量或全局變量
案例:
- 用戶上傳頭像功能,需要用戶先上傳一張圖片,然后會(huì)自動(dòng)預(yù)覽 。那么在這個(gè)過(guò)程中,會(huì)調(diào)用到倆個(gè)接口 ,第一個(gè)上傳頭像接口,第二個(gè)預(yù)覽圖像接口 。
- 其中調(diào)用上傳頭像接口成功后會(huì)返回如下信息:
{
????"url":?"/public/upload/user//head_pic//ba51d1c2f7f7b98dfb5cad90846e2d79.jpg",
????"title":?"banner",
????"original":?"",
????"state":?"SUCCESS",
????"path":?"images"
}
而圖像預(yù)覽接口URL為:
http://localhost/public/upload/user//head_pic//ba51d1c2f7f7b98dfb5cad90846e2d79.jpg ??梢钥闯鲞@個(gè)接口的URL后半部分其實(shí)是上一個(gè)接口返回的url的值 。那么這倆個(gè)接口就產(chǎn)生了關(guān)聯(lián)。那么在postman 可以通過(guò)以下三步完成這倆個(gè)接口的關(guān)聯(lián)實(shí)現(xiàn) 。
實(shí)現(xiàn)步驟:
- 獲取上傳頭像接口返回url的值
- 將這個(gè)值保存成全局變量(環(huán)境變量也可以)
- 在圖像預(yù)覽中使用全局變量
![fec8615c-037e-11ed-ba43-dac502259ad0.png](https://file1.elecfans.com//web2/M00/95/B6/wKgZomTnDFOAJlFCAAH6hUol0ok763.png)
可以看出,接口的關(guān)聯(lián)的解決方案都是用的是變量中的知識(shí),也就是說(shuō)只要你明確了要提取的值,后面就是保存該值,然后在其他接口使用該值就可以了。
「10.常見(jiàn)返回值獲取」
在做接口測(cè)試時(shí),請(qǐng)求接口返回的數(shù)據(jù)都是很復(fù)雜的json數(shù)據(jù),有著多層嵌套,這樣的數(shù)據(jù)層級(jí)在postman怎么獲取呢 ?
案例1:多層json嵌套, 獲取user_id的值
{
????"code":?0,
????"message":?"請(qǐng)求成功!",
????"data":?{
????????"user_id":?"1252163151781167104"
????}
}
//獲取json體數(shù)據(jù)
var?jsonData?=?pm.response.json()
//?獲取user_id的值,通過(guò).獲取
var?user_id?=?jsonData.data.user_id
案例2:json中存在列表,獲取points中的第二個(gè)元素
{
????"code":?0,
????"message":?"請(qǐng)求成功!",
????"data":?{
????????"roles":?{
????????????"api":?[
????????????????"API-USER-DELETE"
????????????],
????????????"points":?[
????????????????"point-user-delete",
????????????????"POINT-USER-UPDATE",
????????????????"POINT-USER-ADD"
????????????]
????????},
????????"authCache":?null
????}
}
//獲取json體數(shù)據(jù)
var?jsonData?=?pm.response.json()
//?獲取user_id的值,通過(guò)下標(biāo)獲取列表中某個(gè)元素
var?user_id?=?jsonData.data.roles.points[1]
案例3:列表中取最后一個(gè)元素
{
????"code":?0,
????"message":?"請(qǐng)求成功!",
????"data":?{
????????"total":?24,
????????"rows":?[
???????????
????????????{
????????????????"id":?"1066370498633486336",
????????????????"mobile":?"15812340003",
????????????????"username":?"zbz"
????????????},
????????????{
????????????????"id":?"1071632760222810112",
????????????????"mobile":?"16612094236",
????????????????"username":?"llx"
????????????},
????????????...
????????????{
????????????????"id":?"1075383133106425856",
????????????????"mobile":?"13523679872",
????????????????"username":?"test001",
???????
????????????},
//獲取json體數(shù)據(jù)
var?jsonData?=?pm.response.json()
//?獲取id的值,通過(guò)slice(-1)獲取列表中最后一個(gè)元素。
var?id?=?jsonData.data.rows.slice(-1)[0]
評(píng)論