一、什么是Bean Shell

  • BeanShell是一种完全符合Java语法规范的脚本语言,并且又拥有自己的一些语法和方法;BeanShell是一种松散类型的脚本语言(这点和JS类似);
  • BeanShell是用Java写成的,一个小型的、免费的、可以下载的、嵌入式的Java源代码解释器
  • BeanShell能够动态地执行标准JAVA语法,并利用在JavaScript和Perl中常见的的松散类型、命令、闭包等通用脚本来对其进行拓展。BeanShell不仅仅可以通过运行其内部的脚本来处理Java应用程序,还可以在运行过程中动态执行java应用程序执行java代码。因为BeanShell是用java写的,运行在同一个虚拟机的应用程序,因此可以自由地引用对象脚本并返回结果。
  • BeanShell执行标准Java语句和表达式,另外包括一些脚本命令和语法。

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

jmeter中,Beanshell使用与java请求的区别?

要根据自己的使用场景来选择适合自己的自定义脚本的方式。

BeanShell脚本编写类似于Java脚本。它可以获取、修改系统定义或用户定义的变量值,同时也可以进行一些相应的测试数据处理工作(例如:前置处理器、后置处理器及响应断言中均存在响应的BeanShell应用)。

使用建议  BeanShell是JMeter内置的功能,但是由于它是脚本语言,动态加载执行的,因此效率不是很高,不太适合于在经常执行的场景下,比如将BeanShell放在循环内部,不断地被执行。比较适合的应用场景是放在执行一次、或者少数几次的地方,比如在循环外部读取配置文件内容等。

Java扩展JMeter的实现方式的效率比较高,适合于放在经常执行的测试步骤中,但是由于它不是JMeter内置的功能,扩展起来需要有些工作量,而且部署的时候也比较麻烦(分布式运行的时候需要将自定义的JAR拷贝至所有的机器上)。

从java请求与beanshell请求的原理来考虑:

1、比如测试java接口,确不想继承AbstractJavaSamplerClient,可以考虑用beanshell请求来完成。

2、对数据进行参数化时,比如要对字符串进行加密操作、拼成unique类型的ID、定制时间类型等等,可以用beanShell来完成。

3、线程之间想共享一个变量,可以用beanShell实现。

二、Jmeter有哪些Bean Shell

  • 定时器:  BeanShell Timer  可用来设置线程延迟间隔

  • 前置处理器:BeanShell PreProcessor

  • 采样器:  BeanShell Sampler

  • 后置处理器:BeanShell PostProcessor

  • 断言:   BeanShell断言

  • 监听器:  BeanShell Listener

这几种在使用是时比较类似,只需要用一种重点练习用法就可以。

三、用法

1、Jmeter之Bean shell使用(一)

BeanShell PreProcessor用法(对参数值加密处理返回结果)

常用内置变量

2、Jmeter之Bean shell使用(二)

目录

一、操作变量

二、操作属性

三、自定义函数

四、引用外部java文件

五、引用外部class文件

六、引用外部Jar包

七、其它用法(接受参数, log等)

3、用法简单总结

   1)可使用用户自定义的变量,在simple中对其进行处理(诸如对其加密、类型转换等),后续请求值使用这些变量与定义函数值;

   2)可以在simple中java直接自定义函数,对其一系列处理后,后续请求值使用这些变量与定义函数值;

四、使用案例

案例一:使用Jmeter的BeanShell断言,把响应数据中的JSON跟数据库中的记录对比

案例二:jmeter beanShell 修改http请求参数

案例三:JMeter - BeanShellSampler实现本地AES加密Jmeter接口测试加解密及Bean Shell使用案例

md5加密

import org.apache.commons.codec.digest.DigestUtils;    //导入md5加密的包
String str = ""; //要加密的字符串
String md5_after = DigestUtils.md5Hex(str); // md5加密
vars.put("md5_upper",sign.toUpperCase()); //把加密的结果转成大写的,存到md5_upper这个变量里面,参数化的时候直接用${md5_upper}取值就ok了
vars.put("md5_lower",sign.toLowerCase()); //把加密的结果转成小写的,存到md5_lower这个变量里面,参数化的时候直接用${md5_lower}取值就ok了
vars.put("befor_md5",str); //这个是 加密之前的字符串,在beanshell里面定义的变量参数化的时候不能直接使用,需要用vars.put方法才可以用

如果用到签名算法时,可参考:大众点评API

签名算法类似如下: 
1. 对除appkey以外的所有请求参数进行字典升序排列; 
2. 将以上排序后的参数表进行字符串连接,如key1value1key2value2key3value3...keyNvalueN; 
3. 将app key作为前缀,将app secret作为后缀,对该字符串进行SHA-1计算,并转换成16进制编码;

import org.apache.commons.codec.digest.DigestUtils;  

import java.util.Map;
import java.util.HashMap;
import java.util.Map.Entry; // 定义Secret
String secret = "test"; // 创建参数表
//Map<String, String> paramMap = new HashMap<String, String>();
Map paramMap = new HashMap();
paramMap.put("mobileNumber", "${mobileNumber}");
paramMap.put("loginPword", "test123456");
paramMap.put("time", "${__time(/1000,)}");
paramMap.put("geetest_challenge", "");
paramMap.put("geetest_seccode", "");
paramMap.put("geetest_validate", ""); // 对参数名进行字典排序
String[] keyArray = paramMap.keySet().toArray(new String[0]);
Arrays.sort(keyArray); // 拼接有序的参数名-值串
StringBuilder stringBuilder = new StringBuilder();
for (String key : keyArray)
{
stringBuilder.append(key).append(paramMap.get(key));
} stringBuilder.append(secret);
String s = stringBuilder.toString(); // md5加密
String sign = DigestUtils.md5Hex(s);
vars.put("sign",sign);

案例四:jmeter之BeanShell Sampler

第一步:测试计划添加自定义变量

第二步:添加beanshell请求,处理

第三步:查看结果树,查看结果

result = "\n1:"+bsh.args[0]+"\n"; //1:从参数框中获取参数变量,不适用
result+="2:${testBeanshell}\n"; //2:直接获取变量,操作方便,非常适用
result+="3:"+vars.get("testBeanshell"); //3:从vars内置变量中获取变量,适用
vars.put("testBeanshell","beanshell_change");//改变变量值
result+="\n4:${testBeanshell}";//4:直接获取不生效,因为jmeter还没有对其进行复制
result+="\n5:"+vars.get("testBeanshell");//:5:值改变,容易理解 ResponseCode = 500;//回写请求响应代码,借鉴的http响应码
ResponseMessage = "test ok!!";//回写响应信息
IsSuccess = true;//回写响应结果 log.info("\nlog test:"+result);//调用jmeter内置log对象,日志会打印到jmeter.log中
SampleResult.setResponseData("SampleResult:"+result+"\n");//回写响应数据,SampleResult为jmeter内置回写结果对象,有很多可用方法,可以参看源码
return "return:"+result;//这里的返回值,相当于调用SampleResult.setResponseData()方法,注意使用的return关键字,后面的行都不会执行,且SampleResult.setResponseData("SampleResult:"+result+"\n");也不会执行,这里会被return的结果覆盖。但是用SampleResult.setResponseData()方法回写,后续还可以接代码行,因此建议不用return进行回写响应数据。

红色标注的为入参。可以直接用seling OK中间用空格分开,或用${}来引用。脚本中通过bsh.args来引用,bsh.args[0]表示取的第一个值。

能访问的属性与变量:

SampleResult:访问对应的结果对象,能查询与编辑其中的属性。

ResponseCode:引用自行设置的返回码。

ResponseMessage:设置响应消息内容。

IsSuccess:引用它来决定产生的事务是否成功。如果设置为false那事务会失败。那在结果树与聚合报告中都会显示失败。

案例五:jmeter使用BeanShell Sampler测试自己写的java接口(一)

案例:起多个本地线程jmeter beanshell使用说明

案例:JMeter BeanShell 应用

案例:jmeter之编写java请求一beashell调用java代码(上篇)(推

jmeter学习记录--04--Beanshell的更多相关文章

  1. jmeter学习记录--05--Beanshell2

    学习beanshell时有不少的例子.遇到不少问题.在此记录下. 测试实例列表 A1:使用Beanshell请求作为测试请求 一个打包的Jar包,直接对其内的方法进行测试. 第一步:将接口jar包要放 ...

  2. jmeter学习记录--07--jmeter元件

    通过jmeter元件可以模拟负载.参数化.设置关联.设置检查点.设置集合点.控制场景运行.监控测试结果等. 1.逻辑控制器:比如foreach控制器,查询到了订单并要对每个订单进行出库操作,以订单号作 ...

  3. jmeter学习记录--10--二次开发环境搭建

    JMeter源码集成到Eclipse.JMeter二次开发(1)-eclipse环境配置及源码编译 ,根据此文章记录将jmeter源码集成到myecplise 第一步:下载jmeter源码http:/ ...

  4. jmeter学习记录--09--命令行运行与生成报告

    一.     使用命令行方式运行Jmeter 1.1 为什么 使用GUI方式启动jmeter,运行线程较多的测试时,会造成内存和CPU的大量消耗,导致客户机卡死. 所以正确的打开方式是在GUI模式下调 ...

  5. jmeter学习记录--08--第三方测试组件

    我们安装的JMeter版本,功能仍然有欠缺,插件是一种补充,官方提供了很多插件. 官网地址:http://www.jmeter-plugins.org/, 里面有很多可以安装到JMeter的插件,基本 ...

  6. jmeter学习记录--03--jmeter负载与监听

    jmeter场景主要通过线程组设置完成,有些复杂场景需要与逻辑控制器配合. 一.测试计划设计与执行 场景设计 jmete线程组实际是一个线程池,根据用户设置进行线程池的初始优化,在运行时做各种异常的处 ...

  7. Jmeter学习记录

    JSON正则表达式提取规则 https://www.cnblogs.com/hc1020/p/7723720.html Jmeter非GUI下执行日志 执行命令 ./jmeter  -n  -t  $ ...

  8. JMeter学习记录收藏

    1.如何进行一个简单的性能测试 2.JMeter各种功能名词解释,比较全 3.聚合报告分析 4.CSV文件参数化,名词解释 5.JMeter快捷键

  9. JMeter学习-037-JMeter调试工具之四-BeanShell+jmeter.log

    前面三篇文章分别讲述了 HTTP Mirror Server . Debug PostProcessor 和 Debug Samper 的脚本调试实例.此文主要讲述第四种调试方法,通过 BeanShe ...

随机推荐

  1. 【机器学习】--EM算法从初识到应用

    一.前述 Em算法是解决数学公式的一个算法,是一种无监督的学习. EM算法是一种解决存在隐含变量优化问题的有效方法.EM算法是期望极大(Expectation Maximization)算法的简称,E ...

  2. 【重学计算机】计组D3章:运算方法与运算器

    1. 定点数运算及溢出 定点数加减法:减法化加法,用补码直接相加,忽略进位 溢出:运算结果超出了某种数据类型的表示范围 溢出检测方法:统一思想概括为正正得负或负负得正则溢出,正负或负正不可能溢出 方法 ...

  3. springboot~Compiler时开启插件的注解功能

    对于IJ这个IDE工具来说,我们会安装一些插件来帮助我们更好的进行开发,像lombok就是一款不错的插件,使用注解的方式在项目编译时帮助我们生成代码,像getter,setter,tostring等等 ...

  4. 学习ASP.NET Core Razor 编程系列十四——文件上传功能(二)

    学习ASP.NET Core Razor 编程系列目录 学习ASP.NET Core Razor 编程系列一 学习ASP.NET Core Razor 编程系列二——添加一个实体 学习ASP.NET ...

  5. JVM平台上的响应式流(Reactive Streams)规范

    // Reactive Streams // 响应式流是一个倡议,用来为具有非阻塞后压的异步流处理提供一个标准.大家努力的目标集中在运行时环境(JVM和JavaScript)和网络协议上. 注:响应式 ...

  6. [Nodejs] node实现静态文件服务器

    node 静态文件处理 一般后端进行静态文件处理都是使用 Apache nginx 等静态 web 服务器,但是既然使用 node 了,就用 node 实现以下静态服务器吧. 之前弄了不少充满艺术的数 ...

  7. 三种方法为QLineEdit添加清除内容按钮

    很多时候我们会发现输入的一长串内容不得不全部删除重新输入,这时比起一直按着退格键不放一个清除内容按钮更受欢迎. 今天我将介绍三种为QLineEdit添加清除内容按钮的方法,其中两种方法有较强的功能针对 ...

  8. EasyUI 使用tabs切换后datagrid显示不了内容

    今天刚遇到这个问题,找了下各群的深度合作伙伴,没有好的答案,那就自己研究吧. 问题点在于打开tab1时,快速切到tab2,这时tab1的datagrid渲染未完成,再次回到tab1,因为是在不可见区域 ...

  9. Java开发笔记(八十六)通过缓冲区读写文件

    前面介绍了利用文件写入器和文件读取器来读写文件,因为FileWriter与FileReader读写的数据以字符为单位,所以这种读写文件的方式被称作“字符流I/O”,其中字母I代表输入Input,字母O ...

  10. 使用go, gin, gorm编写一个简单的curd的api接口

    go 是一门非常灵活的语言,既具有静态语言的高性能,又有动态语言的开发速度快的优点,语法也比较简单,下面是通过简单的代码实现了一个简单的增删改查 api 接口 hello world 常规版 新建 d ...