在利用jmeter進行接口測試或者性能測試的時候,我們需要處理一些復雜的請求,此時就需要利用beanshell腳本了,BeanShell是一種完全符合Java語法規范的腳本語言,並且又擁有自己的一些語法和方法,所以它和java是可以無縫銜接的。beanshell由於內置了一些特有的變量,沒法在一些集成代碼工具上去調試。今天就和大家分享下常用的2個代碼例子,大家可以直接拿來稍微修改下就可以使用。
Bean Shell內置變量大全
首先大家需要掌握bean shell本身自帶的一些內置變量和一些方法。JMeter在其BeanShell中內置了變量,用戶是通過這些變量與JMeter進行交互。
1.log 打印日志,寫入信息到jmeber.log文件。
2.SampleResult 獲取SampleResult對象,能通過這個對象獲取想要的信息。
3.Response 獲取Response對象,能通過這個對象獲取響應信息。
4.Failure 查看接口調使用能否成功,假如返回false是成功的,true是失敗的。
5.FailureMessage 失敗信息,沒有設置的時候失敗信息是空的,能set這個信息。
6.ResponseData 獲取response body類型是byte[]。
7.ResponseCode 返回接口code成功是200。
8.ResponseMessage 獲取msg成功是OK。
9.ResponseHeaders 獲取接口服務端返回的頭部信息。
10.RequestHeaders 獲取用戶端請求的頭部信息。
11.SampleLabel 獲取接口請求的名稱。
12.SamplerData 獲取請求的url和body。
13.ctx 代表上下文信息,能直接用。
14.vars即JMeterVariables,操作jmeter變量,這個變量實際引用了JMeter線程中的局部變量容器(本質上是Map),常用方法:
a) vars.get(String key):從jmeter中獲得變量值;
b) vars.put(String key,String value):數據存到jmeter變量中;
15.prev 獲取前面的sample返回的信息,常用方法:
a) getResponseDataAsString():獲取響應信息。
b) getResponseCode() :獲取響應code。
1:Beanshell的基本語法
1.1:Beanshell的For循環與集合
String a = "aaa"; int b = 111; List list = new ArrayList(); //list集合只能保存String類型 list.add(a); list.add(b.toString()); //普通for循環的寫法 for(int i = 0; i<list.size();i++){ log.info(">>>>>>>>>>>"); log.info(list.get(i)); } //增強for循環的寫法 for(object : list){ log.info("=========="); log.info(object); }
1.2:Beanshell的數組的寫法
String[] str1 = new String[]{"aa","bb","cc"};//new一個String[]一維數組 String[][] str2 = new String[][]{{"AA","BB"},{"CC","DD"},{"EE","FF"}}; //遍歷str1這個一維數組 for(int i = 0; i< str1.length ; i++){ log.info(str1[i]); } //遍歷第二個二維數組 for (String[] strings : str2) { for(int i = 0; i< strings.length ; i++){ log.info(strings[i]); } }
1.3:Beanshell定義一個函數 並調用
//定義一個方法 public void addlist(List list){ list.add("aaa"); list.add("bbb"); list.add("ccc"); } List list = new ArrayList(); //調用方法 addlist(list); //遍歷list集合 for(int i = 0; i < list.size(); i++){ log.info(list.get(i)); }
2:Beanshell常用的內置對象
2.1:bsh.args對象獲取數組參數
2.2:vars內置對象的使用
A:示例定義一個用戶自定義變量
B:vars.get(String key)獲取String變量
vars.put(String key,Value)放置一個Map到vars
2.3:vars內置對象put和get Object對象
如果需要獲取或者放置非String類型數據 需要用putObject()和getObject()
//Beanshell vars.putObject() vars.getObject()的使用 List list = new ArrayList(); list.add("aaa"); list.add("bbb"); //putObject()可以在vars對象中放置Object類型對象 vars.putObject("list",list); //=========================== //獲取Object list對象 Object Value = vars.getObject("list"); //log.info只能輸出String類型變量 log.info(Value.toString());
3:Beanshell的常用內置對象-ctx
3.1:ctx內置對象getPreviousResult()方法 調用請求/響應數據
ctx內置對象來自於JMeterContext 查看Jmeter API發現有下列get方法可以獲取請求/響應數據
//SampleResult需要import對象 import org.apache.jmeter.samplers.SampleResult; SampleResult result = ctx.getPreviousResult(); //getRequestHeaders()方法返回String字符串 String RequestHeaders = result.getRequestHeaders(); //getResponseHeaders() 返回響應headers String ResponseHeaders = result.getResponseHeaders(); //getResponseCode() 返回響應狀態碼字符串 String responseCode = result.getResponseCode(); //getURL() 返回請求URL對象 URL url = result.getURL(); log.info(RequestHeaders); log.info(RequestHeaders);
4:prev內置對象
prev是Beanshell后置處理器的內置對象 相當於ctx.getPreviousResult();
5. 高級用法:假如我們希望線程之間共享一個變量,可以利用BeanShell來完成。
JMeter中線程間共享變量可以通過定義屬性值來完成,JMeter啟動時會讀取一些屬性文件,比如jmeter.properties、user.properties,這些屬性值是可以修改的,通過BeanShell可以對其進行更改。通過props.put()來修改屬性,props.get()來獲取屬性。
6. jmeter中,BeanShell的使用由以下場景:
前置處理器:BeanShell PreProcessor
取樣器 :BeanShell Sampler
后置處理器:BeanShell PostProcessor
Jmeter中包括多種BeanShell,用法差不多,只是作用的地方不同。
定時器: BeanShell Timer
前置處理器:BeanShell PreProcessor,提前處理請求參數,如:加密解密等
采樣器: BeanShell Sampler
后置處理器:BeanShell PostProcessor,在請求后對返回結果進行處理
斷言: BeanShell斷言,驗證返回結果的正確性
監聽器: BeanShell Listener
摘錄:https://blog.csdn.net/hujyhfwfh2/article/details/80862134