在利用jmeter進行接口測試或者性能測試的時候,咱們須要處理一些複雜的請求,此時就須要利用beanshell腳本了,BeanShell是一種徹底符合Java語法規範的腳本語言,而且又擁有本身的一些語法和方法,因此它和java是能夠無縫銜接的。beanshell因爲內置了一些特有的變量,無法在一些集成代碼工具上去調試。今天就和你們分享下經常使用的2個代碼例子,你們能夠直接拿來稍微修改下就能夠使用。
css
首先你們須要掌握bean shell自己自帶的一些內置變量和一些方法。JMeter在其BeanShell中內置了變量,用戶是經過這些變量與JMeter進行交互。 java
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。
在寫代碼的時候,能夠直接用上面的變量和方法,參考以下例子。
web
使用jmeter的bean shell preprocessor,調用本身寫的工具類,實現請求的處理。shell
步驟以下:apache
一、 用eclipse把本身寫的java代碼打包成jar。json
二、 把自定義的JAR包放入到jmeter的/lib/ext目錄下。app
三、 重啓jmeter,開始寫beanshell腳本。框架
具體代碼:eclipse
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調試完成後,最終須要注射掉,不然在真正壓測的時候會影響壓測客戶端的性能。ide
使用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()來獲取屬性。
beanshell是jmeter比較經常使用的腳本工具,更多其餘內容能夠參考更多測試好文章