一.什么是BeanShell
- Java写成的⼩型、免费的Java源代码解释器
- 可以执⾏标准Java语句和表达式,完全符合java语法的java脚本语⾔(需要会javase语⾔)
- 包括⼀些脚本命令,有⾃⼰的⼀些语法和⽅法,是⼀种松散类型的脚本语⾔(这点和JS类似)
- ⽤于⼀些复杂的个性化需求,使⽤更灵活,功能更强⼤
- 官⽹地址:http://www.beanshell.org
二.常用的BeanShell
Jmeter中包含如下BeanShell:
定时器:BeanShell Timer
前置处理器:BeanShell PreProcessor(提前对参数处理⽐如加密编码)
采样器:BeanShell 取样器
后置处理器:BeanShell 后置处理程序(对返回结果做处理)
断言:BeanShell断言(验证请求接⼝是否满⾜要求)
监听器:BeanShell监听器
三.BeanShell内置对象,可以直接使⽤
3.1log
- 作用:用于日志记录
- 示例:
创建线程组-创建BeanShell取样器-编写脚本
打开日志(用于调试脚本)
运行结果
3.2vars
vars是用来操作jmeter变量,这个变量实际引用了JMeter线程中的局部变量容器(类似于java中的Map),它是测试用例与BeanShell交互的桥梁,常用方法:
a) vars.get(String key):从jmeter中获得变量值
b) vars.put(String key,String value):数据存到jmeter变量中
例:vars.get("title");从jmeter中获得变量值
vars.put("title","javase课程");数据存到jmeter变量中
3.3props
props是操作jmeter属性,该变量引用了JMeter的配置信息,可以获取Jmeter的属性,它的使用方法与vars类似,但是只能put进去String类型的值,而不能是一个对象。对应于java.util.Properties。
3.4prev
prev:获取前面的sample返回的信息
prev的常用方法:
a) getResponseDataAsString():获取响应信息
b) getResponseCode() :获取响应code
四.实际运用场景
4.1项目环境准备
请先装好jdk和jmeter
windows环境可参考ant+jmeter+jenkins从0实现持续集成(包含jdk的安装教程)(Windows)-CSDN博客
linux环境可参考
Linux下安装jdk,jmeter,ant,tomcat,jenkins(超详细超全)_linux 安装ant-CSDN博客
4.2运行代码
我们这边提供了后端程序,直接本地启动运⾏即可
本人在windows下运行进行演示
如有需要上图的文件,可自行在资源中下载或者私信我!!!
后端接⼝说明,端⼝8080
接⼝介绍 | 接⼝路径 | 参数和备注 | method |
商品列表 | /api/v1/product/list | 不⽤参数 | get |
登录接⼝ | /api/v1/user/login | {"mail":"794666918@qq.com","pwd":"123456"} | post |
⽤户信息 | /api/v1/user/info | 需要登录,http的header⾥⾯加⼊token字段 | get |
秒杀接⼝ | /api/v1/product/second_kill | 不⽤参数,⽤于测试接⼝耗时情况 | get |
商品详情 | /api/v1/product/detail | ⽤于可变参数压测,参数:id和title | get |
秒杀接口的代码讲解
注意:
- 登录账号密码,程序⾥⾯只提供⼀个,所以需要按照上⾯进⾏操作
- 常规就是get、post压测,1个接⼝到100个接⼝都类似
- java -jar xdclass-edu.jar启动不能关闭,是运⾏程序
命令⾏进⼊程序所在路径启动(win、mac、linux命令自⾏参考下)
java -jar xdclass-edu.jar
运行代码
想停止代码运行的话,可ctrl+c
验证代码是否运行成功,访问商品列表接口
4.3Http取样器和BeanShell组合应⽤实战
BeanShell取样器⾥⾯定义变量var
定义Http取样器(用商品详情接口)
读取var变量
引用变量的格式:
${id}、${title}
运行结果
脚本如有需要,可在资源中自行下载
4.4BeanShell断⾔实战
需求
根据业务结果,⾃定义响应断⾔
步骤
新增BeanShell断⾔
核⼼变量
String data = prev.getResponseDataAsString();//获取响应信息
prev.getResponseCode(); //获取响应code
Failure = false;//表示断⾔成功
Failure = true;//表示断⾔失败
使⽤JSON⼯具jar包放⼊jmeter⽬录下的\lib\ext中(记得重启jmeter)
更多api参考https://stleary.github.io/JSON-java/org/json/JSONObject.html
import org.json.*;//导入json工具包
String data = prev.getResponseDataAsString();//获取响应信息
String responseCode = prev.getResponseCode();//获取http响应码
log.info("data="+data);//data是字符串类型,你要转成json类型
log.info("responseCode="+responseCode);//responseCode也是字符串类型
JSONObject jsonobj = new JSONObject(data);//转json对象log.info(jsonobj.toString());
打开日志(选项-日志查看),查看BeanShell断言打印出来的内容
http请求
BeanShell 预处理程序
BeanShell断言
运行结果
注意:如果想模拟断言失败的情况,把BeanShell断言的条件改为 code==1
再运行,就会报错
运行结果
4.5BeanShell使⽤外部Java⽂件实战
需求
- 常规beanshell⾥⾯写代码,适合简单的逻辑
- ⼯作⾥⾯还会⽤到更多⽅法逻辑,需要在idea编辑器⾥⾯写(语法有提示),然后进⾏调⽤
- ⽅式
- jar包:放到的lib⽬录或ext⽬录下,前⾯演示过json⼯具类操作
- java⽂件
步骤
- 使⽤source加载源码,路径可以是绝对路径和相对路径
- 加载源⽂件后可以直接使⽤类名.⽅法名(参数)
实战
CommonUtil.java文件内容
新建BeanShell取样器
source("E:\\愤怒吧小鸟\\小滴课堂\\6章-第6小节\\CommonUtil.java");
String randomCode=CommonUtil.getRandomCode(4);//调用外部CommonUtil.java的类和方法
log.info("randomCode="+randomCode);
String uuid = CommonUtil.generateUUID();
log.info("uuid====="+uuid);
点击运行,查看日志(选项-查看日志)