最近在用JMerter給公司一個項目做性能測試,期間遇到要提取上一個接口返回的數據作為下個接口的請求。這里做下記錄
如圖所示,需要將“掃描二維碼”接口請求的返回值中的data部分,作為“處理提交碼值”接口的參數傳遞給服務器。
首先我想到的是利用正則表達式,直接把整個data部分提取出來,
嗯,沒錯,是不是覺得一步就搞定了,還說個毛線。
但是.............
坑爹的是,服務端在接收data數據的時候,要對data數據做處理
首先,data以數組的形式傳參(有可能一次提交多個碼),
其次,data數組里邊嵌套字典的形式,但是我傳給服務端需要把""轉義。。。(這里真的想吐血,請教下各位大佬,這種情況服務端不能做處理嗎)
結果,要傳遞的值大概就是下面呈現的形式:(懵逼....)
所以,之前把整個data部分取出來的想法pass了。。。
好吧,我另辟蹊徑,想着把每個參數單獨取出來,下個接口在body里邊先把"做成\",先轉義,再把值引用進來(像是摳圖一樣的趕腳...)
說完就干,前面幾個參數取值都OK,沒什么難度,取boxList的時候有點犯難,這個參數前后一般都是","符號,沒有明顯的標志。
查了度娘,找了一種方法來取值:
把整個boxList全部取值(共6個),再用匹配數字去取第幾個值。
這里有個小插曲,開始以為可以用【模板】里邊的$1$這種去匹配表達式里邊的6個取值,后面接口再用boxList_1、boxList_2........boxList_6來引用。后面發現不行...
【模板】$1$$2$代表的是,正則表達式中有多個提取式(多個括號里邊的東東),第一個取值和第二個取值怎么組合形式
比如:正則表達式提取出來兩個值,一個是lixiaoming,一個是24,如果【模板】寫成$1$$2$,那么后面應用的時候,這個參數展現就是“lixiaoming24”(中間可以加其他連接符,有時候取多個值,再以某種形式組合成一個參數,這種可能會用到)
好,值取出來了。然后添加了6個正則提取器(請教大佬,這種后置處理器添加太多,對性能測試本身會有多大影響呢)
大致的形式就是這樣的:(....我也很無奈...)
后面接口,用boxList1....boxList6引用,OK,沒問題。
后面經理給我說有一個叫JSON Path Extractor的插件,用來提取服務器返回的json中的數據很好用。(what?!居然之前沒有使用過這等插件)
馬上相會度娘,找了幾篇測友發的經驗之談,哇靠,果真簡單粗暴....
馬上招來玩玩,啊呸,馬上學些學習~
下載了插件,然后學着寫提取表達式
data里邊的數據可以看做是字典里邊嵌套數組的形式,操作字典引用key,數組的話用索引去取值
於是表達式為:$.data.boxList[0]
另外,網上也找了另一種,data是數組里邊嵌套字典的,學習學習
提取id的表達式為:$.data[0].id
OK,新方法果然比正則表達式好用(自我覺得),而且也比較好理解
另外,在添加了正則表達式,JSON Path Extractor等提取器,想查看表達式寫的是否正確,提取的內容是否正確。"查看結果樹"可以做到
在結果樹中選擇“RegExp Tester”,輸入你寫的正則表達式,就能知道正則是否寫正確了。
同理,JSON Path Extractor一樣
OK,寫完了。這次還是有不少收獲,后面再對JMeter系統學習學習。
如果文中有些錯誤點,希望各位大佬及時指出,定虛心接受~