jmeter学习记录–04–Beanshell

一、什么是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 = "1234567";  //要加密的字符串
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进制编码;

jmeter学习记录--04--Beanshelljmeter学习记录--04--Beanshell
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 paramMap = new HashMap();
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);

View Code

案例四:jmeter之BeanShell Sampler

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

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

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

jmeter学习记录--04--Beanshell

jmeter学习记录--04--Beanshelljmeter学习记录--04--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进行回写响应数据。

View Code

jmeter学习记录--04--Beanshell

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

jmeter学习记录--04--Beanshell

能访问的属性与变量:

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

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

ResponseMessage:设置响应消息内容。

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

jmeter学习记录--04--Beanshell

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

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

案例:JMeter BeanShell 应用

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

Original: https://www.cnblogs.com/kongzhongqijing/p/7146148.html
Author: milkty
Title: jmeter学习记录–04–Beanshell

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/529643/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • logstash写入文件慢的问题排查记录

    终于找到根本原因了!!!!! logstash部署到k8s集群内部的,当所在节点的CPU资源被其他应用抢占时,logstash的处理速度就会降低 问题现象 logstash从kaf…

    Linux 2023年6月14日
    0154
  • Markdown基本使用

    元素 Markdown 语法 [标题(Heading)] [粗体(Bold)] [斜体(Italic)] [引用块(Blockquote)] [有序列表(Ordered List)…

    Linux 2023年6月13日
    079
  • djnago-filter用法

    django-filter用法 集成drf 不指定字段的过滤参数,那么该字段就默认为exact,精准匹配自定义filter文件内 from django_filters impor…

    Linux 2023年6月14日
    0111
  • Java基础系列–01_基础类型

    J2SE、J2ME、J2EE分别指什么?J2SE 基础版,桌面应用。J2ME 微型版,手机开发。(android,ios)J2EE 企业版,所有浏览器访问的应用程序。注意:JDK5…

    Linux 2023年6月7日
    087
  • R基础

    1、官网下载R和Rstudio 2&#x…

    Linux 2023年6月8日
    082
  • 10分钟轻松学会 Python turtle 绘图

    先说明一下turtle绘图的基础知识: 1. 画布(canvas) 画布就是turtle为我们展开用于绘图区域, 我们可以设置它的大小和初始位置 1.1 设置画布大小 turtle…

    Linux 2023年6月8日
    090
  • 分布式系统下的CAP定理

    本文参考EricBrewer博客加上自己的理解整理。 CAP定理又被成为布鲁尔定理,是加州大学计算机科学家埃里克·布鲁尔提出来的猜想,后来被证明成为分布式计算领域公认的定理。 CA…

    Linux 2023年6月13日
    077
  • Java轻松实现,每天给对象发情话!

    一、引言 最近看到一篇用js代码实现表白的文章,深有感触。然后发现自己也可以用java代码实现,然后就开始写代码了,发现还挺有意思的,话不多说开搞实现思路: 使用HttpClien…

    Linux 2023年6月14日
    075
  • Linux Centos7.5 vsftp 的安装与配置

    安装及配置 安装 sudo yum install vsftpd -y 服务管理 启动服务 service vsftpd start 关闭服务 service vsftpd sto…

    Linux 2023年6月14日
    072
  • docker –link容器互联

    服务器版本 docker软件版本 CPU架构 CentOS Linux release 7.4.1708 (Core) Docker version 20.10.12 x86_64…

    Linux 2023年6月7日
    092
  • Spring MVC处理日期字符串参数自动转换成后台Date类型

    当前台提交日期字符串到后台时,以字符串形式传输,若后台接收时采用Date类型,则会报格式转换错误的异常. 方式一: 将 @DateTimeFormat(pattern = &amp…

    Linux 2023年6月14日
    087
  • kafka-部署

    kafka部署 版本选择: Scala 2.12-kafka_2.12-2.7.0.tgz #版本格式 kafka_scala版本_kafka版本 部署三台服务器的高可用kafka…

    Linux 2023年6月14日
    099
  • CentOS下配置NTP时间服务器

    配置ntp.conf [root@server ~]# vim /etc/ntp.conf For more information about this file, see th…

    Linux 2023年6月13日
    093
  • wait() 进程控制函数实现伪代码

    wait()的实现 父进程调用 wait() wait() { 进入系统调用 sys_wait() sys_wait () { for { x = true for (循环所有就绪…

    Linux 2023年6月7日
    0104
  • STM32CubeIDE学习记录(按键点灯工程)

    博主使用的开发板以及相关外设连接如下: 芯片型号为: STM32F103RCT6, 新建STM32CubeIDE项目 配置完成后会生成相应的文件并进入如下界面: 使用外部晶振时钟 …

    Linux 2023年6月14日
    0122
  • 用 shell 脚本制造连接频繁中断的场景

    问题的提出 最近在准备客户端的新版本,在内部灰度过程中,发现一类奇怪的 dump,通过查看日志和堆栈,可以确定是因为每次连上后台就被后台断开了、导致多次重连后随机发生的崩溃。dum…

    Linux 2023年6月6日
    083
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球