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日志記錄級別??梢栽O置以下日志級別: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);
循環(huán)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類型的字段繼續(xù)往內層判斷
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

