本篇内容主要来自于:https://blog.csdn.net/kasijia/article/details/79405815#commentBox 加深对beanshell 的用法
1)beanshell post processer 是用于获取上一个请求中的响应值。也可以用后置处理器中的正则表达式,但在一些复杂的json 响应结果中正则不太好用,所以推荐使用beanshell .
2). 解析json 需要这个插件,放在lib 目录下重启jmeter ,谨慎起见,然后把插件导入进测试计划中。
D:\apache-jmeter-3.0\lib\json-20160810
3) 下面脚本的测试场景有两个
1. 判断精华帖是否>4,取决于响应中的excellent值 ,等于1 即为精华帖
2. 判断主题为"MTSC2018 早鸟票开售..."帖子对应的excellent参数值,以此来判断是否为精华帖
测试接口:https://testerhome.com/api/v3/topics.json
用在线json 校验格式的网站去分析json 响应数据
分析:TestHome首页json数据结构为{"topics":[{...},{...}...]},外层JSONObject内层JSONArrary 。
-----------------------------------------------------------------------------------------------------------------------------------------
这块概念的理解来自于 https://blog.csdn.net/lishuangzhe7047/article/details/28880009
注意:这块需要理解两个概念,JSONObject 和 JSONArrary 。
JSONObject 是key 和value 的格式,键值对出现,以{ key,value} ,使用的是大括号。
JSONArrary 也是键值对的形式,以[ ] 中括号的形式,JSONArrary 里面的元素可以是JSONObject 。
如: [{name1:{name2:{name3:'value1',name4:'value2'}}},{}] 这个例子外层是JSONArrary 两个数组元素,内层是JSONObject ;
可用如下代码获取name4 的值,经过试验下面代码可用。
import org.json.*;
//目的:获取name4 的值
String s="[{name1:{name2:{name3:'value1',name4:'value2'}}},{}]";
JSONArray jsonArray=new JSONArray(s);
//思路1.获取到数组中的第一个元素{name1:{name2:{name3:'value1',name4:'value2'}}}
JSONObject name1=jsonArray.getJSONObject(0);
//思路2:获取到name1 的值
JSONObject name1Value=name1.getJSONObject("name1"); //{name2:{name3:'value1',name4:'value2'}}
//思路3:获取到name2 的值 {name3:'value1',name4:'value2'}
JSONObject name2Value=name1Value.getJSONObject("name2");
//思路3:获取到name4 的值 value2
String name4Value=name2Value.getString("name4");
vars.put("name4Value",name4Value);
----------------------------------------------------------------------------------------------------------------------------------------------------------
继续正题
后置处理器 beanShell post processor
1.获取"topics"下JSONArray对象
import org.json.*;
//设置全局变量
static public int excellent_count = 0;
//获取最后一次请求返回数据 (JMeter内置方法)
String jsonResult = prev.getResponseDataAsString();
//分析:TestHome首页json数据结构为{"topics":[{...},{...}...]},外层JSONObject内层JSONArrary
//获取"topics"下JSONArray对象
JSONObject jsonObject = new JSONObject(jsonResult);
JSONArray jsonArray = jsonObject.getJSONArray("topics");
String string_jsonArray = jsonArray.toString();
vars.put("string_jsonArray",string_jsonArray);
2. 判断精华帖是否>4
断言---beanshell 断言。
import org.json.*;
//设置全局变量用于记录精华帖数量
static public int excellent_count = 0;
//从BeanShell PostProcessor获取jsonArray
var b = vars.get("string_jsonArray");
JSONArray jsonArray = new JSONArray(b);
//计算精华帖数量 为啥这是getInt
for (int i = 0;i < jsonArray.length();i++) {
excellent_result = jsonArray.getJSONObject(i).getInt("excellent");
if (excellent_result == 1){
//循环遍历全部文章的excellent值,若为1则精华帖数量excellent_count+1
excellent_count = excellent_count + 1;
}
}
if (excellent_count >4){
//Failure为false代表断言成功,且结果树不显示该断言
Failure = false;
//日志输出结果
log.error("【Case01】执行成功,精华帖数量为" + excellent_count + "个。");
}else{
//Failure为true则代表断言失败
Failure = true;
//设置FailureMessage为断言失败信息
FailureMessage = "【Case01】执行失败,精华帖数量为" + excellent_count + "个。" ;
log.error("【Case01】执行失败,精华帖数量为" + excellent_count + "个。" );
}
3. 主题为"MTSC2018 早鸟票开售..."帖子对应的excellent参数值,以此来判断是否为精华帖。
断言--beanshell 断言。
import org.json.*;
//设置全局变量excellent_result用于储存excellent值
static public int excellent_result;
//从BeanShell PostProcessor获取jsonArray
var b = vars.get("string_jsonArray");
JSONArray jsonArray = new JSONArray(b);
for (int i = 0;i < jsonArray.length();i++) {
//获取titile值
String title = jsonArray.getJSONObject(i).getString("title");
//当title="2018年TesterHome 全员感恩红包发放"时获取对应excellent值
if ( "MTSC2018 早鸟票开售啦_中国移动互联网测试开发大会".equals(title)){
excellent_result = jsonArray.getJSONObject(i).getInt("excellent");
break;
}else{
continue;
}
}
//校验结果excellent为0则断言成功,若为1则断言失败
if(excellent_result == 0){
Failure = false;
//日志输出结果
log.error("【Case02】执行成功,excellent值为" + excellent_result + ",此帖非精华帖。");
}else{
Failure = true;
FailureMessage = "【Case02】执行失败,excellent值为" +excellent_result ;
log.error("【Case02】执行失败,excellent值为" + excellent_result + ",此帖为精华帖。");
}
4. D:\进入TestHome首页.jmx 文件路径。
5. 关于 beanshell PostProcess的相关资料
场景一 :下面资料来源 https://blog.csdn.net/aduocd/article/details/80351719
String s1="{'body':{'apps':[{'name':'111'},{'name':'222'}]}}";
String response_data = prev.getResponseDataAsString();
JSONObject data_obj = new JSONObject(data_obj.getJSONObject("body"));
String apps_str = data_obj.getJSONObject("body").getJSONArray("apps").toString();
JSONArray apps_array = new JSONArray(apps_str);
String[] result = new String[apps_array.length()];
for(int i=0;i<apps_array.length();i++){
JSONObject app_obj = new JSONObject(apps_array.get(i).toString());
String name = app_obj.get("name").toString();
result[i] = name;
}
vars.put("result", Arrays.toString(result));
{"apps":[{"name":"111"},{"name":"222"}]} = data_obj.getJSONObject("body") ;---> 结果就是个JSONArray .
上面代码块主要目的是获取到name 的字段值,vars.put ("result", Arrays.toString(result)) 保存到 jmeter变量中,便于后面组件使用。
场景二,获取数据库中查询到的值,并保存
https://blog.csdn.net/aduocd/article/details/51351872
jdbc connection configuration ---> jdbc request ---> beanshell post processor(用户读取从数据库中获取的登录的用户名和密码)
备注:可以debug 看下jdbc request 的结果集,是什么形式的。有时间可具体操作实践下。
-----------------------------------------------------------------------------------------------------------------------------------------------------
这里讲下断言( beanshell 断言和响应断言)
1. beanshell用于复杂的个性化断言,如上面介绍的,断言精华帖的数量是不是大于4,以及判断某个主题是不是精华帖。
可以使用 Failure 和 FailureMessage来设置断言结果。
Failure=true ---》表示断言失败,结果显示该断言;
Failure=false ---》表示断言成功,结果不显示该断言;
FailureMessage(“ ”); ---》可以打印断言信息。也可以用上面的 log.error("");
2.响应断言 一下内容来源于:https://blog.csdn.net/lijing742180/article/details/81157947
可以对要测试的响应字段中请求头,请求体,响应文本等进行断言;一般响应文本用的比较多。
模式匹配规则:如,选择的是响应文本
1)包括:响应文本中包括要断言的内容,支持正则;(具体支持正则怎么用?)
2)匹配:响应文本中完全匹配要断言的内容,支持正则;
3)equals:响应文本中完全匹配要断言的内容,不支持正则,且大小写敏感;
4)substring:字符串?响应文本中包含要断言的内容,不支持正则,且大小写敏感;
否,或,用于反逻辑和且逻辑。(上面的几种匹配规则一般用包括,响应文本中有出现要测试的文字“您好”或者参数进行动态断言 等)
---------------------------------------------------
下面要介绍下 json path extractor 插件
https://jmeter-plugins.org/install/Install/ 下载plugins-manager.jar,放在lib下的ext 下,选择要安装的插件,点击安装并重启。
从上个请求的响应结果中取数据;用于后置处理器。
a、从 JSON response 中提取数据(每个 Extractor 只能抽取一个变量)
b、存放到 verifyCode 变量中为后续使用
c、如果没有找到,则变量 verifyCode 中会包含 “NO DEFAULT VALUE”(Default Value)
d、我们可以使用 ${verifyCode} 在后续元件中注入数据
2)Json Path Assertion 检查返回值是否符合预期