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

devtools/2024/10/17 15:56:01/

文章目录

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

一、前言

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

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

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

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

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

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

二、实现代码

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

详细步骤:

  1. 创建 BeanShell PreProcessor:
  2. 创建一个 BeanShell PreProcessor 实例,并设置其脚本内容。
  3. 脚本内容将负责生成随机参数数组,并将这些参数传递给请求。
  4. 生成随机参数数组: 在脚本中生成随机参数数组,并将这些参数赋值给变量。
java">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)组装到测试计划中。

详细代码实现:

java">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);

在这里插入图片描述

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

上面写入成功。

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

java">// 构建 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代码:
在这里插入图片描述

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

三、代码示例

全部参考代码,如下:

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.ppmy.cn/devtools/126497.html

相关文章

【linux009】文件操作命令篇 - touch 命令

文章目录 touch 命令1、基本用法2、常见选项3、举例4、注意事项 touch 命令 touch 是 Linux 系统中的一个常用命令&#xff0c;用于创建空文件或更新已有文件的时间戳。它既可以用来快速生成新文件&#xff0c;也可以用来修改文件的访问时间&#xff08;access time, atime&am…

【JVM】一文详解类加载器

文章目录 类加载器的概述类加载器的分类启动类加载器(Bootstrap ClassLoader )扩展类型加载器(ExClassLoader)系统类加载器(Application ClassLoader )总结 双亲委派机制概念双亲委派机制的优势 ClassLoaderfindClassdefineClassloadClass&#xff0c;findClass&#xff0c;def…

js 精确计算(加减乘除)

js 精确计算(加减乘除) 工具类CalcUtil.js class CalcUtil {// 两数相加calcAdd(num1, num2) {var r1, r2, m;try {r1 num1.toString().split(.)[1].length;} catch (e) {r1 0;}try {r2 num2.toString().split(.)[1].length;} catch (e) {r2 0;}m Math.pow(10, Math.max…

ESP32-C3实现非易失变量(Arduino IDE )

1效果 网页输入数据&#xff0c;串口打印数据。掉电后数据还在 2源码 #include <WiFi.h> // 包含WiFi库&#xff0c;用于处理WiFi连接 #include <WebServer.h> // 包含WebServer库&#xff0c;用于创建Web服务器 #include <Preferences.h> // 包含Prefere…

uni-app写的微信小程序如何体积太大如何处理

方法一&#xff1a;对主包进行分包处理&#xff0c;将使用url: /pages/components/equipment/equipment跳转页面的全部拆分为分包&#xff0c;如url: /pagesS/components/equipment/equipment 在pages.json中添加 "subPackages": [{ "root"…

TensorFlow 的核心概念

TensorFlow 是一个开源的机器学习框架&#xff0c;由 Google 开发和维护。它提供了一个强大的工具集&#xff0c;用于构建和训练各种机器学习模型。 TensorFlow 的核心概念是计算图&#xff08;Computational Graph&#xff09;。计算图由节点&#xff08;Nodes&#xff09;和…

开发与部署项目依赖管理之旅:Docker和venv区别

Docker与venv的区别 Docker和虚拟环境&#xff08;venv&#xff09;都是用于管理依赖关系和隔离环境的工具&#xff0c;但它们服务的目的和特点有所不同。下面是它们的详细比较。 虚拟环境&#xff08;venv&#xff09; 目的&#xff1a; 特定于Python&#xff1a;venv专为…

客户端、PC端、移动端集成发票真伪验真API接口返回值说明

客户端、pc端、移动端集成翔云发票查验接口&#xff0c;在现如今财务管理喝税务合规越来越严的背景下&#xff0c;集成发票真伪验真接口有助于提升财务工作效率&#xff0c;防止税务风险&#xff0c;简化发票管理流程&#xff0c;提升发票管理与报销效率&#xff0c;合规管理税…