本篇内容主要来自于: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 响应数据 

jmeter中beanshell (jsonArrary 和jsonObject ),断言,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

jmeter中beanshell (jsonArrary 和jsonObject ),断言,json插件

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

jmeter中beanshell (jsonArrary 和jsonObject ),断言,json插件

可以对要测试的响应字段中请求头,请求体,响应文本等进行断言;一般响应文本用的比较多。

模式匹配规则:如,选择的是响应文本

1)包括:响应文本中包括要断言的内容,支持正则;(具体支持正则怎么用?)

2)匹配:响应文本中完全匹配要断言的内容,支持正则;

3)equals:响应文本中完全匹配要断言的内容,不支持正则,且大小写敏感;

4)substring:字符串?响应文本中包含要断言的内容,不支持正则,且大小写敏感;

否,或,用于反逻辑和且逻辑。(上面的几种匹配规则一般用包括,响应文本中有出现要测试的文字“您好”或者参数进行动态断言 等)

---------------------------------------------------

下面要介绍下 json path extractor 插件

https://jmeter-plugins.org/install/Install/ 下载plugins-manager.jar放在lib下的ext 下,选择要安装的插件,点击安装并重启。

从上个请求的响应结果中取数据;用于后置处理器。

jmeter中beanshell (jsonArrary 和jsonObject ),断言,json插件

jmeter中beanshell (jsonArrary 和jsonObject ),断言,json插件
a、从 JSON response 中提取数据(每个 Extractor 只能抽取一个变量)
b、存放到 verifyCode 变量中为后续使用
c、如果没有找到,则变量 verifyCode 中会包含 “NO DEFAULT VALUE”(Default Value)
d、我们可以使用 ${verifyCode} 在后续元件中注入数据

2)Json Path Assertion 检查返回值是否符合预期

jmeter中beanshell (jsonArrary 和jsonObject ),断言,json插件

 

 

 

 

 

相关文章:

  • 2021-10-25
  • 2021-08-15
  • 2021-07-21
  • 2022-12-23
  • 2021-11-10
  • 2022-12-23
  • 2021-12-02
  • 2022-02-12
猜你喜欢
  • 2021-06-21
  • 2022-12-23
  • 2021-08-14
  • 2021-11-08
  • 2022-03-08
  • 2022-12-23
  • 2021-11-15
相关资源
相似解决方案