jmeter的beanshell腳本如何編寫,舉2個經常使用例子

在利用jmeter進行接口測試或者性能測試的時候,咱們須要處理一些複雜的請求,此時就須要利用beanshell腳本了,BeanShell是一種徹底符合Java語法規範的腳本語言,而且又擁有本身的一些語法和方法,因此它和java是能夠無縫銜接的。beanshell因爲內置了一些特有的變量,無法在一些集成代碼工具上去調試。今天就和你們分享下經常使用的2個代碼例子,你們能夠直接拿來稍微修改下就能夠使用。

css

Bean Shell內置變量大全

首先你們須要掌握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 獲取請求的urlbody

13.ctx 表明上下文信息,能直接用。

14.varsJMeterVariables,操做jmeter變量,這個變量實際引用了JMeter線程中的局部變量容器(本質上是Map),經常使用方法:

avars.get(String key):從jmeter中得到變量值;

bvars.put(String keyString value):數據存到jmeter變量中;

15.prev 獲取前面的sample返回的信息,經常使用方法:

agetResponseDataAsString():獲取響應信息。

bgetResponseCode() :獲取響應code


在寫代碼的時候,能夠直接用上面的變量和方法,參考以下例子。
web

例子1

使用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

例子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()來獲取屬性。

beanshell是jmeter比較經常使用的腳本工具,更多其餘內容能夠參考更多測試好文章

相關文章
相關標籤/搜索