之前都兩篇文章都是一年多之前的事情了。最開始的初衷是想把各種細(xì)節(jié)都寫了巷屿,中途因?yàn)槊ζ渌虑橛鹱剩屯浟巳砻猓艞壛恕5疫@個(gè)博客好像最火的就是這個(gè)系列爽冕,一直有人評(píng)論拭卿。針對(duì)問的最多的問題,我還是試著看看寫下一些東西幢竹,看看是否有用吧。恩静。焕毫。
雖然postman一直也有在用,但用最簡單的方式構(gòu)建request去測(cè)試接口已經(jīng)滿足我日常工作的需求驶乾,就很少有動(dòng)力再去仔細(xì)研究了咬荷。這兩天又看看官網(wǎng),發(fā)現(xiàn)文檔變得更全了轻掩,功能也變多了。時(shí)常有人私信我懦底,問postman能否動(dòng)態(tài)的定制化request的內(nèi)容唇牧。首先,postman就是為custom request而生的聚唐,動(dòng)態(tài)的定制化肯定是支持的丐重,只是需要多點(diǎn)研究而已。這篇文章主要介紹postman里面的scripts杆查,搬磚之作扮惦,希望對(duì)您有幫助。
postman集成了一個(gè)強(qiáng)大的亲桦,基于nodejs的script引擎崖蜜,借助它,您可以為requests和collections添加動(dòng)態(tài)的行為客峭。
這樣就可以在編寫test suite時(shí)豫领,構(gòu)建可以包含動(dòng)態(tài)參數(shù)的request,在request之間傳遞數(shù)據(jù)等等舔琅。您可以在流程中的兩個(gè)事件中添加要執(zhí)行的JavaScript代碼:
1. 在發(fā)送request之前等恐,編寫pre-request script,定制化request。
2. 收到response之后课蔬,用test script囱稽,處理返回的數(shù)據(jù)。
整個(gè)流大概是這樣的:
pre-request script就是一段在發(fā)送request之前執(zhí)行的代碼二跋。大家可以自己腦補(bǔ)在什么場(chǎng)景可以用到它战惊。比如,隨機(jī)的URL參數(shù)同欠,變化的requst body等样傍。
這里要注意的是,pre-request script和test scripts一樣铺遂,都是javascript衫哥,同時(shí),和angular js一樣襟锐,可以用兩個(gè){{}}訪問環(huán)境變量撤逢。
還是趕緊來舉例吧。
最近一直在玩elasticsearch粮坞,就用elasticsearch的API來作為例子吧蚊荣。我們通過GET API,可以獲取ES中的數(shù)據(jù)莫杈。我現(xiàn)在從tushare上把新華保險(xiǎn)的日線數(shù)據(jù)導(dǎo)出為json格式的文件互例,存儲(chǔ)到ES當(dāng)中。每條記錄都有一個(gè)id筝闹。通過postman單個(gè)調(diào)用接口媳叨,大概是這樣的:(截圖中的url應(yīng)該是localhost:9200/xhbx/stock-record/_search?q=_id:707)
但是如果我想通過run collections的方式,一次讀出100天的數(shù)據(jù)呢关顷?那就是從712開始糊秆,每次request遞增1。查詢100次议双。
借助于pre-request script我們可以很方便的實(shí)現(xiàn)這個(gè)需求痘番。
首先,查看當(dāng)前的環(huán)境變量平痰,點(diǎn)擊右上角的眼睛圖標(biāo):
你可以看到自定義的SampleHost和Globals汞舱。
我們可以定一個(gè)global變量xhbxId,用于自增宗雇。點(diǎn)擊上圖的Edit兵拢。或者點(diǎn)擊眼睛圖標(biāo)旁的齒輪圖標(biāo)逾礁,添加一個(gè)global變量:
然后说铃,配置我們的request使用xhbxId访惜。點(diǎn)擊send,你會(huì)發(fā)現(xiàn)腻扇,能夠正確請(qǐng)求到id為707的數(shù)據(jù):
點(diǎn)擊parameter下方的Pre-request scripts選項(xiàng)债热,編輯我們的腳本:
var temp =parseInt(postman.getGlobalVariable("xhbxId"));
temp +=1;
postman.setGlobalVariable("xhbxId", temp);
腳本的意思是給xhbxId自增1。前面已經(jīng)說過幼苛,pre-request script會(huì)在request被發(fā)送之前運(yùn)行窒篱,所以,所以每次我們點(diǎn)擊send舶沿,xhbxId都應(yīng)該增加1墙杯。也就是下一次是708。
另外括荡,這里要注意的是高镐,所有的環(huán)境變量或者global變量,都是以字符串的形式存儲(chǔ)的畸冲,所以我們的自增操作需要先轉(zhuǎn)化為int嫉髓。
運(yùn)行結(jié)果如圖:
很多人也問我,request body的問題邑闲。其實(shí)和url參數(shù)一樣算行,直接引用就是了。
保持我們之前的Pre-request scripts不變苫耸。把request的類型改成POST州邢,編輯我們的request body,使用{{xhbxId}}的方式獲取參數(shù)褪子。本次調(diào)用正確的遞增了Id為709量淌。
接下來,通過test script測(cè)試結(jié)果褐筛。保持我們之前的Pre-request scripts不變。如果再按一次send叙身,則返回的結(jié)果中渔扎,應(yīng)該包含如下字符串:
"_id":"710"
那么,我們就應(yīng)該在test script里面信轿,測(cè)試response里面應(yīng)該包含如上字符串晃痴。test script和pre-request script是一樣的,所以我們可以很方便的使用xhbxId作為判斷的比較值财忽。
vartemp = postman.getGlobalVariable("xhbxId");
tests["Body matches string"] = responseBody.has("\"_id\":\""+temp+"\"");
1
2
具體操作如下圖:
選擇Tests
讀出xhbxId
放入response body: Contains strings的snippet
運(yùn)行之后倘核,test的結(jié)果是OK的,1/1
710被匹配上即彪。
好了紧唱,準(zhǔn)備好上面的條件活尊,我們把test case保存到collection當(dāng)中(我新建了一個(gè)叫test_script的collections,不知道怎么操作的話看我的教程2)漏益。運(yùn)行個(gè)100次蛹锰。
測(cè)試通過,接口沒問題绰疤。這時(shí)铜犬,運(yùn)行了100次,global的xhbxId應(yīng)該從710增加到810了轻庆。
確實(shí)是這樣癣猾,postman正確運(yùn)行。