1. 程式人生 > >最強PostMan使用教程(3)- script

最強PostMan使用教程(3)- script

之前都兩篇文章都是一年多之前的事情了。最開始的初衷是想把各種細節都寫了,中途因為忙其他事情,就忘記了,放棄了。但我這個部落格好像最火的就是這個系列,一直有人評論。針對問的最多的問題,我還是試著看看寫下一些東西,看看是否有用吧。。。

雖然postman一直也有在用,但用最簡單的方式構建request去測試介面已經滿足我日常工作的需求,就很少有動力再去仔細研究了。這兩天又看看官網,發現文件變得更全了,功能也變多了。時常有人私信我,問postman能否動態的定製化request的內容。首先,postman就是為custom request而生的,動態的定製化肯定是支援的,只是需要多點研究而已。這篇文章主要介紹postman裡面的scripts,搬磚之作,希望對您有幫助。

postman中的script

postman集成了一個強大的,基於nodejs的script引擎,藉助它,您可以為requests和collections新增動態的行為。
這樣就可以在編寫test suite時,構建可以包含動態引數的request,在request之間傳遞資料等等。您可以在流程中的兩個事件中新增要執行的JavaScript程式碼:
1. 在傳送request之前,編寫pre-request script,定製化request。
2. 收到response之後,用test script,處理返回的資料。

整個流大概是這樣的:
這裡寫圖片描述

Pre-request scripts

pre-request script就是一段在傳送request之前執行的程式碼。大家可以自己腦補在什麼場景可以用到它。比如,隨機的URL引數,變化的requst body等。
這裡要注意的是,pre-request script和test scripts一樣,都是javascript,同時,和angular js一樣,可以用兩個{{}}訪問環境變數。
還是趕緊來舉例吧。

遞增的url引數

最近一直在玩elasticsearch,就用elasticsearch的API來作為例子吧。我們通過GET API,可以獲取ES中的資料。我現在從tushare上把新華保險的日線資料匯出為json格式的檔案,儲存到ES當中。每條記錄都有一個id。通過postman單個呼叫介面,大概是這樣的:(截圖中的url應該是localhost:9200/xhbx/stock-record/_search?q=_id:707)
這裡寫圖片描述


但是如果我想通過run collections的方式,一次讀出100天的資料呢?那就是從712開始,每次request遞增1。查詢100次。
藉助於pre-request script我們可以很方便的實現這個需求。
首先,檢視當前的環境變數,點選右上角的眼睛圖示:
這裡寫圖片描述
你可以看到自定義的SampleHostGlobals

我們可以定一個global變數xhbxId,用於自增。點選上圖的Edit。或者點選眼睛圖示旁的齒輪圖示,新增一個global變數:
這裡寫圖片描述

然後,配置我們的request使用xhbxId。點選send,你會發現,能夠正確請求到id為707的資料:
這裡寫圖片描述

點選parameter下方的Pre-request scripts選項,編輯我們的指令碼:

var temp = parseInt(postman.getGlobalVariable("xhbxId"));
temp += 1;
postman.setGlobalVariable("xhbxId", temp);

指令碼的意思是給xhbxId自增1。前面已經說過,pre-request script會在request被髮送之前執行,所以,所以每次我們點選send,xhbxId都應該增加1。也就是下一次是708。
另外,這裡要注意的是,所有的環境變數或者global變數,都是以字串的形式儲存的,所以我們的自增操作需要先轉化為int。
執行結果如圖:
這裡寫圖片描述

變化的request body

很多人也問我,request body的問題。其實和url引數一樣,直接引用就是了。
保持我們之前的Pre-request scripts不變。把request的型別改成POST,編輯我們的request body,使用{{xhbxId}}的方式獲取引數。本次呼叫正確的遞增了Id為709。
這裡寫圖片描述

test script

接下來,通過test script測試結果。保持我們之前的Pre-request scripts不變。如果再按一次send,則返回的結果中,應該包含如下字串:
"_id":"710"
那麼,我們就應該在test script裡面,測試response裡面應該包含如上字串。test script和pre-request script是一樣的,所以我們可以很方便的使用xhbxId作為判斷的比較值。

var temp = postman.getGlobalVariable("xhbxId");
tests["Body matches string"] = responseBody.has("\"_id\":\""+temp+"\"");

具體操作如下圖:
這裡寫圖片描述

  • 選擇Tests
  • 讀出xhbxId
  • 放入response body: Contains strings的snippet
  • 執行之後,test的結果是OK的,1/1
  • 710被匹配上。

在test suite中執行

好了,準備好上面的條件,我們把test case儲存到collection當中(我新建了一個叫test_script的collections,不知道怎麼操作的話看我的教程2)。執行個100次。

這裡寫圖片描述

測試通過,介面沒問題。這時,運行了100次,global的xhbxId應該從710增加到810了。

這裡寫圖片描述

確實是這樣,postman正確執行。