Jmeter之Beanshell详解

一、 Beanshell概念

 Beanshell:

  • BeanShell是一种完全符合Java语法规范的脚本语言,并且又拥有自己的一些语法和方法;
  • BeanShell是一种松散类型的脚本语言(这点和JS类似);
  • BeanShell是用Java写成的,一个小型的、免费的、可以下载的、嵌入式的Java源代码解释器,具有对象脚本语言特性,非常精简的解释器jar文件大小为175k。
  • BeanShell执行标准Java语句和表达式,另外包括一些脚本命令和语法。

官网:http://www.BeanShell.org/

 二、Jmeter常用Bean Shell

  • 定时器:  BeanShell Timer

  • 前置处理器:BeanShell PreProcessor

  • 采样器:  BeanShell Sampler

  • 后置处理器:BeanShell PostProcessor

  • 断言:   BeanShell断言

  • 监听器:  BeanShell Listener

三、Jmeter常用内置变量

1.内置变量

 BeanShell脚本中不用定义,可以直接使用的变量,常用的内置变量和方法如下:

log:写日志到控制台和jmeter.log,如log.info("XXX");

vars:操作变量

      vars.get("skuId");  从jmeter中获取${skuId}变量的值

      vars.put("name","test"); 将"test"保存到${name}变量中

prev:获取前面sampler返回的信息

      getResponseDataAsString(); 获取响应信息

      getResponseCode(); 获取响应

 更多内置变量参考:https://jmeter.apache.org

举例:

2.添加  BeanShell取样器

log.info(".....<<<<<");
log.error("xxxx");

String myip=vars.get("ip");//获取参数值(在用户定义的变量中设置了“ip”值)
log.info(myip);//日志打印

vars.put("ip","192.168.0.0");//赋值
String myip=vars.get("ip");
log.info(myip);//日志打印

3.后置处理器的应用

log.info("前一个返回结果为:"+prev.getResponseDataAsString());
log.info("前一个请求的状态码为:"+prev.getResponseCode())

四、BeanShell的用法实例

1.BeanShell面板上写脚本

需求: 

1、调用接口获取sku信息
2、判断库存,如果库存大于500,调用buy接口购买10个商品,否则购买5个商品

// 获取接口返回的库存值
String myStock = vars.get(“p_stock");//转换为整数
int iStock = Integer.parselnt(myStock);//判断库存
if (iStock>500){
// 重新保存参数
vars.put("buyNum","10");
}else{
vars.put(“buyNum","5");
}

先是get接口json提取器提取库存字段然后用到后面脚本里去做判断

2.引用外部 java源文件

引用外部源码文件然后实现md5加密完成签名接口  

源码文件:

链接: https://pan.baidu.com/s/1JQlgeHGVHl8NOdSiTwNMkg?pwd=uqrs 提取码: uqrs

在beanShel中通过source("代码路径")方法引入java,然后调用方法和java一样,new一个class,再调用里面的方法 

前置处理器

//引入源代码
source("/Users/mac/Documents/study23/jmeter/md5/Md5Util.java");
//生成随机手机号
String phone = "135${__Random(10000000,99999999,myPhone)}"; 
String code = "testmay";
//生成时间戳
String time = "${__time(,myTime)}";
// 调用外部函数进行加密
String md5 = Md5Util.getMd5Hex(phone+code+time);
// 将数据另存为新的变量
vars.put("phone",phone); 
vars.put("md5",md5);

 ${phone} ${code} ${md5}可被调用 

3.调用jar包

使用beahshell调用自己写的工具类,工具类实现了密码的加、解密功能 

在eclipse写好代码,然后把该类打成jar包(在类上点击右键->Export->jar file) 

法一: 

1、将jar包放到jmeter目录/Users/mac/Documents/apache-jmeter-5.6.2/lib/ext下

3、打开jmeter,添加一个http sampler(调用登录接口),在sampler下添加一个BeanShell PreProcessor(如果jmeter已经打开了,步骤2中jar包要生效,必须才重启jmeter

4、在beanshell PreProcessor中导入我们的jar包,调用里面的加、解密码方法,把结果保存在jmeter变量中

 法二:

调用jar包
1、测试计划,Add directory or jar to classpath
2、import 所需要的类名



查看jar包内容:

进入jar路径,输入以下指令:

jar tf testfan-md5.jar

 然后调用方式用import 

import com.lee.util.Md5Util
// 生成随机手机号
String phone = "135${_Random(10000000,99999999,myPhone)}"; 
String code = "testmay";
// 生成时间戳
String time = "${__time(,myTime)}";
//调用外部函数进行加密
String md5 = Md5Util.getMd5Hex(phone+code+time);
//将数据另存为新的变量 
vars.put("phone",phone); 
vars.put("md5",md5);

4.提取 json值

 需求:提取sample返回json数据中所有name字段值,返回的json格式如下: 

{“body”:{“apps”:[{“name”:”111”},{“name”:”222”}]}} 

jmeter中添加后置处理器BeanShell PostProcessor 

说明:脚本中的导入的json包需要自己去网络下载后放到\lib\ext

链接: https://pan.baidu.com/s/1-knIb9_NulF81mIkortvoQ?pwd=h4p4 提取码: h4p4

import org.json.*;

String response_data = prev.getResponseDataAsString();
JSONObject data_obj = new JSONObject(response_data);
String apps_str = data_obj.get("body").get("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));

5.BeanShell断言

5.1 数据断言 

内置变量
Failure:是否失败, boolean类型
FailureMessage:失败日志,在断言失败时显示

int iStock = Integer.parselnt(vars.get("p_stock")); 
if (iStock >1500){ 
  Failure =true;
  FailureMessage ="库存数量超过了1500";
  // ResponseData是服务器返回的byte[]类型的数据
  // 如果想打印,必须转换为String类型的,用new String(ResponseData) 
  log.info(new String(ResponseData));
  //打印当前请求的url,SamplerData是String类型的数据 
  log.info(SamplerData);
}

5.2 状态断言 

//状态码断言
log.info("状态码:" + ResponseCode);
if(ResponseCode.equals("200")){ 
	Failure=false;
}
else{
	Failure=true;
	FailureMessage="响应状态码非200";  //指定失败原因
}

5.3 响应体断言

//获取响应数据
Stringresponse= prev.getResponseDataAsString();
log.info("响应体:" + response);
//响应数据包含if(response.contains("登录成功")){
	Failure=false;
}
else{
	Failure=true;
	FailureMessage="响应数据不包含登录成功";
}

5.4 json值断言 

//JSON响应断言
import org.json.*;   //导入org.json包
Stringresponse= prev.getResponseDataAsString();  
//获取响应数据
JSONObjectresponseJson=newJSONObject(response);  
//转为JSON对象
Stringmessage= responseJson.getString("message"); 
log.info("响应message字段:" + message);
 
if(message.equals("成功")){
	Failure=false;
}
else{
	Failure=true;
	FailureMessage="响应message字段非成功";
}

6.BeanShell写数据到文件

这如果保存后就可以用到其他线程里当参数了,很实用
以后只需要更改下面的部分,这个文件就可以用了

"csrf_token" "/Users/mac/Documents/study23/jmeter/output.txt"

需求
1、调用登录接口,获取token值
2、将token值保存到一个文件里

String line = vars.get("csrf_token"); 
try {
    BufferedWriter writer = new BufferedWriter(new FileWriter("/Users/mac/Documents/study23/jmeter/output.txt",true)); 
    writer.write(line); 
    writer.newLine(); 
    writer.close();
} catch (IOException e) {
    e.printStackTrace();
}

运行会自动生成一个 txt文件

7.引用外部class文件 

1、直接把上例中的java文件编译成class文件

进入java路径下,使用javac Md5Util.java就会编译成.class文件,同目录自动生成.class文件

【注意】macos上此处有大坑
这里有一个大坑,调用class文件时:addClassPath()方法中的路径,在macos上不能写成文件的绝对路径。这个路径只能写到包名的前一级,不能包含包名。
如果拿到的是一个单独的class文件,一定要反编译,检查包名,将这个class文件的包名层级新建出来,再将class文件放进去

2、BeanShell使用代码如下:

  用addClassPath(path)方法引入 class文件,在用import导入包及类,然后就可以像java一样调用了

//引入class文件
addClassPath("/Users/mac/Documents/study23/jmeter/md5");
//导入类名
import Md5Util
// import 包名.类名
//生成随机手机号
String phone = "135${__Random(10000000,99999999,myPhone)}"; 
String code = "testmay";
//生成时间戳
String time = "${__time(,myTime)}";
// 调用外部函数进行加密
String md5 = Md5Util.getMd5Hex(phone+code+time);
// 将数据另存为新的变量
vars.put("phone",phone); 
vars.put("md5",md5);
log.info(md5)

8.获取数据库数据并入参

jmeter数据库连接 

8.1 添加配置元件 JDBC Connection Configuration

8.2 添加取样器JDBC  Request

8.3 添加后置处理器 JDBC Postprocessor

import java.util.Random;

Random random=new Random();
Object object=vars.getObject("object");  //获取sql查询结果

int size=object.size();   //获取查询结果数量
line_0 = object.get(0);   //获取object的第一个元素
filed_name = line_0.get("title");  //获取title字段的值

vars.put("size",size.toString());   //将size转换成字符串,存到变量size中
vars.put("line_0",line_0.toString());
vars.put("filed_name",filed_name.toString());

String[] fields={"title","price"};   //创建一个字符数组,里面为需要作为入参的字段

log.info(" ");
log.info("========================开始打印日志====================");
log.info("size:" + vars.get("size"));
log.info("line_0:" + vars.get("line_0"));
log.info("filed_name:" + vars.get("filed_name"));

运行

8.4 参数调用

${file_name} 

${size}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/577684.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

RGB灯珠的控制-单片机通用模板

RGB灯珠的控制-单片机通用模板 一、RGB控制的原理二、RGB.c的实现三、RGB.h的实现四、color色彩空间变换以及控制渐变一、RGB控制的原理 ①通过IO发送脉冲识别0/1编码,组合24Bit的RGB数据,从而控制RGB;②每个RGB灯珠通过DIN、DOU进行级联起来;③通过HSV色彩转换成RGB从而控…

BUUCTF--web(2)

1、[HCTF 2018]admin1 打开题目后发现有注册和登录两个页面&#xff0c;因为题目提示admin&#xff0c;尝试用admin进行爆破 爆破得到密码为123 登录得到flag 2、[护网杯 2018]easy_tornado1 打开题目后有三个文件&#xff0c;分别打开查看 在url地址栏中发现包含两个参数&a…

[图解]领域驱动设计伪创新-为什么互联网是重灾区-01

0 00:00:00,840 --> 00:00:03,270 今天我们来说一下 1 00:00:03,650 --> 00:00:06,255 领域驱动设计伪创新 2 00:00:06,255 --> 00:00:08,860 为什么互联网是重灾区 3 00:00:09,500 --> 00:00:12,610 这个我们分几个视频来讲 4 00:00:15,620 --> 00:00:17,5…

FIB和RIB基础

1.思考以下的topo从数据层面和控制层面分别是如何通信的 &#xff08;1&#xff09;数据层面&#xff1b;数据包从PC1经过AR1 AR2最后到达PC2&#xff0c;这就是数据层面的通信。 &#xff08;2&#xff09;控制层面&#xff1a;PC2所在的网段192.168.2.0/24是经过AR2传递给AR…

TCN-LSTM时间卷积网络长短期记忆网络多输入多输出回归预测

文章目录 效果一览文章概述 订阅专栏只能获取一份代码部分源码参考资料 效果一览 文章概述 TCN-LSTM时间卷积网络长短期记忆网络多输入多输出回归预测 matlab2021 订阅专栏只能获取一份代码 部分源码 %------------------------------------------------------------------…

SpringBoot模块化时遇到Could not autowire. No beans of ‘xxxService‘ type found.错误

SpringBoot模块化时遇到Could not autowire. No beans of xxxService type found.错误 一、SpringBoot模块化时遇到Could not autowire. No beans of xxxService type found.错误二、解决办法一三、解决办法二 一、SpringBoot模块化时遇到Could not autowire. No beans of ‘xx…

快手面试算法真题

按照html中的标签层数遍历节点名。 例如&#xff1a;html代码如下&#xff1a;(上面的数字表示层数) <!-- 1 --><div class"div1"><!-- 2 --><span class"span1"></span><!-- 2 --><p class"p1"><…

架构师系列- JVM(三)- 类加载

通过字节码&#xff0c;我们了解了class文件的结构 通过运行数据区&#xff0c;我们了解了jvm内部的内存划分及结构 接下来&#xff0c;让我们看看&#xff0c;字节码怎么进入jvm的内存空间&#xff0c;各自进入那个空间&#xff0c;以及怎么跑起来。 4.1 加载 4.1.1 概述 …

天线驻波比参数测试方法

驻波比也叫电压驻波比&#xff0c;是指传输线中最大电压与最小电压的比值&#xff0c;是衡量天线与馈线匹配程度的重要参数&#xff0c;影响着信号传输的质量和效率。因此&#xff0c;驻波比测试是天线测试的重要环节。那么&#xff0c;天线驻波比测试都有哪些测试方法呢&#…

[C++ QT项目实战]----C++ QT系统登陆界面设计

前言 在C QT项目开发过程中&#xff0c;设计系统登录界面可以使用QT框架来实现。以下是一个简单的系统登录界面设计示例&#xff1a; 创建登录界面UI&#xff1a;可以使用QT Designer来设计登录界面的UI&#xff0c;包括用户名输入框、密码输入框、登录按钮等。在QT Designer中…

C++ 头文件/宏冲突问题解决?如何解决?

&#x1f3c6;本文收录于「Bug调优」专栏&#xff0c;主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案&#xff0c;希望能够助你一臂之力&#xff0c;帮你早日登顶实现财富自由&#x1f680;&#xff1b;同时&#xff0c;欢迎大家关注&&收藏&&…

untiy avpro播放超过8K视频的解决方案

安转LAV Filters解码器&#xff0c;然后指定Avpro使用这个解码器播放即可 第一步 安装解码器 下载链接 第二步 AVPro设置 MediaPlayer脚本中一共两处

element 分页切换时:current-page无效 页数不会跟着一起切换

问题回溯&#xff1a;使用el-pagination组件 选择切换当前分页 页数为2 问题结果&#xff1a;el-pagination组件 当前页切换失败 一直都是 1&#xff0c;接口传参分页数据是2&#xff0c;打印当前分页也是2 解决方案1&#xff1a;使用 current-page参数 .sync 修饰符 解决方案2…

服务器数据恢复—Storwize V3700存储数据恢复案例

服务器存储数据恢复环境&#xff1a; 某品牌Storwize V3700存储&#xff0c;10块硬盘组建了2组Mdisk加入到一个存储池中&#xff0c;一共创建了1个通用卷来存放数据&#xff0c;主要数据为oracle数据库。 服务器存储故障&#xff1a; 其中一组Mdisk中两块磁盘出现故障离线&…

PDF 书签制作与调整 从可编辑、不可编辑 PDF 文档创建书签的方法

本文是对以前发表的旧文拆分&#xff0c;因为原文主题太多&#xff0c;过长&#xff0c;特另起一篇分述。 第一部分 由可编辑 PDF 文档创建书签 方法 1. Adobe Acrobat Pro autobookmark AutoBookmark 是一个可用于 Adobe Acrobat 自动生成书签的插件。 官方下载地址&…

c语言指针的应用场景

​ 1.什么是指针&#xff1f; 当我们提起指针的时候&#xff0c;可能第一反应会露出惊喜的表情 &#xff08;但是我们其实没必要那么慌&#xff0c;因为当我们随着我们学习的越来越深入就会发现&#xff0c;指针虽然看起来难&#xff0c;实际上也不怎么简单。哈哈哈开玩笑的&a…

Vitis HLS 学习笔记--Syn Report解读(1)

目录 1. 介绍 2. 示例一 2.1 HLS 代码 2.2 Report 解读 2.2.1 General Information 2.2.2 Timing Estimate 2.2.3 Performance & Resource Estimates 2.2.4 HW interfaces 2.2.4.1 硬件接口报告 2.2.4.2 导出至 Vivado 中的 IP 2.2.4.3 Port-Level Protocols 端…

如何安全进行速卖通自养号测评操作?

对于新加入的卖家而言&#xff0c;进行销量测评显得尤为关键。速卖通平台上的新店往往难以获得活动的扶持&#xff0c;且初始流量相当有限。因此&#xff0c;开店的首要任务便是积极展开测评工作&#xff0c;努力积累初始的评论和销售记录。测评的益处颇为显著&#xff0c;它不…

【Redis 开发】Redisson

Redisson RedissonRedisson分布式锁Redisson可重入锁Redission解决超时释放的问题Redission解决锁的判断一次性问题Redission分布式锁主从一致性问题 Redisson Redisson是一个在Redis的基础上实现的java驻内存数据网格&#xff0c;就是提供了一系列的分布式的java对象 官方地址…

嵌入式学习Day19

输入一个数字&#xff0c;实现数字的逆置&#xff0c;不使用字符串截取的方式 代码&#xff1a; #&#xff01;/bin/bash echo number reverse read -p "please number:" num t0 while [ $num -ne 0 ] dot$((t*10num%10))((num/10)) done echo $t运行结果&#xff…
最新文章