? Postman Script 腳本語(yǔ)法總結(jié)

Postman的強(qiáng)大之處在于其允許在對(duì)某一個(gè)request訪問的之前和之后分別運(yùn)行自定義的一段Javascript腳本溉浙,這樣直接就完成了一個(gè)chain request的效果,可以將數(shù)條request連結(jié)成一個(gè)流程完成一體化測(cè)試。這在很多的API操作中都是極其有用的,所以這里有必要總結(jié)一些常用語(yǔ)句。

參考Postman官方:Intro to scripts

Script workflow 腳本執(zhí)行流程

image
image
  • 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)行走趋。如下圖:

image
image

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í)也看不懂技扼。如下圖:


image
image

官方文檔解釋的各種函數(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)名");

image
image

Debugging 腳本調(diào)試

如果要看已經(jīng)設(shè)置的Enviroment變量的話门驾,可以點(diǎn)開右上方小眼睛看到,如下圖多柑,我設(shè)置了3個(gè)環(huán)境變量:


image
image

調(diào)試時(shí)要打印的話奶是,一般都是用console.log(...),這樣就能在console中看到:

  • 如果你的Postman是Chrome app的話顷蟆,直接在chrome瀏覽器的開發(fā)者工具里調(diào)試就行诫隅。
  • 如果是Mac等桌面軟件,則需要打開內(nèi)置的console才能看到調(diào)試信息帐偎。
    位置在左下角逐纬,如下圖:


    image
    image

Postman Sandbox

Postman的Sandbox是Postman內(nèi)部默認(rèn)引入的第三方JS庫(kù)。

參考:Postman Sandbox 官方腳本可引用庫(kù)說(shuō)明
參考:Postman Sandbox API 官方引用的腳本庫(kù)詳解

Sandbox引用的第三方庫(kù)有:

image
image

生成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);
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末甸箱,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子迅脐,更是在濱河造成了極大的恐慌芍殖,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,080評(píng)論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件谴蔑,死亡現(xiàn)場(chǎng)離奇詭異豌骏,居然都是意外死亡龟梦,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,422評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門窃躲,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)计贰,“玉大人,你說(shuō)我怎么就攤上這事蒂窒≡甑梗” “怎么了?”我有些...
    開封第一講書人閱讀 157,630評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵洒琢,是天一觀的道長(zhǎng)秧秉。 經(jīng)常有香客問我,道長(zhǎng)衰抑,這世上最難降的妖魔是什么福贞? 我笑而不...
    開封第一講書人閱讀 56,554評(píng)論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮停士,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘完丽。我一直安慰自己恋技,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,662評(píng)論 6 386
  • 文/花漫 我一把揭開白布逻族。 她就那樣靜靜地躺著蜻底,像睡著了一般。 火紅的嫁衣襯著肌膚如雪聘鳞。 梳的紋絲不亂的頭發(fā)上薄辅,一...
    開封第一講書人閱讀 49,856評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音抠璃,去河邊找鬼站楚。 笑死,一個(gè)胖子當(dāng)著我的面吹牛搏嗡,可吹牛的內(nèi)容都是我干的窿春。 我是一名探鬼主播,決...
    沈念sama閱讀 39,014評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼采盒,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼旧乞!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起磅氨,我...
    開封第一講書人閱讀 37,752評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤尺栖,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后烦租,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體延赌,經(jīng)...
    沈念sama閱讀 44,212評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡除盏,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,541評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了皮胡。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片痴颊。...
    茶點(diǎn)故事閱讀 38,687評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖屡贺,靈堂內(nèi)的尸體忽然破棺而出蠢棱,到底是詐尸還是另有隱情,我是刑警寧澤甩栈,帶...
    沈念sama閱讀 34,347評(píng)論 4 331
  • 正文 年R本政府宣布泻仙,位于F島的核電站,受9級(jí)特大地震影響量没,放射性物質(zhì)發(fā)生泄漏玉转。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,973評(píng)論 3 315
  • 文/蒙蒙 一殴蹄、第九天 我趴在偏房一處隱蔽的房頂上張望究抓。 院中可真熱鬧,春花似錦袭灯、人聲如沸刺下。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,777評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)橘茉。三九已至,卻和暖如春姨丈,著一層夾襖步出監(jiān)牢的瞬間畅卓,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,006評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工蟋恬, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留翁潘,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,406評(píng)論 2 360
  • 正文 我出身青樓筋现,卻偏偏與公主長(zhǎng)得像唐础,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子矾飞,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,576評(píng)論 2 349

推薦閱讀更多精彩內(nèi)容