玩转jmeter:beanshell必备技能
beanshell是什么
BeanShell是一个小型嵌入式Java源代码解释器,具有对象脚本语言特性,能够动态地执行标准JAVA语法,并利用在JavaScript和Perl中常见的的松散类型、命令、闭包等通用脚本来对其进行拓展。BeanShell不仅仅可以通过运行其内部的脚本来处理Java应用程序,还可以在运行过程中动态执行你java应用程序执行java代码。因为BeanShell是用java写的,运行在同一个虚拟机的应用程序,因此可以自由地引用对象脚本并返回结果。(摘抄自网络)
下载及运行
下载地址:https://beanshell.github.io/download.html

java -jar直接运行

测试

其它方式启动:先把jar包加入到环境变量

界面UI方式 :java bsh.Console



命令行方式 :java bsh.Interpreter
运行脚本文件:java bsh.Interpreter filename [args]
第二个例子

运行结果
如果jar包没加到环境变量,可以这样运行:java -classpath %CLASSPATH%;bsh-2.0b4.jar bsh.Interpreter test.txt

常用命令
print() 输出内容到命令行中
source()读一个bsh脚本到当前解释器(interpreter)中,或者在新的解释器中运行这个脚本
而我们的jmeter中,已经自带了jar包,下面介绍jmeter中如何使用beanshell

添加变量

引用变量

发送请求,可以看到密码加密了

自定义函数
上面也可以封装为函数
下面方法返回类型为void
import org.apache.commons.codec.digest.DigestUtils;
public static void fun(){
String password_md5 = DigestUtils.md5Hex("123456");
vars.put("password_md5", password_md5);
}
fun();
下面方法返回类型为String
import org.apache.commons.codec.digest.DigestUtils;
public static String fun(){
String password_md5 = DigestUtils.md5Hex("123456");
print(password_md5); // 在命令行窗口打印结果
return password_md5;
}
String password_md5 = fun();
vars.put("password_md5", password_md5);
也可以写成这样(方法不写返回类型)
import org.apache.commons.codec.digest.DigestUtils;
fun(){
String password_md5 = DigestUtils.md5Hex("123456");
print(password_md5); // 在命令行窗口打印结果
return password_md5;
}
String password_md5 = fun();
vars.put("password_md5", password_md5);

甚至写成这样(定义的变量也没类型)
import org.apache.commons.codec.digest.DigestUtils;
fun(){
String password_md5_res = DigestUtils.md5Hex("123456");
print(password_md5_res); // 在命令行窗口打印结果
return password_md5_res;
}
password_md5 = fun();
vars.put("password_md5", password_md5);
但是还是推荐按照java的方式写,严格定义。
引用java文件、class文件、jar文件
详见微信公众号:全栈测试笔记

常用内置变量
JMeter在它的BeanShell中内置了变量,用户可以通过这些变量与JMeter进行交互。
log vars prev Failure FailureMessage
具体用法请百度,本篇的示例中也有使用到。
beanshell组件
Jmeter中包括多种BeanShell,用法差不多,只是作用的地方不同。
定时器: BeanShell Timer
前置处理器:BeanShell PreProcessor,提前处理请求参数,如:加密解密等
采样器: BeanShell Sampler
后置处理器:BeanShell PostProcessor,在请求后对返回结果进行处理
断言: BeanShell断言,验证返回结果的正确性
监听器: BeanShell Listener
下面举例几个常用的。
beanshell采样器

引用变量

发送请求,可以看到密码加密了

beanshell前置处理器

beanshell断言
pom依赖
<dependencies>
<!-- https://mvnrepository.com/artifact/com.alibaba/fastjson -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.49</version>
</dependency>
</dependencies>
代码及打的jar包

把jar包复制到jmeter的lib下ext中,重启jmeter
添加用户定义变量

请求

beanshell前置处理器,加密密码

beanshell断言

完整脚本
import com.uncleyong.JsonToJSONObject;
import com.alibaba.fastjson.JSONObject; // 不能少,下面定义了JSONObject类型 print("===========开始执行==========");
String exp_result = vars.get("exp_result");
print("exp_result= " + exp_result);
print("exp_result的类型:" + exp_result.getClass().toString()); // exp_result的类型:class java.lang.String
//Integer.valueOf返回的是Integer对象,Integer.parseInt返回的是int
Integer exp_result2 = Integer.valueOf(exp_result);
print("exp_result2的类型:" + exp_result2.getClass().toString()); // exp_result2的类型:class java.lang.Integer String jsonString = prev.getResponseDataAsString();
print("获取到的返回结果:" + jsonString);
print("返回结果的类型:" + jsonString.getClass().toString()); // 返回结果的类型:class java.lang.String JSONObject responseJson = new JsonToJSONObject().JSONObjectUtil(jsonString);
print("转换后的返回结果:" + responseJson);
print("转换后的返回结果类型:" + responseJson.getClass()); // 转换后的返回结果类型:class com.alibaba.fastjson.JSONObject String code = responseJson.getString("code");
print("code = " + code);
print("code的类型:" + code.getClass()); // code的类型:class java.lang.String
Integer code2 = responseJson.getInteger("code");
print("code2 = " + code2);
print("code2的类型:" + code2.getClass()); // code2的类型:class java.lang.Integer //if (code.equals(exp_result)==false) {
if (code2 != exp_result3) {
print("--------进入if语句--------");
Failure = true;
FailureMessage = "code与实际值不一致,期望值" + exp_result + ", 实际值" + code;
}
print("===========结束执行==========");
运行结果



手把手实践
《jmeter对接口测试入参进行MD5加密的5种方式》,详见微信公众号:全栈测试笔记
https://www.cnblogs.com/uncleyong/protected/p/9429752.html
《性能测试:jmeter中通过beanshell把关联转变成参数化》
https://www.cnblogs.com/uncleyong/p/10986466.html
玩转jmeter:beanshell必备技能的更多相关文章
- Android高工必备技能
转载:http://www.jianshu.com/p/d791bbede02c Step 1. 玩转RxJava 使用RxJava处理异步极其方便,各种操作符可以对数据做流水线式操作,再加上与Ret ...
- 高级Linux运维工程师必备技能(扫盲篇)
高级Linux运维工程师必备技能(扫盲篇) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 在了解文件系统之前,我们要学习一下磁盘存储数据的方式,大家都知道文件从内存若要持久化存储的 ...
- JMeter BeanShell示例
翻译:https://blog.trigent.com/jmeter-blog-series-jmeter-beanshell-example 在这个例子中,我们将演示在Apache JMeter中使 ...
- JMeter博客系列:JMeter BeanShell示例
1.简介 Apache JMeter是一个基于Java的开源工具,使您可以在应用程序上执行功能,负载,性能和回归测试.应用程序可以在Web服务器上运行,也可以是独立的.它支持在包含静态和动态资源的客户 ...
- java高并发系列 - 第15天:JUC中的Semaphore,最简单的限流工具类,必备技能
这是java高并发系列第15篇文章 Semaphore(信号量)为多线程协作提供了更为强大的控制方法,前面的文章中我们学了synchronized和重入锁ReentrantLock,这2种锁一次都只能 ...
- Jmeter Beanshell 编程简介
简介 Jmeter除了提供丰富的组件以外,还提供脚本支持,可通过编写脚本来丰富Jmeter,实现普通组件无法完成的功能.Beanshell是一种轻量级的Java脚本语言,完全符合Java规范,并且内置 ...
- 详解linux运维工程师入门级必备技能
详解linux运维工程师入门级必备技能 | 浏览:659 | 更新:2013-12-24 23:23 | 标签:linux it自动化运维就是要很方便的运用各种工具进行管理维护,有效的实施服务器保护 ...
- 自动化部署必备技能—部署yum仓库、定制rpm包
部署yum仓库.定制rpm包 目录 第1章 扩展 - yum缓存 1.1 yum缓存使用步骤... 1 1.1.1 导言... 1 1.1.2 修改配置文件... 1 1.1.3 使用缓存... 1 ...
- 【转帖】系统软件工程师必备技能-进程内存的working set size(WSS)测量
系统软件工程师必备技能-进程内存的working set size(WSS)测量 2018年12月28日 18:43:01 Linuxer_ 阅读数:145 https://blog.csdn.net ...
随机推荐
- Qt 调试信息、打印信息、输出到文本
void debug_msg(QVariant msg) { ; QFile file("debug_msg.txt"); ) { i = ; file.open(QFile::W ...
- ConcurrentHashMap竟然也有死循环问题?
前几天和朋友闲聊,说遇到了一个ConcurrentHashMap死循环问题,当时心里想这不科学呀?ConcurrentHashMap怎么还有死循环呢,毕竟它已经解决HashMap中rehash中死循环 ...
- IIS上传文件大小限制和上传时间限制
1.打开某一发布网站的配置编辑器 2.设置上传时间限制 3.设置上传文件大小限制 另一种方法: 直接在网站根目录建一个web.config文件 <?xml version="1.0&q ...
- Word文字中嵌套的图片向上突出,与文字的高度不一致
文字中嵌套的图片向上突出,与文字的高度不一致. 调整方法: 选中图片,找到Font字体设置,选中位置下拉框,选择适当项. Select the inline graphic by clicking o ...
- 使用velero进行kubernetes灾备
使用velero可以对集群进行备份和恢复,降低集群DR造成的影响.velero的基本原理就是将集群的数据备份到对象存储中,在恢复的时候将数据从对象存储中拉取下来.可以从官方文档查看可接收的对象存储,本 ...
- 更新element-ui版本
1. 卸载当前版本 npm uninstall element-ui 2. 安装指定版本 npm -S
- RDD的转换操作,分三种:单value,双value交互,(k,v)对
import org.apache.spark.rdd.RDDimport org.apache.spark.{Partitioner, SparkConf, SparkContext} object ...
- 【BZOJ4833】最小公倍佩尔数(min-max容斥)
[BZOJ4833]最小公倍佩尔数(min-max容斥) 题面 BZOJ 题解 首先考虑怎么求\(f(n)\),考虑递推这个东西 \((1+\sqrt 2)(e(n-1)+f(n-1)\sqrt 2) ...
- Python模块File文件操作
Python模块File简介 Python提供了File模块进行文件的操作,他是Python的内置模块.我们在使用File模块的时候,必须先用Popen()函数打开一个文件,在使用结束需要close关 ...
- Linux yum的配置 , python环境管理, nginx搭建简单学习
Linux yum的配置 , python环境管理, nginx搭建简单学习 一丶配置yum的数据仓库 ### yum 工具, 方便,自行解决软件之间的依赖关系. # 配置yum源仓库 (可以使用,清 ...