jmeter脚本调优之BeanShell断言

一、什么是BeanShell

1、BeanShell是一种完全符合Java语法规范的脚本语言,并且又拥有自己的一些语法和方法;
2、BeanShell是一种松散类型的脚本语言(这点和JS类似);
3、BeanShell是用Java写成的,一个小型的、免费的、可以下载的、嵌入式的Java源代码解释器,具有对象脚本语言特性,非常精简的解释器jar文件大小为175k。
4、BeanShell执行标准Java语句和表达式,另外包括一些脚本命令和语法。
5、BeanShell断言中可以通过ResponseCode、ResponseHeaders以及
pre.getResponseDataAsString()来分别获得String格式的响应状态码、响应头、响应体数据,结合if判断通过变量Failure=false或Failure=true来设置断言是否通过,当设置Failure=true时,还可以设置FailureMessage来设置失败原因。

二、 Bean Shell常用内置变量

JMeter在它的BeanShell中内置了变量,用户可以通过这些变量与JMeter进行交互,其中主要的变量及其使用方法如下:

1、log:写入信息到jmeber.log文件,使用方法:log.info(“This is log info!”);
2、ctx:该变量引用了当前线程的上下文,使用方法可参考:org.apache.jmeter.threads.JMeterContext;
3、vars:操作jmeter变量,这个变量实际引用了jmeter线程中的局部变量容器(本质上是Map),它是测试用例与Bean Shell交互的桥梁,常用方法:
(1)vars.get(String key):从jmeter中获取String变量值;
(2)vars.getObject(key): 从jmeter中获取非String变量值;
(3)vars.put(String key,String value): String数据存到jmeter变量中;
(4)vars.putObject(key, value):非String数据存到jmeter变量中;
  更多方法可参考:org.apache.jmeter.threads.JMeterVariables
4、props(JMeterProperties - class java.util.Properties):操作jmeter属性,该变量引用了JMeter的配置信息,可以获取Jmeter的属性,它的使用方法与vars类似,但是只能put进去String类型的值,而不能是一个对象。对应于java.util.Properties。
(1) props.get(“START.HMS”);注:START.HMS是属性名,在文件
jmeter.properties中定义。
(2) props.put(“PROP1”,“1234”);注:往文件jmeter.properties中写 入PROP1变量名,值为1234。
5、prev(SampleResult):获取请求返回的信息,常用方法:
(1) getResponseDataAsString():获取响应信息;
(2) getResponseCode() :获取响应code;
更多方法可参考:org.apache.jmeter.samplers.SampleResult

三、JSONObject对象常用方法

对象的概念:在学校里,会有学生和老师等实体,学生有学号、姓名、所在班级等属性(数据),学生还有学习、提问、吃饭和走路等操作。学生只是抽象的描述,这个抽象的描述称为“类”。在学校里活动的是学生个体,即张同学、李同学等,这些具体的个体称为“对象”,“对象”也称为“实例”。
1、getString(“字段名”):获取字符串型字段值;
2、getBoolean(“字段名”) :获取布尔类型字段值;
3、getInt(“字段名”):获取整型字段值;
4、getLong(“字段名”):获取长整型字段值;
5、getDouble(“字段名”):获取双精型字段值;
6、getJSONObject(“字段名”):获取嵌套Object类型字段值,JSONObject类型;
7、getJSONArray(“字段名”):获取嵌套Array类型,JSONArray类型;

四、BeanShell判断返回的JSON

首先要下载JSON依赖包(org.json.jar),放到\apache-jmeter-5.0\lib\ext中,在测试计划中添加此路径,然后重启jmeter即可在beanshell中import json包了。
1、数据库数据与变量比对
实例:客户采集:填写客户信息再提交
思路:(1)从数据库中取出农户信息,得到农户代码;
(2)获取农户代码变量;
(3)库表中的农户代码和变量比对是否一致。
添加一个jdbc请求,查询出客户信息。
在这里插入图片描述
再添加Bean Shell断言,编写代码:

get_nhxx=vars.getObject("nhxx"); //获取数据库中的信息
log.info("农户信息为:"+get_nhxx);

String get_nhdm =get_nhxx.get(0).get("nhdm").toString();//获取数据库的nhdm,并转换为String型
log.info("农户代码为:"+get_nhdm);

bl_nhdm=vars.get("nhdm");//获取nhdm变量值

if(get_nhdm.equals(bl_nhdm)){//
	Failure=false;
	log.info("该农户信息已写入库表中,添加农户成功!");	
       }
else{
	 Failure=true;
	 log.info("该农户代码:"+bl_nhdm+"未写入库表,添加农户失败!");
	}

2、接口返回数据与数据库数据比对。
接口返回的json格式主要为以下两种,获取json串中的某一变量值,要学会解析json串。
(1)返回json为数组格式。[{}]
实例:汇总统计
思路:(1)从数据库中根据条件统计数据;
(2)获取接口返回的统计数据;
(3)接口返回数据与数据库统计数据是否一致。
在这里插入图片描述
代码:

import org.json.*;
 
get_hztj=vars.getObject("hztj"); 
int get_ybhs=Integer.valueOf(get_hztj.get(0).get("ybhs").toString());
int get_dks=Integer.valueOf(get_hztj.get(0).get("dks").toString());
double get_ybmj=Double.valueOf(get_hztj.get(0).get("ybmj").toString());
log.info("数据库中统计户数为:"+get_ybhs+",地块数为:"+get_dks+",验标面积为:"+get_ybmj);

String response=prev.getResponseDataAsString();//获取请求的返回值,prev()为遍历方法
JSONObject responseJson=new JSONObject(response);//将返回值转换成json
log.info("输出转换为json的响应数据"+responseJson);
JSONArray get_data=responseJson.getJSONArray("data");//获取data数据
log.info("接口返回data为"+get_data);

//获取 data[ i ] 数组对象
JSONObject jsonTemp = get_data.getJSONObject(0);
int fh_hs = jsonTemp.getInt("hs");
int fh_dksl=jsonTemp.getInt("dksl");
double fh_ybmj=jsonTemp.getDouble("dkmj");
log.info("返回的户数为:"+fh_hs+",地块数量为:"+fh_dksl+"验标面积为:"+fh_ybmj);

if(fh_hs==get_ybhs&&fh_dksl==get_dks&&fh_ybmj==get_ybmj){
	  Failure=false;
                 log.info("接口返回数据和数据库中统计的数据一致!");
}
else{
	Failure=true;
               log.info("接口返回户数:"+fh_hs+"库中统计户数:"+get_ybhs
                          +"返回地块数:"+fh_dksl+"库中统计地块数:"+get_dks
                          +"返回验标面积:"+fh_ybmj+"库中统计验标面积"+get_ybmj
                          +"存在不一致!");  
}

(2)返回的json数据如下:
实例:农户查询功能
思路:(1)获取接口返回的数据;
(2)接口返回数据与输入的查询条件是否一致
在这里插入图片描述
代码:

import org.json.*;

String response=prev.getResponseDataAsString();//获取请求的返回值,prev()为遍历方法
JSONObject responseJson=new JSONObject(response);//将返回值转换成json
log.info("输出转换为json的响应数据"+responseJson);

JSONObject get_data=responseJson.getJSONObject("data");//获取json中的data列表
log.info("返回的data"+get_data);

JSONArray get_farmers=get_data.getJSONArray("farmers");//获取data中的farmers列表
log.info("返回的farmers"+get_farmers);

//获取 farmers[ i ] 数组对象
JSONObject jsonTemp = get_farmers.getJSONObject(0);
log.info("返回的jsonTemp"+jsonTemp);
String fh_nhdm = jsonTemp.getString("nhdm");
log.info("返回的农户代码为:"+fh_nhdm);

bl_nhdm=vars.get("nhdm");//获取农户变量

if(fh_nhdm.equals(bl_nhdm)){
	Failure=false;
	log.info("查询的农户代码与返回的农户代码一致!");
	}
else{
	Failure=true;
	log.info("查询农户代码:"+fh_nhdm+"与返回农户代码"+fh_nhdm+"不一致!");
	}

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值