[TOC]
之前雖然自己也有用postman來(lái)測(cè)試api,但都只是最簡(jiǎn)單輸入url,發(fā)送,查看結(jié)果,大部分時(shí)候跟使用瀏覽器差不多,偶然在簡(jiǎn)書(shū)首頁(yè)看到一篇 API開(kāi)發(fā)神器-Postman , 深感還是得對(duì)自己使用的工具多琢磨一下,興許你就發(fā)現(xiàn)了寶貝,大大加快開(kāi)發(fā)測(cè)試速度了;
這里沒(méi)有打算寫(xiě)全面的教程,只對(duì)我之前沒(méi)了解的環(huán)境設(shè)置/變量使用以及對(duì)返回結(jié)果進(jìn)行過(guò)濾等操作進(jìn)行記錄,詳細(xì)的文檔請(qǐng)看 官網(wǎng)說(shuō)明 ,另外,我的版本是 4.3.2;
環(huán)境(Environmen)
在開(kāi)發(fā)不同階段,可能存在不同的環(huán)境(對(duì)我碰到的就是服務(wù)器地址/api版本/header信息等不一樣),比如 debug環(huán)境和release環(huán)境,每次切換環(huán)境測(cè)試的時(shí)候都得重新配置url信息,非常麻煩耗時(shí),還容易出錯(cuò);
如果能把這些配置信息抽象成類(lèi),不同環(huán)境對(duì)應(yīng)不同的實(shí)例,初始化設(shè)定后,在request請(qǐng)求中通過(guò)類(lèi)/實(shí)例成員變量來(lái)引用不同的值,從而在需要的時(shí)候通過(guò)切換環(huán)境來(lái)選擇不同的配置信息,這樣不是很方便嗎?
postman就提供了這樣的功能:
若已配置過(guò)環(huán)境,可以通過(guò)選擇下方的環(huán)境名稱(chēng)來(lái)切換,request中的變量就會(huì)使用該環(huán)境中的值了...(這是廢話==)
點(diǎn)擊上圖下拉菜單中的 Manage Environments
,打開(kāi)管理環(huán)境管理頁(yè)面如下:
圖中的 app_dev
等環(huán)境是我之前已經(jīng)配置好的,初始是空白界面,點(diǎn)擊下方的 add
按鈕來(lái)新增一個(gè):
Environment Name
中隨便填入便于自己記憶的名稱(chēng)即可
key
和 value
就填入自己需要的變量名和值即可,可以填入多對(duì);
tip: 如果不同環(huán)境的參數(shù)基本相同,直接復(fù)制一份已配置好的環(huán)境信息,再進(jìn)行修改即可:
變量說(shuō)明
在postman中,變量有全局變量(GlobalVariable)和環(huán)境變量(EnvironmentVariable)之分,環(huán)境變量就是上面提到的在環(huán)境管理中設(shè)置的變量,全局變量可以在不同環(huán)境(No environment
也算一種環(huán)境吧)都可以使用...(好吧,我又啰嗦了,就是生命周期不一樣,一個(gè)局部的一個(gè)全局的);
環(huán)境變量除了通過(guò)上面介紹的配置環(huán)境時(shí)進(jìn)行設(shè)定外,還可以通過(guò)代碼進(jìn)行設(shè)置,postman使用javaScript,從下圖的 Pre-request Script
中通過(guò)右側(cè)的 SNIPPETS
中預(yù)定義的常用腳本可以看到變量的設(shè)置方法:
postman.setEnvironmentVariable("variable_key", "variable_value");
postman.setGlobalVariable("variable_key", "variable_value");
變量引用
官網(wǎng) Environment and global variables
部分有說(shuō)明;
通過(guò) {{variable_name}}
來(lái)使用,可以在 url地址欄
,Headers
,Pre-request Script
,Tests
中引用:
在request之后,這些 {{}}
部分會(huì)被替代成實(shí)際的值,另外,Pre-request Script
中的腳本會(huì)在執(zhí)行request請(qǐng)求前先運(yùn)行,因此可以在里面預(yù)先設(shè)置些所需變量,而 Tests
中的腳本是在request返回后執(zhí)行的,可以對(duì)返回信息進(jìn)行提取過(guò)濾,舉個(gè)栗子,獲取如下返回信息中的 user_id
值:
// 假設(shè)服務(wù)端返回的Body內(nèi)容如下:
{
"token": {
"user_id": "2079876912",
"access_token": "26A90E317DBC1AD363B2E2CE53F76F2DD85CB172DF7D813099477BAACB69DC49C794BAECEDC68331",
"expires_at": "2016-06-22T12:46:51.637+0800",
"refresh_token": "26A90E317DBC1AD3CD1556CF2B3923DD60AEBADDCBC1D9D899262A55D15273F735E407A6BEC56B84",
"mac_key": "4FAhd4OpfC",
"mac_algorithm": "hmac-sha-256",
"server_time": "2016-06-15T12:46:51.649+0800"
}
}
在 Tests
中對(duì) user_id
值進(jìn)行提取并賦值成全局變量:
// 判斷是否存在 'user_id' 值
tests["Body contains user_id"] = responseBody.has("user_id");
if(tests["Body contains user_id"]){
// 將返回信息解析成對(duì)象
var responseData = JSON.parse(responseBody);
tests["value_user_id"]=responseData.token.user_id
// 設(shè)置全局變量
postman.setGlobalVariable("user_id",tests["value_user_id"]);
}else{
// globals["test_user_id"] 是我在 `Pre-request Script` 中預(yù)定義好的一個(gè)常量值
postman.setGlobalVariable("user_id",globals["test_user_id"]);
}
另外,在界面下方返回信息中的 Tests
標(biāo)簽中,代碼內(nèi)使用 tests[props_name]
括起來(lái)的屬性都會(huì)顯示結(jié)果:
結(jié)合以上所說(shuō),我會(huì)新建個(gè)request用于初始化各種全局變量,運(yùn)行完以后再來(lái)運(yùn)行具體的api請(qǐng)求測(cè)試
Postman Interceptor
下載地址
這個(gè)插件我有挺喜歡,配合postman很方便,可以直接攔截瀏覽器中的request,記錄到postman中的 history
列表中,所需的header等信息也都一并處理好了,著實(shí)簡(jiǎn)單:
Postman Interceptor helps you send requests which use browser cookies through the Postman app.
It can also send headers which are normally restricted by Chrome but are critical for testing APIs. The Interceptor makes this process painless. Something that would have required a proxy earlier can now be achieved without any installation steps or extra configuration.
實(shí)際試試,可以發(fā)現(xiàn),瀏覽器的各種請(qǐng)求都被記錄到了postman中的history列表中了,同時(shí),請(qǐng)求所需的各種頭信息也都被整理好了,很方便:
附帶說(shuō)一下 runner
,也是挺好用的一個(gè)工具,對(duì)于整理歸類(lèi)過(guò)的api collections
,可以批量運(yùn)行,檢查api是否運(yùn)行正常,具體不再說(shuō)明,看動(dòng)態(tài)圖: