Postman的強(qiáng)大之處在于其允許在對(duì)某一個(gè)request訪問的之前和之后分別運(yùn)行自定義的一段Javascript腳本溉浙,這樣直接就完成了一個(gè)
chain request
的效果,可以將數(shù)條request連結(jié)成一個(gè)流程完成一體化測(cè)試。這在很多的API操作中都是極其有用的,所以這里有必要總結(jié)一些常用語(yǔ)句。
Script workflow 腳本執(zhí)行流程
-
pre-request
腳本物邑,是在對(duì)API進(jìn)行請(qǐng)求之前的腳本,一般用于動(dòng)態(tài)生成參數(shù)滔金、JSON數(shù)據(jù)包色解、鏈接地址等。 -
test
腳本餐茵,其實(shí)更應(yīng)該叫post-request
科阎,實(shí)在完成API訪問并得到其response回應(yīng)之后運(yùn)行的腳本,一般用于獲取response的內(nèi)容忿族,用于之后對(duì)于別的資源的請(qǐng)求锣笨,如獲取頁(yè)面標(biāo)題和內(nèi)容等蝌矛。
Requirements 運(yùn)行腳本要求
需要注意悟耘,pre-request
腳本混卵,在里面直接寫代碼就可以了,但是test
腳本需要在某個(gè)指定的函數(shù)pm.test(...)
中執(zhí)行才會(huì)被識(shí)別先煎,且作為test
腳本運(yùn)行走趋。如下圖:
pm.test()
中第一個(gè)參數(shù)是測(cè)試描述(會(huì)在測(cè)試結(jié)果欄顯示衅金,應(yīng)和其它測(cè)試描述做以區(qū)分),第二個(gè)參數(shù)是一個(gè)函數(shù)簿煌,具體執(zhí)行代碼都在這個(gè)函數(shù)中運(yùn)行。另外鉴吹,
pm
對(duì)象是Postman的主要對(duì)象姨伟,所有的內(nèi)置函數(shù),數(shù)據(jù)調(diào)用等豆励,都需要通過(guò)它來(lái)實(shí)現(xiàn)夺荒。
Code Snippets 常用語(yǔ)句
一般會(huì)在腳本編寫欄的右邊都會(huì)有常用語(yǔ)句片段,點(diǎn)擊以下就會(huì)出來(lái)代碼良蒸,但是一開始不太了解的話點(diǎn)出來(lái)其實(shí)也看不懂技扼。如下圖:
官方文檔解釋的各種函數(shù)調(diào)用鏈接在這里:Postman Sandbox
以下是我自己總結(jié)的常用代碼片段:
// 獲取response返回內(nèi)容
var rsb = responseBody; // 是字符串格式
// 獲取環(huán)境變量
var v = pm.environment.get("變量名稱");
// 設(shè)置環(huán)境變量 只能存儲(chǔ)字符串,如果是對(duì)象的話則無(wú)法在下次運(yùn)行時(shí)獲取到內(nèi)容
// 如需要存儲(chǔ)JSON數(shù)據(jù)嫩痰,可以用JSON.stringify(..)存儲(chǔ)剿吻,再用JSON.parse(..)轉(zhuǎn)化為對(duì)象使用
pm.environment.set("變量名稱", 變量?jī)?nèi)容);
// 清除某個(gè)環(huán)境變量
pm.environment.unset("環(huán)境變量名");
// 獲取全局變量和普通變量
var gb = pm.globals.get("全局變量名");
var nm = pm.variables.get("普通變量名");
// Javascript 獲取變量類型
console.log( typeof pm.enviroment );
Pre-request Script 預(yù)處理腳本
Pre-request script
是在request之前準(zhǔn)備request信息用的腳本。
參考Postman官方:Pre-request scripts
常用的準(zhǔn)備工作有:
- 讀取環(huán)境變量串纺,再放到request body或headers中丽旅。
- 拼接組合提交request請(qǐng)求所需要的參數(shù),比如authentication code纺棺。
常用的語(yǔ)句如下:
// 獲取環(huán)境變量
var v = pm.environment.get("變量名稱");
// 設(shè)置環(huán)境變量 只能存儲(chǔ)字符串榄笙,如果是對(duì)象的話則無(wú)法在下次運(yùn)行時(shí)獲取到內(nèi)容
// 如需要存儲(chǔ)JSON數(shù)據(jù),可以用JSON.stringify(..)存儲(chǔ)祷蝌,再用JSON.parse(..)轉(zhuǎn)化為對(duì)象使用
pm.environment.set("變量名稱", 變量?jī)?nèi)容);
Test Script 測(cè)試腳本
測(cè)試腳本是在request之后茅撞,對(duì)Response的返回值進(jìn)行下一步處理的腳本。
參考Postman官方:Test scripts
參考Postman官方:Test examples
常用的處理有:
- 讀取response回復(fù)的數(shù)據(jù)巨朦,存為環(huán)境變量
- 根據(jù)response回復(fù)的狀態(tài)成功與否米丘,判斷下一步做什么
常用的語(yǔ)句如下:
// 獲取response headers中某一個(gè)值
ctype = postman.getResponseHeader("Content-Type");
// 獲取response body的全部?jī)?nèi)容
text = pm.response.text();
// 獲取response返回的全部JSON
json_data = pm.response.json();
// 獲取json中某一個(gè)值,比如name的值:
myName = json_data.name;
Test Result 測(cè)試結(jié)果
除了上面的具體功能代碼外罪郊,經(jīng)常還需要返回一個(gè)結(jié)果蠕蚜,告訴Postman這個(gè)測(cè)試結(jié)果是Pass還是Fail,默認(rèn)是pass悔橄。
這里返回值就不是簡(jiǎn)單的return語(yǔ)句可以靶累,必須要通過(guò)Postman自帶的對(duì)象或方法才可以腺毫,一般是通過(guò)pm.expect()
或tests[]
這兩個(gè)地方返回測(cè)試結(jié)果。
完整的測(cè)試示范:
// 測(cè)試response的狀態(tài)是否是200成功:
pm.test("Status code is 200", function () {
pm.response.to.have.status(200);
});
這些方法名看起來(lái)都很容易理解挣柬,一般都會(huì)叫pm.expect()
或.to.be()
或.to.have()
這樣的潮酒,字面意思就是期待什么或要求它必須是什么或必須有什么,才能通過(guò)測(cè)試邪蛔。
另外急黎,同樣的測(cè)試結(jié)果,實(shí)際上還有更簡(jiǎn)單的寫法侧到,即不通過(guò)pm
對(duì)象勃教,而是內(nèi)置tests
對(duì)象。
常用操作如下:
# 反應(yīng)時(shí)間必須少于200毫秒
tests["Response time is less than 200ms"] = responseTime < 200;
# 判斷反應(yīng)代號(hào)是否等于某一個(gè)指定的代號(hào)
tests["Status code name has string"] = responseCode.name.has("Created");
看這個(gè)用法匠抗,猜測(cè)tests
是一個(gè)JSON格式的對(duì)象故源,tests[...]
括號(hào)內(nèi)的字符串是測(cè)試的描述, =
后面是判斷語(yǔ)句汞贸,然后將True或False賦予為tests[..]
的值绳军,然后postman輪訓(xùn)所有tests
對(duì)象里的參數(shù),并返回pass與否的結(jié)果矢腻。
這里是官方總結(jié)的常用測(cè)試腳本方法:Test examples
以下是我總結(jié)的常用的返回測(cè)試結(jié)果的內(nèi)置函數(shù):
# “期待”返回結(jié)果必須包含某一段內(nèi)容
pm.expect(從response里獲取的字符串).to.include("必須包含的內(nèi)容");
# 返回body值必須完全等于某一段內(nèi)容
pm.response.to.have.body("必須等于的內(nèi)容");
# 反應(yīng)時(shí)間必須少于200毫秒
pm.expect(pm.response.responseTime).to.be.below(200);
# 必須返回某一個(gè)狀態(tài) 如"Created"
pm.response.to.have.status("狀態(tài)名");
Debugging 腳本調(diào)試
如果要看已經(jīng)設(shè)置的Enviroment變量的話门驾,可以點(diǎn)開右上方小眼睛看到,如下圖多柑,我設(shè)置了3個(gè)環(huán)境變量:
調(diào)試時(shí)要打印的話奶是,一般都是用console.log(...)
,這樣就能在console中看到:
- 如果你的Postman是Chrome app的話顷蟆,直接在chrome瀏覽器的開發(fā)者工具里調(diào)試就行诫隅。
-
如果是Mac等桌面軟件,則需要打開內(nèi)置的console才能看到調(diào)試信息帐偎。
位置在左下角逐纬,如下圖:
Postman Sandbox
Postman的Sandbox是Postman內(nèi)部默認(rèn)引入的第三方JS庫(kù)。
參考:Postman Sandbox 官方腳本可引用庫(kù)說(shuō)明
參考:Postman Sandbox API 官方引用的腳本庫(kù)詳解
Sandbox引用的第三方庫(kù)有:
生成MD5字符串:
var hashed = CryptoJS.MD5("待加密的字符串");
文件轉(zhuǎn)base64字符串:
s = 'Hello';
// 先轉(zhuǎn)化成UTF-8編碼的字符串
utf8 = CryptoJS.enc.Utf8.parse( s );
// 用CryptoJS第三方庫(kù)(Postman已經(jīng)內(nèi)置了)進(jìn)行編碼
b64 = CryptoJS.enc.Base64.stringify(utf8)
console.log(b64);
// aGVsbG8=
Postman SDK
不同于Sandbox削樊,這是Postman內(nèi)部較高級(jí)的SDK豁生,可以引用一些方便的方法。
參考官方網(wǎng)址:Tutorial: Postman SDK Concepts
URL轉(zhuǎn)換成JSON格式漫贞,并獲取指定的參數(shù)值:
var sdk = require('postman-collection');
query = ( new sdk.Url(callback) ).toJSON().query;
for (var i in query) {
console.log(query[i].key +": "+ query[i].value);
}