實(shí)戰(zhàn)示例
測(cè)試場(chǎng)景
- 電商系統(tǒng)經(jīng)常會(huì)涉及到商品的庫(kù)存數(shù)量的壓測(cè)隔心,在用戶下單前需要先做庫(kù)存余量的判斷坎缭,當(dāng)余量不足時(shí)用戶無(wú)法下單竟痰,保證商品的有效售賣
庫(kù)存余量查詢響應(yīng)結(jié)果
-
響應(yīng)結(jié)果一般是json字符串的形式签钩,響應(yīng)示例如下:
?
2、期望獲取的結(jié)果
通過(guò)上面響應(yīng)結(jié)果坏快,想獲取參數(shù)為periods數(shù)組下的period_stock參數(shù)值和back_periods數(shù)組period_stock參數(shù)值铅檩。
標(biāo)注如下:
image
3、jmeter beanshell
測(cè)試獲取建議操作
- 由于jmeter中beanshell斷言中書寫代碼沒(méi)有提示(超不方便)莽鸿,不過(guò)可提前在IEDA工具中先調(diào)試獲取結(jié)果再?gòu)?fù)制到beanshell中昧旨。
-
IDEA調(diào)試結(jié)果如下:
然后就只把把代碼復(fù)制到beanshell中即可。在jmeter中可以打印下獲取的庫(kù)存余量祥得,結(jié)果如下:
- 附測(cè)試腳本(當(dāng)back_periods庫(kù)存值=0時(shí)兔沃,beanshell斷言生效,可及時(shí)查看訂單創(chuàng)建數(shù)量是否與庫(kù)存數(shù)量一致)
import org.json.*;
//獲取上一個(gè)請(qǐng)求的返回值
String response = prev.getResponseDataAsString();
//將返回值轉(zhuǎn)換為json
JSONObject responseJson = new JSONObject(response);
//獲取responseMessage
JSONArray data = responseJson.getJSONObject("data").getJSONArray("ticket_periods");
JSONObject ticket_periods = (JSONObject)data.get(0);
JSONObject periods =(JSONObject)(ticket_periods.getJSONArray("periods").get(0));
Integer period_stock = periods.getInt("period_stock");
JSONObject back_periods=(JSONObject)(ticket_periods.getJSONArray("back_periods").get(0));
Integer period_stock_back = back_periods.getInt("period_stock");
log.info("==========獲取庫(kù)存開始===========");
log.info("periods內(nèi)余量值:" + period_stock);
log.info("back_periods內(nèi)余量值:" +period_stock_back);
log.info("==========獲取庫(kù)存結(jié)束===========");
//beanshell斷言
if(period_stock == 0){
Failure = true;
FailureMessage = "period_stock的值:" + period_stock +"警告:已無(wú)庫(kù)存级及,請(qǐng)注意查看"+ "||period_id的值為:"+period_stock_back+"警告:已無(wú)庫(kù)存粘拾,請(qǐng)注意查看";
}
-
獲取所有數(shù)組內(nèi)的參數(shù)值,這個(gè)需要進(jìn)行遍歷操作
示例結(jié)果
附遍歷代碼
public void testCase() throws IOException {
// //將返回值轉(zhuǎn)換為json
// JSONObject responseJson = new JSONObject(str);
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
Map map = objectMapper.readValue(str, Map.class);
Map dataMap = (Map) map.get("data");
List<Map<String, Object>> list = (List<Map<String, Object>>) dataMap.get("ticket_periods");
list.stream().forEach(item ->{
List<Map<String, Object>> periodsList = (List<Map<String, Object>>) item.get("periods");
periodsList.stream().forEach(periods ->{
System.out.println("當(dāng)前period_stock的值:"+periods.get("period_stock"));
});
});
}
- 另外使用jmeter的beanshell功能經(jīng)常會(huì)用到以下方式傳遞變量
1创千、在beanshell中如果拿到響應(yīng)結(jié)果的某個(gè)值缰雇,可以通過(guò)賦值方式傳入,然后通過(guò)變量取值即可
vars.put賦值追驴,格式為 vars.put("key","value")
vars.get 獲取變量械哟,vars.get("period_stock")
2、特別說(shuō)明:如果想把Integer類型通過(guò)vars放入的話需要加上toString()方法殿雪,上面需要把Integer 類型period_stock作為變量傳遞暇咆,示例
vars.put("period_stock",period_stock.toString());
其它接口可通過(guò)變量名取值:{"period_stock":"${period_stock}"}
傳遞結(jié)果
GET http://127.0.0.1:8080/test
GET data:
{"period_stock":"80"}
[no cookies]
Request Headers:
Connection: keep-alive
Content-Type: application/json
Content-Length: 21
Host: 127.0.0.1:8080
User-Agent: Apache-HttpClient/4.5.5 (Java/1.8.0_181)
- 常用變量總結(jié):
- vars: 實(shí)際引用Jmeter線程的局部變量, 連通Jmeter 和 beanshell
vars.get(String key) //獲取變量值
vars.put(String key, String value) //存儲(chǔ)value到變量key - log: 寫入信息到日志中丙曙,log.info(""),括號(hào)放置需要的變量
- prev:獲取當(dāng)前響應(yīng)結(jié)果和響應(yīng)狀態(tài)爸业;
getResponseDataAsString()
getResponseCode() - props:class java.util.Properties
變量屬性復(fù)制給變量props.put("some_variable",vars.get("some_variable"))
- vars: 實(shí)際引用Jmeter線程的局部變量, 連通Jmeter 和 beanshell
-
jmeter變量提取方法
1、正則提取方法
匹配規(guī)則
響應(yīng)示例
{
"code":200,
"data":[
{
"id":100,
"regname":"test1",
"pwd":"A31BFB0C8955E3780342A5EAF0282FF"
},
{
"id":200,
"regname":"test2",
"pwd":"B31BFB0C8955E3780342A5EAF0282FF"
},
{
"id":300,
"regname":"test3",
"pwd":"C31BFB0C8955E3780342A5EAF0282FF"
}
],
"msg":"success"
}
期望結(jié)果:取出id亏镰、regname扯旷、pwd參數(shù)值,通過(guò)正則提取
可使用在線驗(yàn)證工具:https://tool.oschina.net/regex/
驗(yàn)證結(jié)果
方法:
1索抓、ID的:"id":(.*?)," 或者: "id":(.+?),"可以匹配三個(gè)钧忽,模板寫成$y$,y=1取第一個(gè),y=2取第二個(gè)逼肯,y=3取第三個(gè)
2耸黑、regname的:"regname":"(.*?)",或者:"regname":"(.+?)"," 可以匹配三個(gè),模板寫成$y$,y=1取第一個(gè)篮幢,y=2取第二個(gè)大刊,y=3取第三個(gè)
3、pwd的:"pwd":"(.*?)","或者:"pwd":"(.+?)","可以匹配三個(gè)三椿,模板寫成$y$,y=1取第一個(gè)缺菌,y=2取第二個(gè)曲尸,y=3取第三個(gè)
2、json提取器方法
同樣是上述示例
{
"code":200,
"data":[
{
"id":100,
"regname":"test1",
"pwd":"A31BFB0C8955E3780342A5EAF0282FF"
},
{
"id":200,
"regname":"test2",
"pwd":"B31BFB0C8955E3780342A5EAF0282FF"
},
{
"id":300,
"regname":"test3",
"pwd":"C31BFB0C8955E3780342A5EAF0282FF"
}
],
"msg":"success"
}
期望結(jié)果:取出id男翰、regname另患、pwd參數(shù)值,通過(guò)json提取器
方法:
寫法:$.data[0].id 其他參數(shù)參考此提取方法
規(guī)則說(shuō)明:$開始蛾绎;.data:第一層里的數(shù)據(jù)昆箕;[0]:data里有三組數(shù)據(jù),取第一組的數(shù)據(jù)租冠;.id:取第一組數(shù)據(jù)里的id的值
當(dāng)[*]代表取所有數(shù)據(jù)鹏倘,例$.data[*].id取出80,81,82
當(dāng)[:N]代表取前兩個(gè)值,例$.data[:2].id取出80,81
擴(kuò)展:
擴(kuò)展1:取指定pwd為A31BFB0C8955E3780342A5EAF0282FF的id
方法:$.data[?@.pwd==A31BFB0C8955E3780342A5EAF0282FF].id
擴(kuò)展2:固定條件多個(gè)key的value
方法:$.data[?@.pwd==A31BFB0C8955E3780342A5EAF0282FF].["id","regname","pwd"]