jmeter學習記錄--04--Beanshell

1、什麼是Bean Shell

  • BeanShell是一種徹底符合Java語法規範的腳本語言,而且又擁有本身的一些語法和方法;BeanShell是一種鬆散類型的腳本語言(這點和JS相似);
  • BeanShell是用Java寫成的,一個小型的、免費的、能夠下載的、嵌入式的Java源代碼解釋器
  • BeanShell可以動態地執行標準JAVA語法,並利用在JavaScript和Perl中常見的的鬆散類型、命令、閉包等通用腳原本對其進行拓展。BeanShell不只僅能夠經過運行其內部的腳原本處理Java應用程序,還能夠在運行過程當中動態執行java應用程序執行java代碼。由於BeanShell是用java寫的,運行在同一個虛擬機的應用程序,所以能夠自由地引用對象腳本並返回結果。
  • BeanShell執行標準Java語句和表達式,另外包括一些腳本命令和語法。

官網:http://www.BeanShell.org/html

 

jmeter中,Beanshell使用與java請求的區別?java

要根據本身的使用場景來選擇適合本身的自定義腳本的方式。算法

BeanShell腳本編寫相似於Java腳本。它能夠獲取、修改系統定義或用戶定義的變量值,同時也能夠進行一些相應的測試數據處理工做(例如:前置處理器、後置處理器及響應斷言中均存在響應的BeanShell應用)。shell

使用建議  BeanShell是JMeter內置的功能,可是因爲它是腳本語言,動態加載執行的,所以效率不是很高,不太適合於在常常執行的場景下,好比將BeanShell放在循環內部,不斷地被執行。比較適合的應用場景是放在執行一次、或者少數幾回的地方,好比在循環外部讀取配置文件內容等。  數據庫

Java擴展JMeter的實現方式的效率比較高,適合於放在常常執行的測試步驟中,可是因爲它不是JMeter內置的功能,擴展起來須要有些工做量,並且部署的時候也比較麻煩(分佈式運行的時候須要將自定義的JAR拷貝至全部的機器上)。apache

 

從java請求與beanshell請求的原理來考慮:閉包

一、好比測試java接口,確不想繼承AbstractJavaSamplerClient,能夠考慮用beanshell請求來完成。app

二、對數據進行參數化時,好比要對字符串進行加密操做、拼成unique類型的ID、定製時間類型等等,能夠用beanShell來完成。分佈式

三、線程之間想共享一個變量,能夠用beanShell實現。ide

 

 

2、Jmeter有哪些Bean Shell

  • 定時器:  BeanShell Timer  可用來設置線程延遲間隔

  • 前置處理器:BeanShell PreProcessor

  • 採樣器:  BeanShell Sampler

  • 後置處理器:BeanShell PostProcessor

  • 斷言:   BeanShell斷言

  • 監聽器:  BeanShell Listener

這幾種在使用是時比較相似,只須要用一種重點練習用法就能夠。

 

3、用法

一、Jmeter之Bean shell使用(一)

BeanShell PreProcessor用法(對參數值加密處理返回結果)

經常使用內置變量

二、Jmeter之Bean shell使用(二)

目錄

1、操做變量

2、操做屬性 

3、自定義函數

4、引用外部java文件

5、引用外部class文件

6、引用外部Jar包

7、其它用法(接受參數, log等)

三、用法簡單總結

   1)可以使用用戶自定義的變量,在simple中對其進行處理(諸如對其加密、類型轉換等),後續請求值使用這些變量與定義函數值;

   2)能夠在simple中java直接自定義函數,對其一系列處理後,後續請求值使用這些變量與定義函數值;

 

 

 

4、使用案例

案例一:使用Jmeter的BeanShell斷言,把響應數據中的JSON跟數據庫中的記錄對比

案例二:jmeter beanShell 修改http請求參數

案例三:JMeter - BeanShellSampler實現本地AES加密Jmeter接口測試加解密及Bean Shell使用案例

md5加密

import org.apache.commons.codec.digest.DigestUtils;    //導入md5加密的包
String str = "1234567";  //要加密的字符串  
String md5_after = DigestUtils.md5Hex(str);   // md5加密
vars.put("md5_upper",sign.toUpperCase());   //把加密的結果轉成大寫的,存到md5_upper這個變量裏面,參數化的時候直接用${md5_upper}取值就ok了
vars.put("md5_lower",sign.toLowerCase());   //把加密的結果轉成小寫的,存到md5_lower這個變量裏面,參數化的時候直接用${md5_lower}取值就ok了
vars.put("befor_md5",str);  //這個是 加密以前的字符串,在beanshell裏面定義的變量參數化的時候不能直接使用,須要用vars.put方法才能夠用

若是用到簽名算法時,可參考:大衆點評API

簽名算法相似以下: 
1. 對除appkey之外的全部請求參數進行字典升序排列; 
2. 將以上排序後的參數表進行字符串鏈接,如key1value1key2value2key3value3...keyNvalueN; 
3. 將app key做爲前綴,將app secret做爲後綴,對該字符串進行SHA-1計算,並轉換成16進制編碼; 

import org.apache.commons.codec.digest.DigestUtils;  
  
import java.util.Map;
import java.util.HashMap;
import java.util.Map.Entry;


// 定義Secret  
String secret = "test";  
  
// 建立參數表  
//Map<String, String> paramMap = new HashMap<String, String>();  
Map paramMap = new HashMap();
paramMap.put("mobileNumber", "${mobileNumber}");  
paramMap.put("loginPword", "test123456");  
paramMap.put("time", "${__time(/1000,)}");  
paramMap.put("geetest_challenge", "");  
paramMap.put("geetest_seccode", "");  
paramMap.put("geetest_validate", "");  
  
// 對參數名進行字典排序  
String[] keyArray = paramMap.keySet().toArray(new String[0]);  
Arrays.sort(keyArray);  
  
// 拼接有序的參數名-值串  
StringBuilder stringBuilder = new StringBuilder();  
for (String key : keyArray)  
{  
    stringBuilder.append(key).append(paramMap.get(key));  
}  
  
stringBuilder.append(secret);  
String s = stringBuilder.toString();  

// md5加密
String sign = DigestUtils.md5Hex(s);   
vars.put("sign",sign);
View Code

 

案例四:jmeter之BeanShell Sampler

第一步:測試計劃添加自定義變量

第二步:添加beanshell請求,處理

第三步:查看結果樹,查看結果

 

result = "\n1:"+bsh.args[0]+"\n"; //1:從參數框中獲取參數變量,不適用
result+="2:${testBeanshell}\n";  //2:直接獲取變量,操做方便,很是適用
result+="3:"+vars.get("testBeanshell"); //3:從vars內置變量中獲取變量,適用
vars.put("testBeanshell","beanshell_change");//改變變量值
result+="\n4:${testBeanshell}";//4:直接獲取不生效,由於jmeter尚未對其進行復制
result+="\n5:"+vars.get("testBeanshell");//:5:值改變,容易理解

ResponseCode = 500;//回寫請求響應代碼,借鑑的http響應碼
ResponseMessage = "test ok!!";//回寫響應信息
IsSuccess = true;//回寫響應結果

log.info("\nlog test:"+result);//調用jmeter內置log對象,日誌會打印到jmeter.log中
SampleResult.setResponseData("SampleResult:"+result+"\n");//回寫響應數據,SampleResult爲jmeter內置回寫結果對象,有不少可用方法,能夠參看源碼
return "return:"+result;//這裏的返回值,至關於調用SampleResult.setResponseData()方法,注意使用的return關鍵字,後面的行都不會執行,且SampleResult.setResponseData("SampleResult:"+result+"\n");也不會執行,這裏會被return的結果覆蓋。可是用SampleResult.setResponseData()方法回寫,後續還能夠接代碼行,所以建議不用return進行回寫響應數據。
View Code

紅色標註的爲入參。能夠直接用seling OK中間用空格分開,或用${}來引用。腳本中經過bsh.args來引用,bsh.args[0]表示取的第一個值。

能訪問的屬性與變量:

SampleResult:訪問對應的結果對象,能查詢與編輯其中的屬性。

ResponseCode:引用自行設置的返回碼。

ResponseMessage:設置響應消息內容。

IsSuccess:引用它來決定產生的事務是否成功。若是設置爲false那事務會失敗。那在結果樹與聚合報告中都會顯示失敗。

 

案例五:jmeter使用BeanShell Sampler測試本身寫的java接口(一)

案例:起多個本地線程jmeter beanshell使用說明

案例:JMeter BeanShell 應用

案例:jmeter之編寫java請求一beashell調用java代碼(上篇)(推

相關文章
相關標籤/搜索