BeanShell是一個小型嵌入式Java源代碼解釋器,具備對象腳本語言特性,可以動態地執行標準JAVA語法,並利用在JavaScript和Perl中常見的的鬆散類型、命令、閉包等通用腳原本對其進行拓展。BeanShell不單單能夠經過運行其內部的腳原本處理Java應用程序,還能夠在運行過程當中動態執行你java應用程序執行java代碼。由於BeanShell是用java寫的,運行在同一個虛擬機的應用程序,所以能夠自由地引用對象腳本並返回結果。(摘抄自網絡) html
下載地址:https://beanshell.github.io/download.htmljava
測試python
其它方式啓動:先把jar包加入到環境變量git
第二個例子github
運行結果shell
若是jar包沒加到環境變量,能夠這樣運行:java -classpath %CLASSPATH%;bsh-2.0b4.jar bsh.Interpreter test.txtapache
print() 輸出內容到命令行中
source()讀一個bsh腳本到當前解釋器(interpreter)中,或者在新的解釋器中運行這個腳本json
而咱們的jmeter中,已經自帶了jar包,下面介紹jmeter中如何使用beanshell微信
引用變量網絡
發送請求,能夠看到密碼加密了
上面也能夠封裝爲函數
下面方法返回類型爲void
import org.apache.commons.codec.digest.DigestUtils; public static void fun(){ String password_md5 = DigestUtils.md5Hex("123456"); vars.put("password_md5", password_md5); } fun();
下面方法返回類型爲String
import org.apache.commons.codec.digest.DigestUtils; public static String fun(){ String password_md5 = DigestUtils.md5Hex("123456"); print(password_md5); // 在命令行窗口打印結果 return password_md5; } String password_md5 = fun(); vars.put("password_md5", password_md5);
也能夠寫成這樣(方法不寫返回類型)
import org.apache.commons.codec.digest.DigestUtils; fun(){ String password_md5 = DigestUtils.md5Hex("123456"); print(password_md5); // 在命令行窗口打印結果 return password_md5; } String password_md5 = fun(); vars.put("password_md5", password_md5);
甚至寫成這樣(定義的變量也沒類型)
import org.apache.commons.codec.digest.DigestUtils; fun(){ String password_md5_res = DigestUtils.md5Hex("123456"); print(password_md5_res); // 在命令行窗口打印結果 return password_md5_res; } password_md5 = fun(); vars.put("password_md5", password_md5);
可是仍是推薦按照java的方式寫,嚴格定義。
JMeter在它的BeanShell中內置了變量,用戶能夠經過這些變量與JMeter進行交互。
log vars prev Failure FailureMessage
具體用法請百度,本篇的示例中也有使用到。
Jmeter中包括多種BeanShell,用法差很少,只是做用的地方不一樣。
定時器: BeanShell Timer
前置處理器:BeanShell PreProcessor,提早處理請求參數,如:加密解密等
採樣器: BeanShell Sampler
後置處理器:BeanShell PostProcessor,在請求後對返回結果進行處理
斷言: BeanShell斷言,驗證返回結果的正確性
監聽器: BeanShell Listener
下面舉例幾個經常使用的。
引用變量
發送請求,能夠看到密碼加密了
pom依賴
<dependencies> <!-- https://mvnrepository.com/artifact/com.alibaba/fastjson --> <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.49</version> </dependency> </dependencies>
代碼及打的jar包
把jar包複製到jmeter的lib下ext中,重啓jmeter
添加用戶定義變量
請求
beanshell前置處理器,加密密碼
beanshell斷言
完整腳本
import com.uncleyong.JsonToJSONObject; import com.alibaba.fastjson.JSONObject; // 不能少,下面定義了JSONObject類型 print("===========開始執行=========="); String exp_result = vars.get("exp_result"); print("exp_result= " + exp_result); print("exp_result的類型:" + exp_result.getClass().toString()); // exp_result的類型:class java.lang.String //Integer.valueOf返回的是Integer對象,Integer.parseInt返回的是int Integer exp_result2 = Integer.valueOf(exp_result); print("exp_result2的類型:" + exp_result2.getClass().toString()); // exp_result2的類型:class java.lang.Integer String jsonString = prev.getResponseDataAsString(); print("獲取到的返回結果:" + jsonString); print("返回結果的類型:" + jsonString.getClass().toString()); // 返回結果的類型:class java.lang.String JSONObject responseJson = new JsonToJSONObject().JSONObjectUtil(jsonString); print("轉換後的返回結果:" + responseJson); print("轉換後的返回結果類型:" + responseJson.getClass()); // 轉換後的返回結果類型:class com.alibaba.fastjson.JSONObject String code = responseJson.getString("code"); print("code = " + code); print("code的類型:" + code.getClass()); // code的類型:class java.lang.String Integer code2 = responseJson.getInteger("code"); print("code2 = " + code2); print("code2的類型:" + code2.getClass()); // code2的類型:class java.lang.Integer //if (code.equals(exp_result)==false) { if (code2 != exp_result3) { print("--------進入if語句--------"); Failure = true; FailureMessage = "code與實際值不一致,指望值" + exp_result + ", 實際值" + code; } print("===========結束執行==========");
運行結果
《jmeter對接口測試入參進行MD5加密的5種方式》,詳見微信公衆號:全棧測試筆記
https://www.cnblogs.com/uncleyong/protected/p/9429752.html
《性能測試:jmeter中經過beanshell把關聯轉變成參數化》