官網: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
定時器: BeanShell Timer 可用來設置線程延遲間隔
前置處理器:BeanShell PreProcessor
採樣器: BeanShell Sampler
後置處理器:BeanShell PostProcessor
斷言: BeanShell斷言
監聽器: BeanShell Listener
這幾種在使用是時比較相似,只須要用一種重點練習用法就能夠。
BeanShell PreProcessor用法(對參數值加密處理返回結果)
經常使用內置變量
目錄
1、操做變量
2、操做屬性
3、自定義函數
4、引用外部java文件
5、引用外部class文件
6、引用外部Jar包
7、其它用法(接受參數, log等)
三、用法簡單總結
1)可以使用用戶自定義的變量,在simple中對其進行處理(諸如對其加密、類型轉換等),後續請求值使用這些變量與定義函數值;
2)能夠在simple中java直接自定義函數,對其一系列處理後,後續請求值使用這些變量與定義函數值;
案例一:使用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);
第一步:測試計劃添加自定義變量
第二步:添加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進行回寫響應數據。
紅色標註的爲入參。能夠直接用seling OK中間用空格分開,或用${}來引用。腳本中經過bsh.args來引用,bsh.args[0]表示取的第一個值。
能訪問的屬性與變量:
SampleResult:訪問對應的結果對象,能查詢與編輯其中的屬性。
ResponseCode:引用自行設置的返回碼。
ResponseMessage:設置響應消息內容。
IsSuccess:引用它來決定產生的事務是否成功。若是設置爲false那事務會失敗。那在結果樹與聚合報告中都會顯示失敗。
案例五:jmeter使用BeanShell Sampler測試本身寫的java接口(一)
案例:起多個本地線程jmeter beanshell使用說明