jmeter后置处理器之BeanShell PostProcessor
BeanShell PostProcessor
【BeanShellPostProcessor简介】
BeanShellPostProcessor 是一个轻量级的面向Java的脚本语言,借用了JMeter对于BeanShell支持的特性,允许使用标准的Java语法来处理Json数据。
【什么时候需要BeanShellPostProcessor后置处理器】
jmeter后置处理器主要完善测试脚本部分,进行数据关联,常用的后置处理器有正则表达式提取器(主要用于正则匹配)、JSON Extractor(适用于json提取)、BeanShellPostProcessor,当遇到负责的逻辑提取时BeanShellPostProcessor就比较方便了。比如:数据比较大且返回有多个list,正则表达式提取器需人工去判断需要取的值是否存在并且在什么位置,效率会有所降低并且容易出错,针对这种情况可以使用jmeter自带的功能后置处理器BeanShell PostProcessor,分别提取每个list的值。
【正则表达式与BeanShell的对比】
在jmeter中都可以使用正则表达式和BeanShellPostProcessor用来提取数据,下面是对他们的优缺点进行对比,如图:
【如何使用BeanShellPostProcessor】
1、 下载fastjson-1.1.6.jar
下载fastjosn.jar包用以解析json数据,下载链接如下,然后把jar包放在jmeter文件的lib下就可以了。如图
2:在测试计划中把jar加载进来
3:添加后置处理器—BeanShell PostProcessor
在需要获取接口返回的值的接口处添加-后置处理器-BeanShellPostProcessor。
4:在BeanShell PostProcessor里输入代码,获取接口响应数据,进行处理
5:在接口需要传参的字段引入获取BeanShell PostProcessor
【一个简单的例子使用BeanShellPostProcessor获取数据】
1:例子1-直接获取接口返回数据,用作参数给其他需要该值的字段使用
1.1:接口响应数据为(解释一下该接口响应是生成一个签名串字段):WHxflHqtlf46AduAr509F98hj4vMGrVpC7pIFq9oC1ZXFk2HFWjFwlqKKagrTK3+mnqRs/Vw+Kv0kyfEGDF8iFsgX0e2ksLpQL5m5irGMCe5bIUB+AYY/jjZc943wDM2IY1WjesrGqD83kSNqWywdx6IrFZ/bNadiEq4QJMoeBS8/+PWmPcWNtTA9o3dUPOBpXVIae3bwmoyb8ycCifk2AVX9UnVleQ8zNx1hjHc+o+FhTH9t+Vo6Z8zNkIKK8Zhl23hBNm/jTDqp6u4BFUjNxYKX++6IDfq3Ttglv5heOudSh8+2nzKEeihL61ORG6YmwNjvKrGi27z/WhGTM/EPQ==
1.2:获取该字段,并把获取的值存放在cert_sign字段中--BeanShell PostProcessor代码:
//获取获取请求的返回值 String response = prev.getResponseDataAsString(); //日志打印获取请求的返回值 //log.info(response); vars.put("cert_sign", response)
1.3:在需要引用的cert_sign地方引用即可----引用方式:${cert_sign}
2:例子需要处理的响应数据不复杂,JSON字符串转JSON对象
2.1:接口响应报文:{"error_code":"0TE1130003000","error_info":"内部服务rpc调用异常"}
2.2:beanshell代码:
import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; //获取获取请求的返回值 String json = prev.getResponseDataAsString(); //日志打印获取请求的返回值 log.info("~~~~~~~~~~~~~~~~~~~打印响应报文"+json); JSONObject jso = JSON.parseObject(json); String error_info = jso.getString("error_info"); log.info("~~~~~~~~~~~~~~~~~~~打印获取的数据error_info"+error_info); vars.put("error_info1", error_info);
3:引用该值
3:例子需要处理的响应数据复杂,响应数据有多个数据list,JSON格式字符串与JSONObject之间的转换
响应报文:获取current_beans第一条数据的pay_status{
: "cert_sign":"",
: "current_beans":
: [
: : {
: : : "branch_code":"",
: : : "buyer_pay_amount":"null",
: : : "channel_serial_no":"101159704929076954905",
: : : "child_serial_no":null,
: : : "currency_code":"CNY",
: : : "customer_date_time":"20200810164810",
: : : "customer_serial_no":"",
: : : "goods_desc":"",
: : : "merchant_code":"",
: : : "merchant_fee":"0.010000",
: : : "operator_id":"15900000000",
: : : "order_status":"5",
: : : "pay_bankacct_type":"0",
: : : "pay_source":"6",
: : : "pay_status":"1",
: : : "profit_sharing":"0",
: : : "receipt_amount":"null",
: : : "req_serial_no":"",
: : : "status_msg":"交易成功",
: : : "terminal_code":"",
: : : "third_plat_act":"",
: : : "third_plat_code":"7",
: : : "trad_serial_no":"2020081000000003",
: : : "trade_amount":"0.10",
: : : "trade_type":"7",
: : : "undiscountable_amount":"0.00"
: : },
: : {
: : : "branch_code":"1909291058080031",
: : : "buyer_pay_amount":"null",
: : : "channel_serial_no":"101159704339999354849",
: : : "child_serial_no":null,
: : : "currency_code":"CNY",
: : : "customer_date_time":"20200810150958",
: : : "customer_serial_no":"wql7533019",
: : : "goods_desc":"",
: : : "merchant_code":"1909300907480221",
: : : "merchant_fee":"0.000000",
: : : "operator_id":"15900000000",
: : : "order_status":"6",
: : : "pay_bankacct_type":"0",
: : : "pay_source":"6",
: : : "pay_status":"1",
: : : "profit_sharing":"0",
: : : "receipt_amount":"null",
: : : "req_serial_no":"PJ2020081015095959777329",
: : : "status_msg":"交易成功",
: : : "terminal_code":"1912231916360691",
: : : "third_plat_act":"200001726689",
: : : "third_plat_code":"7",
: : : "trad_serial_no":"2020081000000001",
: : : "trade_amount":"0.01",
: : : "trade_type":"7",
: : : "undiscountable_amount":"0.00"
: : },
: ],
: "current_page":"1",
: "error_code":"0TE110001000",
: "error_info":"交易成功",
: "limit":"10",
: "start":"1",
: "total_count":"14",
: "total_pages":"2",
: "trad_date_time":"20201030145729"
}
2:BeanShell PostProcessor代码
import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; //获取请求的返回值 String response_data = prev.getResponseDataAsString(); JSONObject responseObj = JSON.parseObject(response_data); // 响应对象 JSONArray currentBeans = responseObj.getJSONArray("current_beans"); vars.put("pay_status",currentBeans.getJSONObject(1).getString("pay_status"));
3:引用该值
总结
以上3个例子都是通过BeanShell PostProcessor处理接口数据,用作关联,实际对于一般数据量小的数据可以直接使用正则表达式提取器或者JSON Extractor都比较方便快捷,如果数据量大,或者对取值有特殊要求可以考虑使用BeanShell PostProcessor。
如果有了解正则表达式提取器或者JSON Extractor需要可以参考:
1:https://www.cnblogs.com/qiaoli0726/p/13854368.html
2:https://www.cnblogs.com/qiaoli0726/p/13854373.html
备注:FastJson对JSON字符串、JSON对象及JavaBean之间的相互转换,参考:https://blog.csdn.net/xuforeverlove/article/details/80842148