[转帖]jmeter 使用beanshell 编写脚本
目录
3.2 例子二 jmeter 接收beanshell 生成的变量
一、介绍
1.1 介绍
BeanShell是一个小型的、免费的、可嵌入使用Java编写的具有对象脚本语言特性的Java源码解释器。
动态执行所有Java语句、Java代码片段以及弱类型Java和附加的脚本的便利
透明地访问所有Java对象和API
四种运行模式:命令行、控制台、Applet、远程会话服务
可以在受安全限制的环境下工作,不需要类加载器或者绝大多数功能的字节码生成器
程序只有大约150K的Jar文件
纯Java
免费
编写baanshell脚本,使用的语言,几乎跟java一模一样。
1.2 下载&启动
下载:
BeanShell下载地址是:www.beanshell.org

下载下来是一个jar包,bsh-2.0b4.jar
启动:
启动有四种方式,我只用一种方式,其他的可以去百度一下。
在终端中,执行命令
java -jar bsh-2.0b4.jar

二、jmeter中创建beanshell脚本

线程组--》添加--》取样器/sampler --》 BeanShell 取样器

脚本文件:我们可以直接引入写好的脚本
脚本:我们自己在jmeter中手写脚本的地方。
三、jmeter与beanshell 数据交互
jmeter与beanshell 数据交互,是通过函数实现的。
vars(JMeterVariables) : 操作jmeter 变量,常用方法:
vars.get(String key) : 从jmeter中获得变量值
vars.put(String key,String value): 将数据存到jmeter变量中。
-------小技巧---------------------
我们可以先在idea中,编写beanshell脚本,写完之后,再复制到jmeter中。(因为jmeter 编写脚本时,不方便,没有错误提示等功能)
3.1 例子1 beanshell 将变量传给jmeter

beanshell 脚本:
-
a= 1;
-
b=4;
-
q = a+b;
-
vars.put("q",q+"")
运行,然后去结果树中,查看日志。

注意:
在脚本中,put q时,为啥要+“” ?
因为put函数,key 与value 都要求是String格式的,但是在我们的这个脚本中,得到的q的值是
int类型的,所以要先转成String再put。(int+Sttring=String)
vars.put(String key,String value):
3.2 例子二 jmeter 接收beanshell 生成的变量
背景:
一个接口请求,传参,要求传当前的时间,且格式为 yyyy-MM-dd HH:mm:ss
处理方案:
beanshell 脚本,将当前时间,格式化为 yyyy-MM-dd HH:mm:ss 格式,然后将值传给jmeter
整个jmeter 脚本结构

beanshell脚本编写:
-
import java.text.*;
-
import java.util.*;
-
DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
-
Date d = new Date();
-
String dateStr = df.format(d);
-
vars.put("current_date",dateStr);
HTTP 请求,接收参数,current_date
${current_date}

运行jmeter脚本,查看结果树。

变量引用成功。
四、jmeter中Beanshell 调用 java 代码
4.1 调用java文件
语法:
source(" java 文件路径") 其中文件路径可以使用绝对路径,也可以使用相对路径。
source("E:\eclipse\workspace\MD5\src\jmeter\MD5.java"); 或者: source("MD5.java"); --文件位于 jmeter bin 目录下
String strMd5 = MD5.GetMD5Code("123456");
举例:
1、我自定义了一个类CsDIY.java
package bingfa; import java.text.*; import java.util.*; public class CsDIY { public String getCurrentDate(){ DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); Date d = new Date(); String dateStr = df.format(d); return dateStr; } }
然后将CsDIY.java 放置在了我电脑桌面上。
2、Beanshell脚本,引用CsDIY.java这个类,并调用其中方法
-
source("/Users/zhaohui/Desktop/CsDIY.java");
-
CsDIY cs = new CsDIY();
-
String dateSSS = cs.getCurrentDate();
-
vars.put("dateSSS",dateSSS)
3、接口请求,使用变量

4.2 beanshell调用外部 jar 包
1、提前把 jar 包放入 jmeter lib\ext 目录下并重启;
2、在jmeter 线程组下,添加http sampler->BeanShell Sampler
3、在beasnshell 中的头文件,导入该jar包
import 类名;
示例:
import com.MD5;
String strMd5 = MD5.GetMD5Code("123456");
五、beanshell 打印日志
log: 写入信息到jmeter.log文件中,使用方法:
log.info("这里是日志");
报错:
ERROR o.a.j.u.BeanShellInterpreter: Error invoking bsh method: eval In file: inline evaluation of: `
WARN o.a.j.p.j.s.BeanShellSampler: Exception executing script. org.apache.jorphan.util.JMeterException: Error invoking bsh method: eval In file:
报错处理:
我没搞定哇。。
六、线程组1生成的动态变量给线程组2用
6.1 背景:
测试计划下,两个线程组,线程组1和线程组2。 需要将线程组1 beanshell 脚本产生的变量,给线程组2 用。
6.2 独立运行线程组:
当运行测试计划时,线程组1与线程组2是同时运行的。我们需要先运行线程组1,再运行线程组2,为了保证线程组运行顺序,我们需要在测试计划中,勾选独立运行线程组。

6.3 解决思路及方案
思路:
1、线程组1生成变量时,将变量设置为全局变量。
props.put("xx",xxx);
2、线程组2,取变量时,取这个全局变量
props.get("xx")
方案一:使用beanshell
在线程组2中,写一个beanshell 脚本,使用props.get("xx") 去取变量
方案二:使用函数助手
工具--函数助手--BeanShell
在表达式中,填写 props.get("xx")
然后点击生成
再在线程组2中,直接使用${__BeanShell(props.get("dateSSS"),)}

七、prev 获取前面的sample返回的信息,再做处理
getResponseDataAsString():获取响应信息
getResponseCode(): 获取响应信息
setDataEncoding(String dataEncoding): 设置响应结果的编码
7.1 设置上一个sample 的响应结果的编码
举例:
背景:
jmeter脚本结构:

对 www.baidu.com ,发出请求,查看返回结果:
发现结果树中,中文都是乱码的。

解决办法:
修改返回结果的编码。
1、在该线程组中,加一个BeanShell 取样器(添加--》取样器--〉 BeanShell 取样器)

2、 BeanShell 取样器 中编写脚本
prev.setDataEncoding("utf-8");
3、将 BeanShell 取样器 放置在被测http请求的后面。(注意放置位置)

再次进行请求,结果树中的响应结果,就不会再乱码了。
八、beanshell应用
BeanShell PreProcessor
提前处理请求参数,如:图片处理,加密解密等
BeanShell PostProcessor
在请求后对返回结果进行处理
BeanShell 断言
验证返回结果的正确性
BeanShell Sampler
8.1 验签处理&加密
<div id="blogExtensionBox" style="width:400px;margin:auto;margin-top:12px" class="blog-extension-box"><div class="blog_extension blog_extension_type2" id="blog_extension">
<div class="extension_official" data-report-click="{"spm":"1001.2101.3001.6471"}" data-report-view="{"spm":"1001.2101.3001.6471"}">
<div class="blog_extension_card_left">
<img src="https://img-blog.csdnimg.cn/ab4f72676f0847b58f9a9f7e207f1466.jpeg" alt="">
</div>
<div class="blog_extension_card_cont">
<span class="text">测试童鞋</span>
<div class="blog_extension_card_cont_r">
<img class="weixin" src="https://g.csdnimg.cn/extension-box/1.1.6/image/weixin.png" alt="">
<span>微信名片</span>
</div>
</div>
<img class="blog_extension_card_right" src="https://g.csdnimg.cn/extension-box/1.1.6/image/ic_move.png" alt="">
</div></div></div>
</article>
[转帖]jmeter 使用beanshell 编写脚本的更多相关文章
- jmeter通过BeanShell 脚本,实现对http请求参数的加密
jmeter一直是一款很好的接口和性能测试工具,它是开源的,不需要为此支付任何费用,而且可以下载源码,可以在修改源代码并在此基础上拓展自己的功能或插件,它可以跟ant和jenkins结合起来搭建自己的 ...
- Jmeter脚本录制方法(二)——手工编写脚本(jmeter与fiddler结合使用)
jmeter脚本录制方法可以分三种,前几天写的一篇文章中,已介绍了前两种,今天来说下第三种,手工编写脚本,建议使用这一种方法,虽然写的过程有点繁琐,但调试脚本比前两者方式都要便捷. 首先来看下三种方式 ...
- Jmeter脚本录制方法(二)手工编写脚本(jmeter与fiddler结合使用)
jmeter脚本录制方法可以分三种,前几天写的一篇文章中,已介绍了前两种,今天来说下第三种,手工编写脚本,建议使用这一种方法,虽然写的过程有点繁琐,但调试脚本比前两者方式都要便捷. 首先来看下三种方式 ...
- Jmeter 在 beanshell 脚本中写日志
JMETER 在执行时,会写日志数据,我们在编写脚本的时候也可以自己写日志. 日志记录再jmeter 的bin 目录的 jmeter.log 文件中. jmeter 比较人性化,它在这里提供了脚本可以 ...
- jmeter用BeanShell调用jar包对HTTP请求中的参数进行MD5加密
前提: eclipse.JDK.Jmeter 说明: 本文分为两部分进行配置说明 第一部分:编写JavaMD5加密脚本 第二部分:使用Jmeter的BeanShell进行验证 ************ ...
- Jmeter之BeanShell变量使用讲解
一.在测试过程中经常会遇到一些业务逻辑处理需要,单纯的线程设置不能满足,这时候就要使用BeanShell编写一定的脚本 前置处理器:BeanShell PreProcessor,主要接口请求前做一些参 ...
- 『动善时』JMeter基础 — 31、JMeter中BeanShell断言详解
目录 1.BeanShell简介 2.Beanshell的内置变量和方法 3.BeanShell断言界面详解 4.BeanShell断言的使用 (1)测试计划内包含的元件 (2)登陆接口请求界面内容 ...
- JMeter中BeanShell实现写入文件
1.首先F:\test.txt文件为空
- JMeter中BeanShell的实际应用
使用Jmeter的BeanShell断言,把响应数据中的JSON跟数据库中的记录对比 很多时候我们需要把Response Data取到的 Json 字符串跟数据库里的对比,来验证接口的正确性,使用Be ...
- jmeter之beanshell取出需要参数,传递给下个请求
jmeter之beanshell取出需要参数,传递给下个请求 事件背景: 上周同事用jmeter录制脚本,录制成功回放后,并没有达到自己想要的结果. ps:他想从数据库取出某个字段值,然后对数据库做操 ...
随机推荐
- 在云南,我用华为云AI开发出千万级用户的应用
摘要:创造无限,当"燃"是开发者,华为云1024程序员节,陶新乐和大家分享独立开发者的自由之路. 本文分享自华为云社区<在云南,我用华为云AI开发出千万级用户的应用>, ...
- 复杂查询so easy ,GaussDB(for Cassandra)推Lucene引擎全新解决方案
摘要:复杂查询so easy!GaussDB(for Cassandra)新特性来袭. 本文分享自华为云社区<来了!GaussDB(for Cassandra)新特性亮相>,作者:Gaus ...
- Karmada v1.2发布:开启全文本搜索新纪元
摘要:Karmada v1.2 版本对调度器能力做了较大增强,初步提供了分布式搜索引擎支持,此外还借助聚合API提供了诸如 logs, watch等实用的命令行工具,资源解释器(Resource In ...
- 关于Spring注解开发教程,打包全送你
摘要:spring是我们web开发中必不可少的一个框架,基于传统的xml方式配置bean总觉得太过繁琐,从spring2.5之后注解的出现可以大大简化我们的配置. 本文分享自华为云社区<如何高效 ...
- 火山引擎 DataTester 揭秘:字节如何用 A/B 测试,解决增长问题的?
更多技术交流.求职机会,欢迎关注字节跳动数据平台微信公众号,回复[1]进入官方交流群 上线六年,字节跳动的短视频产品--抖音已成为许多人记录美好生活的平台.除了抖音,字节跳动旗下还同时运营着数十款 ...
- 朋友们,就在今天,JDK 21,它终于带着重磅新特性正式发布了!
你好呀,我是歪歪. 朋友们,好消息,好消息,重磅好消息. 从今年年初就一直在喊的具有革命性.未来性.开创新纪元的 JDK 21 按照官方的时间计划表,今天终于是要正式 GA 了: https://op ...
- Jenkins Pipeline 多分支流水线 Input length = 1
Jenkins 多分支流水线 构建过程中报错. [Pipeline] // node [Pipeline] End of Pipeline java.nio.charset.MalformedInpu ...
- web自动化-selenium携带cookie免密登录
在我们做web自动化的时候,经常会遇到含有登录的页面,我们必须登录之后才能够对我们想要操作的页面元素进行定位,也就是说所有的操作都在登录前提下,其实没必要每次请求都先登录,当我们登录成功了,会在coo ...
- Python 网络舆情分析系统,舆论可视化界面
1 简介 舆情管理系统,这不仅仅可以帮助当地的管理人员迅速的排查跟本地有关的负面言论,还可以避免网民因为本身意识不到位而评论或发布一些不好的观点的情况,最终的目的就是帮助社会更好的发展. 2 技术栈 ...
- 转载--阿里云ECS自建K8S集群
一.概述(官方建议) 集群规划 目前在创建Kubernetes集群时,存在着使用很多小规格ECS的现象,这样做有以下弊端: 小规格Woker ECS的网络资源受限. 如果一个容器基本可以占用一个小规格 ...
