实战示例
测试场景
- 电商系统经常会涉及到商品的库存数量的压测,在用户下单前需要先做库存余量的判断,当余量不足时用户无法下单,保证商品的有效售卖
库存余量查询响应结果
-
响应结果一般是json字符串的形式,响应示例如下:
2、期望获取的结果
通过上面响应结果,想获取参数为periods数组下的period_stock参数值和back_periods数组period_stock参数值。
标注如下:
3、jmeter beanshell
测试获取建议操作
- 由于jmeter中beanshell断言中书写代码没有提示(超不方便),不过可提前在IEDA工具中先调试获取结果再复制到beanshell中。
-
IDEA调试结果如下:
然后就只把把代码复制到beanshell中即可。在jmeter中可以打印下获取的库存余量,结果如下:
- 附测试脚本(当back_periods库存值=0时,beanshell断言生效,可及时查看订单创建数量是否与库存数量一致)
import org.json.*;
//获取上一个请求的返回值
String response = prev.getResponseDataAsString();
//将返回值转换为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("==========获取库存开始===========");
log.info("periods内余量值:" + period_stock);
log.info("back_periods内余量值:" +period_stock_back);
log.info("==========获取库存结束===========");
//beanshell断言
if(period_stock == 0){
Failure = true;
FailureMessage = "period_stock的值:" + period_stock +"警告:已无库存,请注意查看"+ "||period_id的值为:"+period_stock_back+"警告:已无库存,请注意查看";
}
-
获取所有数组内的参数值,这个需要进行遍历操作
附遍历代码
public void testCase() throws IOException {
// //将返回值转换为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("当前period_stock的值:"+periods.get("period_stock"));
});
});
}
- 另外使用jmeter的beanshell功能经常会用到以下方式传递变量
1、在beanshell中如果拿到响应结果的某个值,可以通过赋值方式传入,然后通过变量取值即可
vars.put赋值,格式为 vars.put("key","value")
vars.get 获取变量,vars.get("period_stock")
2、特别说明:如果想把Integer类型通过vars放入的话需要加上toString()方法,上面需要把Integer 类型period_stock作为变量传递,示例
vars.put("period_stock",period_stock.toString());
其它接口可通过变量名取值:{"period_stock":"${period_stock}"}
传递结果
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)
- 常用变量总结:
- vars: 实际引用Jmeter线程的局部变量, 连通Jmeter 和 beanshell
vars.get(String key) //获取变量值
vars.put(String key, String value) //存储value到变量key - log: 写入信息到日志中,log.info(""),括号放置需要的变量
- prev:获取当前响应结果和响应状态;
getResponseDataAsString()
getResponseCode() - props:class java.util.Properties
变量属性复制给变量props.put("some_variable",vars.get("some_variable"))
- vars: 实际引用Jmeter线程的局部变量, 连通Jmeter 和 beanshell
-
jmeter变量提取方法
1、正则提取方法
匹配规则
响应示例
{
"code":200,
"data":[
{
"id":100,
"regname":"test1",
"pwd":"A31BFB0C8955E3780342A5EAF0282FF"
},
{
"id":200,
"regname":"test2",
"pwd":"B31BFB0C8955E3780342A5EAF0282FF"
},
{
"id":300,
"regname":"test3",
"pwd":"C31BFB0C8955E3780342A5EAF0282FF"
}
],
"msg":"success"
}
期望结果:取出id、regname、pwd参数值,通过正则提取
可使用在线验证工具:https://tool.oschina.net/regex/
验证结果
方法:
1、ID的:"id":(.*?)," 或者: "id":(.+?),"可以匹配三个,模板写成$y$,y=1取第一个,y=2取第二个,y=3取第三个
2、regname的:"regname":"(.*?)",或者:"regname":"(.+?)"," 可以匹配三个,模板写成$y$,y=1取第一个,y=2取第二个,y=3取第三个
3、pwd的:"pwd":"(.*?)","或者:"pwd":"(.+?)","可以匹配三个,模板写成$y$,y=1取第一个,y=2取第二个,y=3取第三个
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"
}
期望结果:取出id、regname、pwd参数值,通过json提取器
方法:
写法:$.data[0].id 其他参数参考此提取方法
规则说明:$开始;.data:第一层里的数据;[0]:data里有三组数据,取第一组的数据;.id:取第一组数据里的id的值
当[*]代表取所有数据,例$.data[*].id取出80,81,82
当[:N]代表取前两个值,例$.data[:2].id取出80,81
扩展:
扩展1:取指定pwd为A31BFB0C8955E3780342A5EAF0282FF的id
方法:$.data[?@.pwd==A31BFB0C8955E3780342A5EAF0282FF].id
扩展2:固定条件多个key的value
方法:$.data[?@.pwd==A31BFB0C8955E3780342A5EAF0282FF].["id","regname","pwd"]