Jmeter之Beanshell详解

news2025/1/10 16:43:53

一、 Beanshell概念

 Beanshell:

  • BeanShell是一种完全符合Java语法规范的脚本语言,并且又拥有自己的一些语法和方法;
  • BeanShell是一种松散类型的脚本语言(这点和JS类似);
  • BeanShell是用Java写成的,一个小型的、免费的、可以下载的、嵌入式的Java源代码解释器,具有对象脚本语言特性,非常精简的解释器jar文件大小为175k。
  • BeanShell执行标准Java语句和表达式,另外包括一些脚本命令和语法。

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

 二、Jmeter常用Bean Shell

  • 定时器:  BeanShell Timer

  • 前置处理器:BeanShell PreProcessor

  • 采样器:  BeanShell Sampler

  • 后置处理器:BeanShell PostProcessor

  • 断言:   BeanShell断言

  • 监听器:  BeanShell Listener

三、Jmeter常用内置变量

1.内置变量

 BeanShell脚本中不用定义,可以直接使用的变量,常用的内置变量和方法如下:

log:写日志到控制台和jmeter.log,如log.info("XXX");

vars:操作变量

      vars.get("skuId");  从jmeter中获取${skuId}变量的值

      vars.put("name","test"); 将"test"保存到${name}变量中

prev:获取前面sampler返回的信息

      getResponseDataAsString(); 获取响应信息

      getResponseCode(); 获取响应

 更多内置变量参考:https://jmeter.apache.org

举例:

2.添加  BeanShell取样器

log.info(".....<<<<<");
log.error("xxxx");

String myip=vars.get("ip");//获取参数值(在用户定义的变量中设置了“ip”值)
log.info(myip);//日志打印

vars.put("ip","192.168.0.0");//赋值
String myip=vars.get("ip");
log.info(myip);//日志打印

3.后置处理器的应用

log.info("前一个返回结果为:"+prev.getResponseDataAsString());
log.info("前一个请求的状态码为:"+prev.getResponseCode())

四、BeanShell的用法实例

1.BeanShell面板上写脚本

需求: 

1、调用接口获取sku信息
2、判断库存,如果库存大于500,调用buy接口购买10个商品,否则购买5个商品

// 获取接口返回的库存值
String myStock = vars.get(“p_stock");//转换为整数
int iStock = Integer.parselnt(myStock);//判断库存
if (iStock>500){
// 重新保存参数
vars.put("buyNum","10");
}else{
vars.put(“buyNum","5");
}

先是get接口json提取器提取库存字段然后用到后面脚本里去做判断

2.引用外部 java源文件

引用外部源码文件然后实现md5加密完成签名接口  

源码文件:

链接: https://pan.baidu.com/s/1JQlgeHGVHl8NOdSiTwNMkg?pwd=uqrs 提取码: uqrs

在beanShel中通过source("代码路径")方法引入java,然后调用方法和java一样,new一个class,再调用里面的方法 

前置处理器

//引入源代码
source("/Users/mac/Documents/study23/jmeter/md5/Md5Util.java");
//生成随机手机号
String phone = "135${__Random(10000000,99999999,myPhone)}"; 
String code = "testmay";
//生成时间戳
String time = "${__time(,myTime)}";
// 调用外部函数进行加密
String md5 = Md5Util.getMd5Hex(phone+code+time);
// 将数据另存为新的变量
vars.put("phone",phone); 
vars.put("md5",md5);

 ${phone} ${code} ${md5}可被调用 

3.调用jar包

使用beahshell调用自己写的工具类,工具类实现了密码的加、解密功能 

在eclipse写好代码,然后把该类打成jar包(在类上点击右键->Export->jar file) 

法一: 

1、将jar包放到jmeter目录/Users/mac/Documents/apache-jmeter-5.6.2/lib/ext下

3、打开jmeter,添加一个http sampler(调用登录接口),在sampler下添加一个BeanShell PreProcessor(如果jmeter已经打开了,步骤2中jar包要生效,必须才重启jmeter

4、在beanshell PreProcessor中导入我们的jar包,调用里面的加、解密码方法,把结果保存在jmeter变量中

 法二:

调用jar包
1、测试计划,Add directory or jar to classpath
2、import 所需要的类名



查看jar包内容:

进入jar路径,输入以下指令:

jar tf testfan-md5.jar

 然后调用方式用import 

import com.lee.util.Md5Util
// 生成随机手机号
String phone = "135${_Random(10000000,99999999,myPhone)}"; 
String code = "testmay";
// 生成时间戳
String time = "${__time(,myTime)}";
//调用外部函数进行加密
String md5 = Md5Util.getMd5Hex(phone+code+time);
//将数据另存为新的变量 
vars.put("phone",phone); 
vars.put("md5",md5);

4.提取 json值

 需求:提取sample返回json数据中所有name字段值,返回的json格式如下: 

{“body”:{“apps”:[{“name”:”111”},{“name”:”222”}]}} 

jmeter中添加后置处理器BeanShell PostProcessor 

说明:脚本中的导入的json包需要自己去网络下载后放到\lib\ext

链接: https://pan.baidu.com/s/1-knIb9_NulF81mIkortvoQ?pwd=h4p4 提取码: h4p4

import org.json.*;

String response_data = prev.getResponseDataAsString();
JSONObject data_obj = new JSONObject(response_data);
String apps_str = data_obj.get("body").get("apps").toString();
JSONArray apps_array = new JSONArray(apps_str);
String[] result = new String[apps_array.length()];
for(int i=0;i<apps_array.length();i++){
    JSONObject app_obj = new JSONObject(apps_array.get(i).toString());
    String name = app_obj.get("name").toString();
    result[i] = name;
}
vars.put("result", Arrays.toString(result));

5.BeanShell断言

5.1 数据断言 

内置变量
Failure:是否失败, boolean类型
FailureMessage:失败日志,在断言失败时显示

int iStock = Integer.parselnt(vars.get("p_stock")); 
if (iStock >1500){ 
  Failure =true;
  FailureMessage ="库存数量超过了1500";
  // ResponseData是服务器返回的byte[]类型的数据
  // 如果想打印,必须转换为String类型的,用new String(ResponseData) 
  log.info(new String(ResponseData));
  //打印当前请求的url,SamplerData是String类型的数据 
  log.info(SamplerData);
}

5.2 状态断言 

//状态码断言
log.info("状态码:" + ResponseCode);
if(ResponseCode.equals("200")){ 
	Failure=false;
}
else{
	Failure=true;
	FailureMessage="响应状态码非200";  //指定失败原因
}

5.3 响应体断言

//获取响应数据
Stringresponse= prev.getResponseDataAsString();
log.info("响应体:" + response);
//响应数据包含if(response.contains("登录成功")){
	Failure=false;
}
else{
	Failure=true;
	FailureMessage="响应数据不包含登录成功";
}

5.4 json值断言 

//JSON响应断言
import org.json.*;   //导入org.json包
Stringresponse= prev.getResponseDataAsString();  
//获取响应数据
JSONObjectresponseJson=newJSONObject(response);  
//转为JSON对象
Stringmessage= responseJson.getString("message"); 
log.info("响应message字段:" + message);
 
if(message.equals("成功")){
	Failure=false;
}
else{
	Failure=true;
	FailureMessage="响应message字段非成功";
}

6.BeanShell写数据到文件

这如果保存后就可以用到其他线程里当参数了,很实用
以后只需要更改下面的部分,这个文件就可以用了

"csrf_token" "/Users/mac/Documents/study23/jmeter/output.txt"

需求
1、调用登录接口,获取token值
2、将token值保存到一个文件里

String line = vars.get("csrf_token"); 
try {
    BufferedWriter writer = new BufferedWriter(new FileWriter("/Users/mac/Documents/study23/jmeter/output.txt",true)); 
    writer.write(line); 
    writer.newLine(); 
    writer.close();
} catch (IOException e) {
    e.printStackTrace();
}

运行会自动生成一个 txt文件

7.引用外部class文件 

1、直接把上例中的java文件编译成class文件

进入java路径下,使用javac Md5Util.java就会编译成.class文件,同目录自动生成.class文件

【注意】macos上此处有大坑
这里有一个大坑,调用class文件时:addClassPath()方法中的路径,在macos上不能写成文件的绝对路径。这个路径只能写到包名的前一级,不能包含包名。
如果拿到的是一个单独的class文件,一定要反编译,检查包名,将这个class文件的包名层级新建出来,再将class文件放进去

2、BeanShell使用代码如下:

  用addClassPath(path)方法引入 class文件,在用import导入包及类,然后就可以像java一样调用了

//引入class文件
addClassPath("/Users/mac/Documents/study23/jmeter/md5");
//导入类名
import Md5Util
// import 包名.类名
//生成随机手机号
String phone = "135${__Random(10000000,99999999,myPhone)}"; 
String code = "testmay";
//生成时间戳
String time = "${__time(,myTime)}";
// 调用外部函数进行加密
String md5 = Md5Util.getMd5Hex(phone+code+time);
// 将数据另存为新的变量
vars.put("phone",phone); 
vars.put("md5",md5);
log.info(md5)

8.获取数据库数据并入参

jmeter数据库连接 

8.1 添加配置元件 JDBC Connection Configuration

8.2 添加取样器JDBC  Request

8.3 添加后置处理器 JDBC Postprocessor

import java.util.Random;

Random random=new Random();
Object object=vars.getObject("object");  //获取sql查询结果

int size=object.size();   //获取查询结果数量
line_0 = object.get(0);   //获取object的第一个元素
filed_name = line_0.get("title");  //获取title字段的值

vars.put("size",size.toString());   //将size转换成字符串,存到变量size中
vars.put("line_0",line_0.toString());
vars.put("filed_name",filed_name.toString());

String[] fields={"title","price"};   //创建一个字符数组,里面为需要作为入参的字段

log.info(" ");
log.info("========================开始打印日志====================");
log.info("size:" + vars.get("size"));
log.info("line_0:" + vars.get("line_0"));
log.info("filed_name:" + vars.get("filed_name"));

运行

8.4 参数调用

${file_name} 

${size}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1619095.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

LayuiMini使用时候初始化模板修改(下载源码)

忘记加了 下载 地址 &#xff1a; layui-mini: layuimini&#xff0c;后台admin前端模板&#xff0c;基于 layui 编写的最简洁、易用的后台框架模板。只需提供一个接口就直接初始化整个框架&#xff0c;无需复杂操作。 LayuiMini使用时候初始化模板官网给的是&#xff1a; layu…

用Excel做一个功能完备的仓库管理系统

1 基本设计思路 用到的Excel技术&#xff1a;sumif, vlookup, 表格(table)。基本思路&#xff1a;在有基础的商品、仓库等信息的情况下&#xff0c;对商品的每一个操作都有对应的单据&#xff0c;然后再汇总统计。标识&#xff1a;为了在不同的维度统计数量&#xff0c;各单据…

国产FTP文件传输服务器需要具备哪些关键特性?

国产FTP文件传输服务器是指根据中国国内信息技术创新&#xff08;信创&#xff09;的要求和标准&#xff0c;自主研发的文件传输服务器软件。这类软件旨在替代传统的FTP服务器&#xff0c;以更好地适应国产化和信息安全的需要。国产FTP文件传输服务器通常需要具备以下要求&…

图书租赁系统-扣费服务

resources中添加moment.js文件。 然后引入moment.js文件&#xff1a; <script src"/js/moment.js"></script>借阅结束时间选完后changeDate事件&#xff1a; $("input[nameendTime]").datetimepicker({format: "yyyy-mm-dd hh:ii",…

Linux:进程与计划任务

文章目录 Linux&#xff1a;进程与计划任务一、进程1、进程是什么2、进程状态 二、列出进程命令1、查看静态的进程统计信息——“ps”Play1&#xff1a;“ps aux”Play2:ps -elf 2、查看静态的进程统计信息——“top”段首解析进程信息区解释 三、运行与终止进程3.1、运行进程3…

为什么要写技术方案?

技术方案是为研究解决各类技术问题&#xff0c;有针对性&#xff0c;系统性的提出的方法、应对措施及相关对策。技术方案设计是一个技术开发者必备的能力&#xff0c;特别是对于高级、资深、架构师等角色。技术方案设计不仅能够帮助我们明确需求&#xff0c;规划架构&#xff0…

2024新算法爱情进化算法(LEA)和经典灰狼优化器(GWO)进行无人机三维路径规划设计实验

简介&#xff1a; 2024新算法爱情进化算法&#xff08;LEA&#xff09;和经典灰狼优化器&#xff08;GWO&#xff09;进行无人机三维路径规划设计实验。 无人机三维路径规划的重要意义在于确保飞行安全、优化飞行路线以节省时间和能源消耗&#xff0c;并使无人机能够适应复杂环…

windows系统下python开发工具安装

一. 简介 前一篇文章学习了安装 python解释器&#xff0c;文章如下&#xff1a; windows系统下python解释器安装-CSDN博客 本文来学习如何下载安装 python开发工具 PyCharm。 二. python开发工具 PyCharm下载安装 1. PyCharm官网 PyCharm开发工具 PyCharm为 python代码…

STM32的GPIO输入和输出函数详解

系列文章目录 STM32单片机系列专栏 C语言术语和结构总结专栏 文章目录 1. GPIO模式 2. GPIO输出 2.1 RCC 2.2 GPIO 3. 代码示例 3.1 RCC时钟 3.2 GPIO初始化 3.3 GPIO输出函数 3.4 推挽输出和开漏输出 4. GPIO输入 4.1 输入模式 4.2 数据读取函数 5. C语言语法 1…

Mudem,打造私密安全、高效稳定的私人空间

Mudem 是 Codigger 平台中的一个关键组件&#xff0c;它提供基础通讯服务&#xff0c;确保不同类型的机器之间可以进行安全和高效的连接。它其设计理念在于将本地机器、公有云以及私有云上的设备无缝地整合为一个可远程在线访问的工作站&#xff08;Workstation&#xff09;。这…

Android SDK Manager安装Google Play Intel x86 Atom_64 System Image依赖问题

Package Google Play Intel x86 Atom_64 System Image,Android API R, revision 2 depends on SDK Platform Android R Preview, revision 2 问题 一开始以为网络还有依赖包没有勾选&#xff0c;尝试了很多次&#xff0c;勾选这边报错对应的license即可。此时点击一下其他licen…

【LeetCode】---118.杨辉三角

一、题目解析&#xff1a; 二、知识回顾&#xff1a; 1.二维数组&#xff1a; 2. C语言中的二维数组访问方式和vector二维数组的访问&#xff0c; 不同区别&#xff1a; &#xff08;1&#xff09;表面是一样的&#xff0c;但底层不同&#xff01; &#xff08;2&#xff09;静…

“PowerInfer:消费级GPU上的高效大语言模型推理引擎“

PowerInfer是由上海交通大学IPADS实验室开发的一个高效大语言模型&#xff08;LLM&#xff09;推理引擎&#xff0c;专为个人电脑&#xff08;PC&#xff09;上的消费者级GPU设计。它通过利用LLM推理中的高局部性&#xff0c;实现了快速且资源消耗低的模型推理&#xff0c;这一…

【插件】IDEA 热部署插件 JRebel

1 搜索安装插件 JRebel 2 选中Team URL 1、在上面的框中输入激活的url地址 https://jrebel.qekang.com/{GUID} http://jrebel-license.jiweichengzhu.com/{GUID} GUID生成工具 Create GUID online (guidgen.com) 备用 404 Not Found (ofmonkey.com) 如果上述激活地址不能…

蓝桥杯2024年第十五届省赛真题-小球反弹

以下两个解法感觉都靠谱&#xff0c;并且网上的题解每个人答案都不一样&#xff0c;目前无法判断哪个是正确答案。 方法一&#xff1a;模拟 代码参考博客 #include <iostream> #include <cmath> #include <vector>using namespace std;int main() {const i…

第48期|GPTSecurity周报

GPTSecurity是一个涵盖了前沿学术研究和实践经验分享的社区&#xff0c;集成了生成预训练Transformer&#xff08;GPT&#xff09;、人工智能生成内容&#xff08;AIGC&#xff09;以及大语言模型&#xff08;LLM&#xff09;等安全领域应用的知识。在这里&#xff0c;您可以找…

从0到1—POC编写基础篇(一)

POC编写基础篇 POC的概念 在网络安全领域中&#xff0c;POC的概念是指"Proof of Concept"&#xff0c;也被称为"攻击验证"。它是指安全研究人员或黑客用来证明某个漏洞、弱点或安全问题存在的实证或演示。 网络安全研究人员经常通过开发POC来展示一个漏洞的…

泛微 E-Office UserSelect接口存在未授权访问漏洞

声明&#xff1a; 本文仅用于技术交流&#xff0c;请勿用于非法用途 由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果及损失&#xff0c;均由使用者本人负责&#xff0c;文章作者不为此承担任何责任。 简介 老洞 泛微e-office系统是标准、易用、快速部署上线…

在vscode上面进行分支merge的记录

前言&#xff1a;在我们的项目中&#xff0c;有两个分支&#xff1a;master和liutielong。现在要将liutielong分支的改动merge到master分支中。 如果master分支已经更改了&#xff0c;所以要先pull&#xff08;这是在git bash里面的命令&#xff09;。 git pull origin master…

探索ChatGPT在提高人脸识别与软性生物识准确性的表现与可解释性

概述 从GPT-1到GPT-3&#xff0c;OpenAI的模型不断进步&#xff0c;推动了自然语言处理技术的发展。这些模型在处理语言任务方面展现出了强大的能力&#xff0c;包括文本生成、翻译、问答等。 然而&#xff0c;当涉及到面部识别和生物特征估计等任务时&#xff0c;这些基于文…