jmeter的beanshell腳本如何編寫,舉2個常用例子
轉自https://blog.51cto.com/14010723/2298911
在利用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
使用jmeter的bean shell preprocessor,調用自己寫的工具類,實現請求的處理。
步驟如下:
1、 用eclipse把自己寫的java代碼打包成jar。
2、 把自定義的JAR包放入到jmeter的/lib/ext目錄下。
3、 重啓jmeter,開始寫beanshell腳本。
具體代碼:
import net.sf.json.JSONObject;
import ht.test.PluginTest.*;
//請求體,mac做了參數化
String body1 = "{\"ID\":123456,\"RPCMethod\":\"BootInitiation\",\"PROTVersion\":\"1.0.0\",\"MAC\":\"${MAC}\"}";
int bodylenth1 = body1.length();
byte[] lenBytePrefix1 = utils.getBytesOfBig(bodylenth1);
//System.out.println(utils.bytesToHexString(lenBytePrefix2));
//System.out.println(utils.bytesToHexString(body2.getBytes()));
String postdata2 = utils.bytesToHexString(lenBytePrefix1) +
utils.bytesToHexString(body1.getBytes());
String postdata3 = postdata2.replaceAll(" ", "");
//System.out.println("binary data is :" + postdata3);
vars.put("postrequest",postdata3);
//System.out.println(vars.get("postrequest"));
注意:在用system.out.println調試完成後,最終需要注射掉,否則在真正壓測的時候會影響壓測客戶端的性能。
例子2
使用beanshell的assertion斷言,完成一些響應結果判斷的的操作。
一個比較完整的代碼框架如下,大家依葫蘆畫瓢就行了。
import org.apache.jmeter.assertions;
import org.apache.jmeter.samplers.SampleResult;
import org.apache.jmeter.assertions.AssertionResult;
import org.json.*;
String response_data = prev.getResponseDataAsString();//獲取接口返回的response數據
JSONObject data_obj = new JSONObject(response_data);//轉換成json
//判斷code是否等於0 如果等於0 再取裏面的字段
String code = data_obj.get(“code”);
if(code.equals(“0”))
{
String user_name = data_obj.get(“data”).get(“user”).get(“userName”).toString();
//這裏的my_name 是用戶自定義的變量或者之前的接口返回獲取的
if(user_name.equals(${my_name})){
Failure = false; //設置成false 表示接口跑成功,在結果樹中sample是綠色的
//做後續動作
…….
}
else{
//做其他動作
}
}
else
{
Failure = true;//直接判斷失敗,表示接口跑失敗,在結果樹中sample是紅色的
prev.setStopThread(true);//如果斷言失敗,後面的接口不需要再跑,直接暫停
}
技巧
高級用法:假如我們希望線程之間共享一個變量,可以利用BeanShell來完成。
JMeter中線程間共享變量可以通過定義屬性值來完成,JMeter啓動時會讀取一些屬性文件,比如jmeter.properties、user.properties,這些屬性值是可以修改的,通過BeanShell可以對其進行更改。通過props.put()來修改屬性,props.get()來獲取屬性。