一、背景
我們使用Jmeter做壓力測試或者接口測試時,除了最簡單的直接對接口發起請求,很多時候需要對接口進行一些前置操作:比如提前生成測試數據,以及一些后置操作:比如提取接口響應內容中的某個字段的值。舉個最常用的例子:
會員注冊接口:需要使用電話號碼作為入參,電話號碼不能重復,注冊接口需要添加前置操作生成不重復的電話號碼。
注冊成功后:需要從接口返回的內容中,提取注冊生成的用戶ID的值,作為后續其他接口操作的入參。
要實現以上的需求,有多種方式,比如:
函數助手生成隨機數;
手動在excel表中準備好足夠多的號碼,通過添加配置元件CSV data set config來獲取(不推薦);
正則表達式提取值;
通過BeanShell編碼實現;
本文主要給大家講解如何通過BeanShell編碼實現,該方法可擴展性強。掌握之后,你會發現很多場景都可以通過編寫相應的編碼來實現,一通百通。
二、BeanShell生成不重復的電話號碼
Sampler前面加一個前置處理器BeanShellPreProcessor:
BeanShell PreProcessor的內容為:
代碼內容:
//獲取指定范圍111-199間的隨機數作為電話號碼的前綴
long phoneTitle=${__Random(111,199,)};
String phoneTitleValue=phoneTitle.toString();
log.info(phoneTitleValue.toString());//當前時間戳,比如:1649038001761,除100000,得到一個8位的時間戳數字。
long num1 = ${__time(/100000,)};
log.info(num1.toString());
//取1個[1,100000]的隨機數字,有極低的概率重復
long num2 = ${__Random(1,100000,)};
log.info(num2.toString());
//num1+num2生成1個新的8位的數值
long num = num1+num2;//通過時間戳值的變化+隨機數字生成新的隨機值、前面再拼接隨機的電話號碼前綴
//生成一個不會重復的電話號碼
String phoneValue=phoneTitleValue+num.toString();
//存為變量phone,供后面的接口使用
vars.put("phone",phoneValue);
每一行我都加了相應的注釋,方便理解該行代碼的作用,應該已經非常好理解了。
接口請求中使用定義好的變量phone:
查看接口效果:
三、BeanShell 從響應結果中提取內容
先在接口Sampler上右鍵,添加后置處理器BeanShell Post Processor:
假設接口返回內容為:
{“code”:“0000”,“msg”:“”,“data”:{“userId”:111111,“phone”:“12011111111”,“cardNo”:“8000000000”}}?
{"code":"0000","msg":"","data":{"userId":111111,"phone":"12011111111","cardNo":"8000000000"}
}
BeanShell Post Processor腳本代碼內容:
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;//獲取響應內容
vars.put("reponseContent",prev.getResponseDataAsString());
//獲取響應code
vars.put("reponseCode",prev.getResponseCode());//獲取響應內容,String類型存儲
String resjson=prev.getResponseDataAsString();
log.info(resjson);
//轉為Json對象
JSONObject jso=JSONObject.parseObject(resjson);
//從對象中獲取code的值
String codeValue=jso.getString("code");
log.info(codeValue);
//從對象中獲取子的Json對象data
JSONObject data=jso.getJSONObject("data");
log.info(data.toString());
//獲取子的Json對象data中的userId的值
String useridValue=data.getString("userId");
log.info(useridValue);
//將獲取到的userId的值存為變量userid,供后面的接口使用
vars.put("userid",useridValue);
每一行我都加了相應的注釋,方便理解該行代碼的作用,應該已經非常好理解了。
運行請求,Jmeter運行日志中可以看到各個值都成功獲取到了:
后面的接口使用BeanShell Post Processor腳本中定義好的變量userid:
總結:BeanShell代碼和Java代碼非常相似,有Java編程基礎的同學可以快速的上手,通過編碼的方式可以很好的擴展我們需要的功能,也是Jmeter進階使用的必學必會知識之一 ~
最后感謝每一個認真閱讀我文章的人,禮尚往來總是要有的,雖然不是什么很值錢的東西,如果你用得到的話可以直接拿走:【文末領取】
? ? ?【下面是我整理的2023年最全的軟件測試工程師學習知識架構體系圖+全套資料】
一、Python編程入門到精通
二、接口自動化項目實戰??
三、Web自動化項目實戰

四、App自動化項目實戰??
五、一線大廠簡歷

六、測試開發DevOps體系??
七、常用自動化測試工具
八、JMeter性能測試??
九、軟件測試全套資料
十、總結(文末尾部小驚喜)
生命不息,奮斗不止。每一份努力都不會被辜負,只要堅持不懈,終究會有回報。珍惜時間,追求夢想。不忘初心,砥礪前行。你的未來,由你掌握!
生命短暫,時間寶貴,我們無法預知未來會發生什么,但我們可以掌握當下。珍惜每一天,努力奮斗,讓自己變得更加強大和優秀。堅定信念,執著追求,成功終將屬于你!
只有不斷地挑戰自己,才能不斷地超越自己。堅持追求夢想,勇敢前行,你就會發現奮斗的過程是如此美好而值得。相信自己,你一定可以做到!???