性能工具之JMeter 通过Java API生成 BeanShell PreProcessor 脚本

文章目录

  • 一、前言
  • 二、实现代码
  • 三、代码示例
  • 四、最后

一、前言

对于上一篇文章(性能工具之 HAR 格式化转换JMeter JMX 脚本文件)还是有点问题。大家在使用的情况需要注意。

如果多个接口相同 path 路径且不同参数进行查询如:
在这里插入图片描述

上面接口如果不做处理生成脚本:
在这里插入图片描述

展开几个看看:
在这里插入图片描述

再点击下一个观察:
在这里插入图片描述

如果把上面脚本构建成一个接口,相同参数通过 CSV Data Set Config 或者其他参数文件方式处理就能实现这一想法,这里演示怎么通过BeanShell PreProcessor 来处理这样的想法。

二、实现代码

为了通过代码自动构建 BeanShell PreProcessor 脚本,将相同路径但不同参数的请求构建为一个参数数组,并通过随机数据给每次请求,我们可以按照以下步骤进行:

详细步骤:

  1. 创建 BeanShell PreProcessor:
  2. 创建一个 BeanShell PreProcessor 实例,并设置其脚本内容。
  3. 脚本内容将负责生成随机参数数组,并将这些参数传递给请求。
  4. 生成随机参数数组: 在脚本中生成随机参数数组,并将这些参数赋值给变量。
import java.util.Random;Random rand = new Random();
String[] dictCodeStr = { "s_cache=17","s_cache","s" };
int randomIndex = rand.nextInt(dictCodeStr.length);
vars.put("paramPath", String.valueOf(dictCodeStr[randomIndex]));

将这些变量传递给请求。

  • 组装测试计划:
    将 BeanShell PreProcessor 和请求(例如 HTTPSampler)组装到测试计划中。

详细代码实现:

BeanShellPreProcessor  beanShellPreProcessor = new BeanShellPreProcessor ();
beanShellPreProcessor.setName("BeanShell PreProcessor");
beanShellPreProcessor.setScript("sdsd");
beanShellPreProcessor.setComment("参数化文件");
beanShellPreProcessor.setProperty(BeanShellTestElement.TEST_CLASS, BeanShellPreProcessor.class.getName());
beanShellPreProcessor.setProperty(BeanShellTestElement.GUI_CLASS, TestBeanGUI.class.getName());
HashTree testPlanTreeShell = new HashTree();
testPlanTreeShell.add(beanShellPreProcessor);
threadGroupHashTree.add(baiducomSampler, testPlanTreeShell);

在这里插入图片描述

执行后发现脚本没有写入任何数据,再次修改脚本为:
在这里插入图片描述

上面写入成功。

基于上面脚本可以修改成我们想要的脚本文件如:

// 构建 shell 脚本String beanShellScript = "import java.util.Random;\n" +"\n" +"   Random rand = new Random();\n" +"   String[] dictCodeStr = {paramList};\n" +"   int randomIndex = rand.nextInt(dictCodeStr.length);\n" +"   vars.put(\"paramPath\", String.valueOf(dictCodeStr[randomIndex]));";ArrayList<String> paraList = new ArrayList<>();paraList.add("s_cache=1726989090167&s_locale=zh-cn");paraList.add("s_cache=1726989090168&s_locale=zh-cn");beanShellScript = beanShellScript.replace("paramList", JSONObject.toJSONString(paraList).replace("[", "").replace("]", ""));BeanShellPreProcessor  beanShellPreProcessor = new BeanShellPreProcessor ();beanShellPreProcessor.setName("BeanShell PreProcessor");beanShellPreProcessor.setComment("参数化文件");beanShellPreProcessor.setResetInterpreter(false);beanShellPreProcessor.setProperty("parameters", "");beanShellPreProcessor.setProperty("filename", "");beanShellPreProcessor.setProperty("script", beanShellScript);beanShellPreProcessor.setProperty(BeanShellTestElement.TEST_CLASS, BeanShellPreProcessor.class.getName());beanShellPreProcessor.setProperty(BeanShellTestElement.GUI_CLASS, TestBeanGUI.class.getName());baiducomSampler.setPath("/" + "${paramList}");HashTree testPlanTreeShell = new HashTree();testPlanTreeShell.add(beanShellPreProcessor);

执行JAVA代码:
在这里插入图片描述

成功转换成想要的参数文件。

三、代码示例

全部参考代码,如下:

// 初始化压测引擎 
StandardJMeterEngine jmeter = new StandardJMeterEngine();// JMeter初始化(属性、日志级别、区域设置等)JMeterUtils.setJMeterHome(jmeterHome.getPath());JMeterUtils.loadJMeterProperties(jmeterProperties.getPath());// 可以注释这一行,查看额外的日志,例如DEBUG级别JMeterUtils.initLogging();JMeterUtils.initLocale();// Test Plan 测试计划TestPlan testPlan = new TestPlan("创建JMeter脚本");testPlan.setProperty(TestElement.TEST_CLASS, TestPlan.class.getName());testPlan.setProperty(TestElement.GUI_CLASS, TestPlanGui.class.getName());testPlan.setUserDefinedVariables((Arguments) new ArgumentsPanel().createTestElement());// Loop Controller 循环控制LoopController loopController = new LoopController();loopController.setLoops(1);loopController.setFirst(true);loopController.setProperty(TestElement.TEST_CLASS, LoopController.class.getName());loopController.setProperty(TestElement.GUI_CLASS, LoopControlPanel.class.getName());loopController.initialize();// Thread Group 线程组ThreadGroup threadGroup = new ThreadGroup();threadGroup.setName("Example Thread Group");threadGroup.setNumThreads(1);threadGroup.setRampUp(1);threadGroup.setSamplerController(loopController);threadGroup.setProperty(TestElement.TEST_CLASS, ThreadGroup.class.getName());threadGroup.setProperty(TestElement.GUI_CLASS, ThreadGroupGui.class.getName());// JMeter测试计划,基本上是JOrphan HashTreeHashTree testPlanTree = new HashTree();// 从以上初始化的元素构造测试计划testPlanTree.add(testPlan);HashTree threadGroupHashTree = testPlanTree.add(testPlan, threadGroup);// 第一个 HTTP Sampler - 打开 baidu.comHTTPSamplerProxy baiducomSampler = new HTTPSamplerProxy();baiducomSampler.setDomain("baidu.com");baiducomSampler.setPort(80);baiducomSampler.setPath("/");baiducomSampler.setMethod("GET");baiducomSampler.setName("Open baidu.com");baiducomSampler.setProperty(TestElement.TEST_CLASS, HTTPSamplerProxy.class.getName());baiducomSampler.setProperty(TestElement.GUI_CLASS, HttpTestSampleGui.class.getName());// 构建 shell 脚本String beanShellScript = "import java.util.Random;\n" +"\n" +"   Random rand = new Random();\n" +"   String[] dictCodeStr = {paramList};\n" +"   int randomIndex = rand.nextInt(dictCodeStr.length);\n" +"   vars.put(\"paramPath\", String.valueOf(dictCodeStr[randomIndex]));";ArrayList<String> paraList = new ArrayList<>();paraList.add("s_cache=1726989090167&s_locale=zh-cn");paraList.add("s_cache=1726989090168&s_locale=zh-cn");beanShellScript = beanShellScript.replace("paramList", JSONObject.toJSONString(paraList).replace("[", "").replace("]", ""));BeanShellPreProcessor  beanShellPreProcessor = new BeanShellPreProcessor ();beanShellPreProcessor.setName("BeanShell PreProcessor");beanShellPreProcessor.setComment("参数化文件");beanShellPreProcessor.setResetInterpreter(false);beanShellPreProcessor.setProperty("parameters", "");beanShellPreProcessor.setProperty("filename", "");beanShellPreProcessor.setProperty("script", beanShellScript);beanShellPreProcessor.setProperty(BeanShellTestElement.TEST_CLASS, BeanShellPreProcessor.class.getName());beanShellPreProcessor.setProperty(BeanShellTestElement.GUI_CLASS, TestBeanGUI.class.getName());baiducomSampler.setPath("/" + "${paramList}");HashTree testPlanTreeShell = new HashTree();testPlanTreeShell.add(beanShellPreProcessor);threadGroupHashTree.add(baiducomSampler, testPlanTreeShell);// 将生成的测试计划保存为JMeter的.jmx文件格式SaveService.saveTree(testPlanTree, new FileOutputStream("D:\\work\\jmx" + slash + "example1.jmx"));

四、最后

希望上面代码对大家有参考价值。

顺便问下,如果想解决下面接口我们应该怎么处理呢?
在这里插入图片描述

这里提供一个思路:

  1. 解析上面参数到一个对象中。
  2. 按 path 路径进行分组。
  3. 构建 jmx脚本,通过 path 路径获取分组后的参数文件构建 buildBeanShellScript 。
  4. 添加到 HashTree 中。

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

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

相关文章

【前端】如何制作一个自己的网页(15)

有关后代选择器的具体解释&#xff1a; 后代选择器 后代选择器使用时&#xff0c;需要以空格将多个选择器间隔开。 比如&#xff0c;这里p span&#xff0c;表示只设置p元素内&#xff0c;span元素的样式。 <style> /* 使用后代选择器设置样式 */ p span { …

java--多态(详解)

目录 一、概念二、多态实现的条件三、向上转型和向下转型3.1 向上转型3.2 向下转型 四、重写和重载五、理解多态5.1练习&#xff1a;5.2避免在构造方法中调用重写的方法&#xff1a; 欢迎来到权权的博客~欢迎大家对我的博客提出指导这是我的博客主页&#xff1a;点击 一、概念…

Java毕业设计 基于SpringBoot发卡平台

Java毕业设计 基于SpringBoot发卡平台 这篇博文将介绍一个基于SpringBoot发卡平台&#xff0c;适合用于Java毕业设计。 功能介绍 首页 图片轮播 商品介绍 商品详情 提交订单 文章教程 文章详情 查询订单  查看订单卡密 客服   后台管理 登录 个人信息 修改密码 管…

Selenium爬虫技术:如何模拟鼠标悬停抓取动态内容

介绍 在当今数据驱动的世界中&#xff0c;抓取动态网页内容变得越来越重要&#xff0c;尤其是像抖音这样的社交平台&#xff0c;动态加载的评论等内容需要通过特定的方式来获取。传统的静态爬虫方法难以处理这些由JavaScript生成的动态内容&#xff0c;Selenium爬虫技术则是一…

字典如何与选择器一起使用

背景&#xff1a;开发过程中会遇到某些字段需要做成下拉框。如下图&#xff1a; 组件 | Element里有select选择器这个组件可以实现下拉框的效果 我们可能会想到创一个辅助表来存储这些下拉数据像这样 这样虽然能实现&#xff0c;但是在实际开发中是不合理的&#xff0c;如果有…

个税自然人扣缴客户端数据的备份与恢复(在那个文件夹)

一&#xff0c;软件能够正常打开&#xff0c;软件中的备份与恢复功能 1&#xff0c;备份 您按照下面的方法备份一下哦~ 进入要备份的自然人软件&#xff0c;点击左侧系统设置→→系统管理→→备份恢复&#xff1b; 在备份设置里&#xff0c;点击“备份到选择路径”&#xff0c;…

WebGL编程指南 - 颜色与纹理续

设置纹理坐标&#xff08;initVertexBuffers()&#xff09; 从缓冲区到 attribute 变量的流程&#xff1a; // 顶点坐标 function initVertexBuffers(gl) {// 数据准备let verticesTexCoords new Float32Array([// 顶点坐标&#xff0c;纹理坐标-0.5, 0.5, 0.0, 1.0, -0.5, …

图像异常检测评估指标-分类性能

图像异常检测评估指标-分类性能 1. 混淆矩阵 混淆矩阵包括4个用于衡量分类算法性能的基本数值 四个字母代表的含义是&#xff1a;P&#xff08;Positive&#xff09;代表算法将样本预测为正类&#xff0c;N&#xff08;Negative&#xff09;代表算法将样本预测为负类&#xf…

ST7789读取ID错误新思路(以STC32G为例)

1.前言 前两天刚把ST7789写入搞定&#xff0c;这两天想折腾一下读取。最开始是读ID&#xff0c;先是用厂家送的程序&#xff0c;程序里面用的是模拟I8080协议&#xff0c;一切正常。后来我用STC32G的内置LCM模块&#xff0c;发现读取不出来。更神奇的是ID读不出来&#xff0c;…

[项目详解][boost搜索引擎#2] 建立index | 安装分词工具cppjieba | 实现倒排索引

目录 编写建立索引的模块 Index 1. 设计节点 2.基本结构 3.(难点) 构建索引 1. 构建正排索引&#xff08;BuildForwardIndex&#xff09; 2.❗构建倒排索引 3.1 cppjieba分词工具的安装和使用 3.2 引入cppjieba到项目中 倒排索引代码 本篇文章&#xff0c;我们将继续项…

【C++指南】类和对象(四):类的默认成员函数——全面剖析 : 拷贝构造函数

引言 拷贝构造函数是C中一个重要的特性&#xff0c;它允许一个对象通过另一个已创建好的同类型对象来初始化。 了解拷贝构造函数的概念、作用、特点、规则、默认行为以及如何自定义实现&#xff0c;对于编写健壮和高效的C程序至关重要。 C类和对象系列文章&#xff0c;可点击下…

GitLab+Jenkins 实现 Webhook 自动化触发构建

在持续集成和持续部署&#xff08;CI/CD&#xff09;过程中&#xff0c;如何实现代码提交后自动触发构建&#xff1f;今天&#xff0c;我们将通过GitLab与Jenkins的集成&#xff0c;利用Webhook实现自动化触发构建&#xff0c;为你的开发流程注入高效能量&#xff01; 在每次代…

Java 多线程(六)—— 线程池 和 工厂模式

线程池 随着现代计算机的发展&#xff0c;任务越来越多&#xff0c;线程创建也逐渐增加&#xff0c;每次让操作系统创建线程这个开销就有点大&#xff0c;因此&#xff0c;我们诞生了线程池的概念&#xff0c;线程池里面有很多线程&#xff0c;这些线程可以被用户去调用执行任…

Java最全面试题->Java基础面试题->JavaSE面试题->异常面试题

文章目录 异常1.说一下Java中的异常体系&#xff1f;2.Error和Exception的区别3.写出你最常见的 5 个 RuntimeException&#xff1f;4.如何处理异常?5.try()里面有⼀个return语句&#xff0c; 那么后面的finally{}里面的代码会不会被执行&#xff1f;什么时候执行&#xff0c;…

C++ 进阶:类相关特性的深入探讨

⭐在对C 中类的6个默认成员函数有了初步了解之后&#xff0c;现在我们进行对类相关特性的深入探讨&#xff01; &#x1f525;&#x1f525;&#x1f525;【C】类的默认成员函数&#xff1a;深入剖析与应用&#xff08;上&#xff09; 【C】类的默认成员函数&#xff1a;深入剖…

初阶数据结构【3】--单链表(比顺序表还好的一种数据结构!!!)

本章概述 前情回顾单链表实现单链表彩蛋时刻&#xff01;&#xff01;&#xff01; 前情回顾 咱们在上一章博客点击&#xff1a;《顺序表》的末尾&#xff0c;提出了一个问题&#xff0c;讲出了顺序表的缺点——有点浪费空间。所以&#xff0c;为了解决这个问题&#xff0c;我…

TypeScript 出现过的问题

不能将类型“unknown”分配给类型“string”。 不能直接将类型“unknown”分配给类型“string” /**** 【1 - 问题】会画红波浪线 ****/ window.document.title to?.meta?.title || /**** 【2 - 解决】解决红波浪线 ****/ const title: unknown to?.meta?.title || if …

QML 基本动画

在介绍完 QML 动画框架之后,现在我们来看看具体的动画及其用法。先从最常用的基本动画入手,这些动画包括:PropertyAnimation、ColorAnimation、Vector3dAnimation 和 PathAnimation 等,它们不仅能够帮助我们轻松地为应用程序添加动态效果,还能显著提升用户体验,使得界面更…

vue3 解决背景图与窗口留有间隙的问题

需要实现一个登录界面&#xff0c;login.vue的代码如下&#xff1a; <script> import { ref } from vue;export default {setup() {return {};}, }; </script><template><div id"login-container" class"login-container"><di…

中国古代数学的杰出研究成果之一 - 杨辉三角 - 怎么用go、C++进行编程解决

杨辉三角&#xff0c;又称帕斯卡三角形&#xff08;Pascals Triangle&#xff09;&#xff0c;是组合数学中的一个重要概念。它是一个三角形数组&#xff0c;其中每个数字是它上方左上方和右上方的数字之和。杨辉三角的每一行都代表了二项式展开式的系数&#xff0c;因此在数学…