BeanShell介紹
BeanShell是用Java寫成的,一個小型的、免費的、可以下載的、嵌入式的Java源代碼解釋器,具有對象腳本語言特性。本篇只記錄一下基本的使用。有以下五個組件:
- Beanshell Sampler
- Beanshell PreProcessor
- Beanshell PostProcessor
- Beanshell Assertion
- __Beanshell Function
常用變量
- vars:實際引用jmeter線程的局部變量,連通jmeter和beanshell
vars.get(String key) //獲取變量值
vars.put(String key, String value)//存儲value到變量key - log: 寫入信息到日志中,log.info("")
- prev: 獲取前一個sample的響應
getResponseDataAsString()
getResponseCode() - props: class java.util.Properties
變量屬性賦值給變量props.put("some_variable",vars.get("some_variable"))
Jmeter Log
-
Jmeter日志默認存放在%JMeter_HOME%\bin\JMeter.log, 腳本中使用log.info("日志")打印需要的日志信息
JMeter里面點擊右上角可打開日志窗口
-
Jmeter使用Log4j日志組件輸出日志,%JMETER_HOME%\bin\jmeter.properties\log_level.jmeter用於控制Jmeter日志記錄級別。可以設置以下日志級別:FATAL_ERROR, ERROR, WARN, INFO,DEBUG,其中FATAL_ERROR打印日志最少,DEBUG級別日志最詳細。
log_level.jmeter=INFO //INFO級別,只有等於及高於這個級別的才打印日志,如果配置為INFO只顯示INFO, WARN, ERROR的log信息,而DEBUG信息不會被顯示。 -
jmeter可以為不同的模塊設置不同的日志級別,如下:
Beanshell PreProcessor
預先處理,生成一段隨機字符串並賦值給變量,同個線程組內通過${變量名}讀取
import java.util.Random; String random_len(int length) { chars = "ABCDEFGHIJKLMNOPQRSTUVWXTZabcdefghiklmnopqrstuvwxyz"; int string_length = 8; randomstring =""; for (int i=0; i<string_length; i++) { Random randomGenerator = new Random(); int randomInt = randomGenerator.nextInt(chars.length()); randomstring += chars.substring(randomInt,randomInt+1); } return randomstring; } log.info(random_len(8)); log.info(random_len(16)); vars.put("random_8", random_len(8)); vars.put("random_16", random_len(16));
Beanshell Assertion
斷言結果字段是Failure=true/false; 運行結果需要打印出的信息寫在FailureMessage = "XXXX";
eg1. 斷言uid=預期的值
if(!"${uid}".equals("774170")) { Failure=true; FailureMessage = "error, check"; } else { FailureMessage = "ok!"; }
實例: 斷言返回的數據類型
先把用到的jar包org.json放在jmeter/lib文件下,並在測試計划中導入
思路
function(standardData,respData){
standardJson =getJson();
respJson = getJson(respData);
循環N次{
if(standardJson.getType == respJson.getType); //逐個判斷json的字段類型是否符合標准
}
Beanshell代碼
import org.json.JSONArray; import org.json.JSONObject; import java.util.Iterator; import java.util.Map; /** * Created by Susie on 2016/8/25. */ public static String equalsJson(JSONObject standardJson, JSONObject responseJson) {//輸入兩個json,判斷第一個里面的所有字段在第二個中的類型是否相同 String err_message = ""; Iterator it = standardJson.keys(); // 儲存所有要驗證的Key while (it.hasNext()) { String key = (String) it.next(); String thisKetType = standardJson.get(key).getClass().getName(); //獲取當前Key的標准type log.info("standard Key = " + key + ", Value = " + standardJson.get(key) + ", Type = " + thisKetType); if(responseJson.isNull(key)){ //判斷response中有無當前Key log1 = "------ExistError: " + key + " Not found."; log.info("!!Failed: " + log1); err_message = (err_message + "\n" + log1); } else{ //response中找到Key了,再判斷type String respKetType = responseJson.get(key).getClass().getName(); //獲取響應的字段類型 if(respKetType.equals(thisKetType)){ log.info("Passed."); if(thisKetType.equals("org.json.JSONObject")){ //object類型的字段繼續往內層判斷 err_message += equalsJson(standardJson.getJSONObject(key), responseJson.getJSONObject(key)); //!!進入遞歸時,保存當前錯誤信息 } } else { String log1 = "------TypeError : " + key + " is " + respKetType + " (should be " + thisKetType + ")"; log.info("!!Failed: " + log1); err_message = (err_message + "\n" + log1); } } } return err_message; } public static Boolean respTypeAssertion(String standardData) { //輸入標准響應,轉為json並調用比較函數,得到斷言結果 String resData = prev.getResponseDataAsString(); //獲取前一個請求的響應 log.info("res: " + resData); JSONObject standardJson = new JSONObject(standardData); JSONObject jo = new JSONObject(resData); JSONObject responseJson = jo.getJSONObject("data"); log.info("------------------------Beanshell assertion7-------------"); String message = equalsJson(standardJson, responseJson); log.info("------------------------ResultMessage--------------------" + message); if(message == ""){ //如果錯誤信息是空,說明斷言結果通過 FailureMessage = "Pass!"; return true; } else{ //有錯誤信息打印到斷言結果里面 Failure=true; FailureMessage = "Type Error!" + message; } return false; } //----------------------------------------------- String standardData = "{'uid':'123','phone':'13580478329','has_password':true,'location':{'province':true,'city':'\u6c55\u5934\u5e02'},'cpma':null}"; respTypeAssertion(standardData);
運行,查看結果
參考鏈接
Jmeter接口文檔:
https://jmeter.apache.org/api/org/apache/jmeter/samplers/SampleResult.html
Java數據類型:
http://webcache.googleusercontent.com/search?q=cache:SgdVfka7SZIJ:www.runoob.com/java/java-basic-datatypes.html+&cd=1&hl=zh-CN&ct=clnk&gl=ph
