jmeter內置變量大全

 

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 獲取請求的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

 

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

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章