beanshell断言_JMeter使用BeanShell断言
BeanShell簡介
BeanShell是使用Java語法的一套腳本語言,在JMeter的多種組件中都有BeanShell的身影,如:
定時器:BeanShell Timer
前置處理器:BeanShell PreProcessor
采樣器:BeanShell Sampler
后置處理器:BeanShell PostProcessor
斷言:BeanShell Assert
監(jiān)聽器:BeanShell Listener
通過BeanShell可以對請求數(shù)據(jù)、響應(yīng)數(shù)據(jù)或環(huán)境變量進(jìn)行更加靈活的處理和判斷。
Beanshell有一些默認(rèn)的內(nèi)置變量和方法,用戶可以通過這些變量與JMeter進(jìn)行交互,比如:
prInt:非GUI模式下打印信息(輸出信息到stdout)
log:輸出信息到日志(文件)
log.debu("調(diào)試信息")
log.info("響應(yīng)狀態(tài)碼" + ResponseCode)
log.warn("警告信息")
log.error("出錯信息")
ResponseCode:響應(yīng)狀態(tài)碼(String類型)
ResponseHeaders:響應(yīng)頭(String類型)
prev:獲取當(dāng)前請求結(jié)果
prew.getResponseDataAsString():獲取響應(yīng)體數(shù)據(jù)(String類型)
prew.getResponseCode():獲取狀態(tài)碼(同ResponseCode,String類型)
vars: 操作jmeter變量
String var1 = vars.get("變量名"):獲取變量的值(假設(shè)為String類型)
vars.put("變量名", 變量值):設(shè)置變量值
props: 操作JMeter屬性
props.get(String,String) 可以獲取Jmeter中已經(jīng)生成的屬性
props.put(String,String) 可以創(chuàng)建和更新Jmeter屬性
ctx:獲取當(dāng)前線程上下文數(shù)據(jù)(可獲取所有信息)
ctx.getVariables("變量名"):獲取變量值(同vars.get())
ctx.setVariables("變量名", "變量值"):設(shè)置變量(同vars.put())
ctx.getProperties("屬性名"):獲取屬性值(同props.get())
ctx.setProperties("屬性名","屬性值"):設(shè)置屬性(同props.put())
ctx.getPreviousResult():獲取當(dāng)前請求結(jié)果同(prev)
ctx.getCurrentSampler():獲取當(dāng)前采樣器
ctx.getPreviousSampler():獲取前一采樣器
ctx.getThreadNum():獲取線程數(shù)
ctx.getThreadGroup():獲取線程組
ctx. getThread():獲取當(dāng)前線程
ctx.getEngine():獲取引擎
ctx.isSamplingStarted():判斷采樣器是否啟動
ctx.isRecording():判斷是否開啟錄制
ctx.getSamplerContext():獲取采樣器山下文數(shù)據(jù)
ctx詳細(xì)API可參考:JMeter上下文
BeanShell斷言
BeanShell斷言中可以通過ResponseCode、ResponseHeaders及pre.getResponseDataAsString()來分別獲得String格式的響應(yīng)狀態(tài)碼、響應(yīng)頭、響應(yīng)體數(shù)據(jù),結(jié)合if判斷通過變量Failure=false或Failure=true來設(shè)置斷言是否通過,當(dāng)設(shè)置Failure=true時,還可以設(shè)置FailureMessage來設(shè)置失敗原因。
狀態(tài)碼斷言
//狀態(tài)碼斷言
log.info("狀態(tài)碼:" + ResponseCode);
if(ResponseCode.equals("200")){
Failure=false;
}
else{
Failure=true;
FailureMessage="響應(yīng)狀態(tài)碼非200"; //指定失敗原因
}
注:字符串只能使用雙引號,字符串相等要使用"".equals("")
響應(yīng)體包含特定字符
//獲取響應(yīng)數(shù)據(jù)
String response = prev.getResponseDataAsString();
log.info("響應(yīng)體:" + response);
//響應(yīng)數(shù)據(jù)包含
if(response.contains("登錄成功")){
Failure=false;
}
else{
Failure=true;
FailureMessage="響應(yīng)數(shù)據(jù)不包含登錄成功";
}
JSON響應(yīng)體字段提取及斷言
將String類型的響應(yīng)體轉(zhuǎn)為JSON對象并操作需要額外的jar包,可以使用org.json或gson,下載地址如下:
json.jar:下載地址 密碼:8it7
gson.jar:下載地址 密碼:6a7v
以json.jar為例,下載后將其放入JMeter/lib目錄下,重啟JMeter,添加BeanShell斷言,如下:
//JSON響應(yīng)斷言
import org.json.*; //導(dǎo)入org.json包
String response = prev.getResponseDataAsString(); //獲取響應(yīng)數(shù)據(jù)
JSONObject responseJson = new JSONObject(response); //轉(zhuǎn)為JSON對象
String message = responseJson.getString("message");
log.info("響應(yīng)message字段:" + message);
if(message.equals("成功")){
Failure=false;
}
else{
Failure=true;
FailureMessage="響應(yīng)message字段非成功";
}
JSONObject對象除了getString()方法外,還支持
getBoolean("字段名") :獲取布爾類型字段值
getInt("字段名"):獲取整型字段值
getLong("字段名"):獲取長整型字段值
getDouble("字段名"):獲取雙精型字段值
getJSONObject("字段名"):獲取嵌套Object類型字段值,JSONObject類型
getJSONArray("字段名"):獲取嵌套Array類型,JSONArray類型
響應(yīng)頭解析
響應(yīng)頭原本為String類型,可以通過分割遍歷組裝成Map類型來提取響應(yīng)頭中的項(xiàng)
import java.util.HashMap;
import java.util.Map;
//將字符串用換行符 截取為adc數(shù)組
String [] headersList = ResponseHeaders.split("\n");
Map headersMap = new HashMap(); //創(chuàng)建HashMap來從新組裝headers
for(int i=1;i
String [] itemList=headersList[i].split(": "); // 將每一條Headerr項(xiàng)按冒號分割
headersMap.put((itemList[0]), itemList[1]); // 分鍵值放入HashMap
}
String contentType = headersMap.get("Content-Type"); // 提取相應(yīng)項(xiàng)
log.info("響應(yīng)Content-Type:" + contentType)
總結(jié)
以上是生活随笔為你收集整理的beanshell断言_JMeter使用BeanShell断言的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 跨立的基本动作要领 动作介绍
- 下一篇: 苹果为什么微信提醒有延迟