【Jmeter】二次开发

news/2025/2/22 11:01:56/

背景:

  JMeter 是一个功能强大的性能测试工具,但它可能无法满足特定项目或组织的特定需求。通过进行二次开发,可以定制 JMeter,使其适应具体项目的需求。例如,可能需要添加自定义的

测试元件、报告生成器或结果分析器等。二次开发三种方式:

  • 自定义 BeanShell 功能
  • 自定义请求编写(Java Sampler)
  • 自定义函数助手

自定义 BeanShell 功能

  在 JMeter 中,可以使用 BeanShell 脚本来进行自定义脚本编写和执行。BeanShell 是一种基于 Java 的脚本语言,它允许在 JMeter 中编写脚本以扩展功能或实现特定的行为。相当于一

个小巧的 Java 源码解释器,简单来说就是你可以在里面写代码,然后通过 Beanshell 翻译成插件可以识别的指令去执行相关操作。

1.  配置元件中的 BeanShell 功能:

在 JMeter 的配置元件中,可以使用 BeanShell 功能来设置变量、生成动态数据或执行其他自定义逻辑。例如,想要在每个线程中生成一个随机数,并将其存储在一个变量中,可以使

用以下 BeanShell 脚本:

int randomNumber = (int) (Math.random() * 100);
vars.put("randomNumber", String.valueOf(randomNumber));

在 BeanShell 脚本中,可以使用常规的 Java 语法和函数,以及 JMeter 提供的特定函数和变量。在上面的示例中,我们使用 Math.random() 函数生成一个随机数,并将其存储在名为 randomNumber 的 JMeter 变量中。

2. 前置处理器和后置处理器中的 BeanShell 功能:

  BeanShell 最常被用于对请求或者返回内容进行获取或者加工,其中 prev 是对当前的取样进行访问,执行了对响应状态码、响应信息、请求头等的操作,示例如下:

log.info("code is  "+prev.getResponseCode());#获取响应的状态码log.info("response is "+prev.getResponseDataAsString());#获取响应信息log.info("content_type  "+prev.getContentType());#获取头文件中ContentType类型log.info("header "+prev.getRequestHeaders());#获取取样器请求首部字段

JMeter 调用 BeanShell 解释器来运行脚本,虽然好用,但不建议频繁使用, 因为在 JMeter 高并发时,它将会消耗较多的本地资源,所以一般遇到逻辑相对复杂且代码量较大的

情况,我们会使用 JMeter 的另一种功能:开发自定义插件(jar 形式),一般来说自定义的插件会帮助我们实现两方面功能:

  • JMeter 本身需要自行拓展的请求或者不支持的测试协议,我们可以使用 Java 请求来完成;
  • 自定义辅助函数,协助我们进行性能测试。

自定义请求编写(Java Sampler)

实现 Java Sampler 功能的两种方式
  • 继承 AbstractJavaSamplerClient 抽象类;
  • 实现 JavaSamplerClient 接口。

通过阅读源码可以发现 AbstractJavaSamplerClient 抽象类是 JavaSamplerClient 接口的子类,其中 JavaSamplerClient 接口中四个主要方法是:

  1.  setupTest(JavaSamplerContext):

    setupTest 方法在执行测试之前被调用,用于初始化资源或设置必要的前置条件。它接收一个 JavaSamplerContext 对象作为参数,该对象提供了访问测试计划、线程组和全局配置

等的上下文信息。在 setupTest 方法中,您可以执行一次性的初始化操作,例如建立数据库连接、创建 HTTP 客户端等。这个方法只会在整个测试计划的生命周期内调用一次。         

  2.  getDefaultParameters():

    getDefaultParameters 方法用于定义默认的请求参数。它返回一个 JMeterArgumentsArray 对象,该对象包含了请求参数的默认值和描述。这些默认参数将显示在 JMeter 的用户界面中,用户可以根据需要进行修改。通过这个方法,您可以为您的自定义 Java Sampler 提供默认的请求参数,使其易于配置和使用。

  

  3. getSampleVariables():

    getSampleVariables 方法返回一个字符串数组,其中包含您希望在请求执行期间保存的变量名。这些变量将存储在 JMeter 的 SampleResult 对象中,供其他组件使用。通过这个方法,您可以指定自定义 Java Sampler 生成的变量,以便在测试计划中的其他组件中进行引用和使用

  4. runTest(JavaSamplerContext):

    runTest 方法是最重要的方法,它包含了自定义请求逻辑的实现。它接收一个 JavaSamplerContext 对象作为参数,该对象提供了访问测试计划、线程组和全局配置等的上下文信息。在 runTest 方法中,您可以编写自定义的请求逻辑,例如执行 HTTP 请求、数据库查询或其他自定义操作。您可以使用 JMeter 提供的 API 来访问请求参数、变量、结果收集器等,并使

用 SampleResult 对象设置请求结果、响应消息和状态码等。

案例:使用 JavaSampler 重写 HTTP 的 POST 请求

 1)首先我们来完成 POST 请求的核心方法,先使用 HttpClients 发送构建的 POST 数据包,然后获取到返回值,这一步是完成 POST 请求的基本步骤,示例代码如下:

//HttpClients提供功支持 HTTP 协议的客户端工具httpClient = HttpClients.createDefault();//新建一个HttpPost请求的对象将url,接口参数等信息传给这个对象HttpPost httpPost = new HttpPost(URL);//传入请求参数httpPost.setEntity(new UrlEncodedFormEntity(Value, UTF8_CHARSET));// 设置header信息,指定报文头Content-type等httpPost.setHeader("Content-type", "xxxxx");// 执行请求操作,并拿到结果response = httpClient.execute(httpPost);

(2)接下来实现 JavaSamplerClient 接口,这是编写 Java Sampler 插件需要实现的核心接口,涉及的方法是 getDefaultParameters() 和 runTest(),作用上文已经描述过。下面带你来看具体怎么使用的,如下代码所示:

public Arguments getDefaultParameters() {Arguments arguments = new Arguments();arguments.addArgument("url","127.0.0.1:9081");arguments.addArgument("username", "zhangtian");arguments.addArgument("password", "12345");return arguments;}

(3)在上一步骤进行了参数的输入,接下来实现接收这些参数,并进行参数的输入、发送、返回判断等。runTest 方法中,主要编写自己的请求逻辑 如下代码所示:


public SampleResult runTest(JavaSamplerContext javaSamplerContext) {//生成sampleResult对象,用于请求的命名、标记状态、添加返回内容等SampleResult sampleResult=new SampleResult();sampleResult.setSampleLabel("cctester_login");//调用上文中实现的post请求PostTest postTest=new PostTest();//接受JMeter界面上传输的参数String username = javaSamplerContext.getParameter("username");String password = javaSamplerContext.getParameter("password");String url = javaSamplerContext.getParameter("url");//标记请求开始sampleResult.sampleStart();try {HttpResponse result =postTest.Request(url,username,password);String entity= EntityUtils.toString(result.getEntity());//根据返回内容判断结果状态并展示结果if (result.getStatusLine().getStatusCode()==200){sampleResult.setSuccessful(true);sampleResult.setResponseCodeOK();sampleResult.setResponseData(entity, "utf-8");}else {sampleResult.setSuccessful(false);sampleResult.setResponseData(entity, "utf-8");)

(4)将 Java 类编译为 JAR 文件,并将该 JAR 文件放置在 JMeter 的 lib/ext 目录中,以便 JMeter 可以加载它

自定义函数助手

1)引入 Maven 包,这个包会给我们提供函数助手开发相关的类,如下代码所示:

<dependency><groupId>org.apache.jmeter</groupId><artifactId>ApacheJMeter_functions</artifactId><version>5.3</version></dependency>

(2)新建类包,新建的包名字只能是 functions 结尾,否则打包放到 JMeter 中是没有办法识别这个插件的,然后代码中继承 AbstractFunction 类就可以实现,主要实现以下方法。

   public String getReferenceKey() {} //这一方法表示函数助手对话框中的下拉框中显示的函数名称public List<String> getArgumentDesc() {} //设置入参的描述语,用于函数助手对话框中,显示函数名称提示public void setParameters(Collection<CompoundVariable> collection) {} // 参数值传入public String execute(SampleResult sampleResult, Sampler sampler){}  // 根据入参,执行核心逻辑,保存结果至相应的变量中

2023最新Jmeter接口测试从入门到精通(全套项目实战教程)


http://www.ppmy.cn/news/1139055.html

相关文章

【面试题精讲】深拷贝和浅拷贝区别了解吗?什么是引用拷贝?

“ 有的时候博客内容会有变动&#xff0c;首发博客是最新的&#xff0c;其他博客地址可能会未同步,认准https://blog.zysicyj.top ” 首发博客地址[1] 面试题手册[2] 系列文章地址[3] 深拷贝和浅拷贝的区别&#xff1a; 深拷贝&#xff08;Deep Copy&#xff09;和浅拷贝&#…

offer突击训练营,给你一个offer的保障,求职跳槽的看过来!

大家好&#xff0c;我是枫哥&#xff0c;&#x1f31f;阿里云技术专家、&#x1f4dd;资深面试官、&#x1f339;Java跳蚤网课堂创始人。拥有多年一线研发经验&#xff0c;曾就职过科大讯飞、美团网、平安等公司。 目前组建的团队&#xff0c;专注Java技术分享&#xff0c…

iMazing 2.17.10官方中文版含2023最新激活许可证码

iMazing 2.17.10官方中文版是一款iOS设备管理软件&#xff0c;该软件支持对基于iOS系统的设备进行数据传输与备份&#xff0c;用户可以将包括&#xff1a;照片、音乐、铃声、视频、电子书及通讯录等在内的众多信息在Windows/Mac电脑中传输/备份/管理。 iMazing 2.17.10官方中文…

Linux 系统为何产生大量的 core 文件?

Author&#xff1a;rab 目录 一、问题分析二、解决方案扩展 一、问题分析 上一篇刚讲到《Docker 配置基础优化》&#xff0c;这里再补充一下。就在中秋国庆这段小长假里&#xff0c;接收到了线上服务器磁盘告警通知&#xff0c;线上服务器架构是一个 Docker Swarm 集群&#x…

支持向量机SVM:从数学原理到实际应用

目录 一、引言背景SVM算法的重要性 二、SVM基础线性分类器简介什么是支持向量&#xff1f;超平面和决策边界SVM的目标函数 三、数学背景和优化拉格朗日乘子法&#xff08;Lagrange Multipliers&#xff09;KKT条件核技巧&#xff08;Kernel Trick&#xff09;双重问题和主问题&…

【STM32 LVGL基础教程】初识LVGL

文章目录 前言一、什么是LVGL&#xff1f;二、LVGL的诞生历程三、LVGL的用途四、模拟器使用LVGL4.1 下载codeblocks并运行模拟器lvgl4.2 更改lvgl设置更改帧数更改颜色深度 五、STM32使用LVGL总结 前言 嵌入式系统中的图形用户界面&#xff08;GUI&#xff09;已经成为现代设备…

【Java每日一题】— —第二十三题:匿名对象及其使用问题(2023.10.07)

&#x1f578;️Hollow&#xff0c;各位小伙伴&#xff0c;今天我们要做的是第二十三题。 &#x1f3af;问题&#xff1a; 匿名对象的应用场景如下&#xff1a; A:调用方法&#xff0c;仅仅只调用一次的时候。 注意&#xff1a;调用多次的时候&#xff0c;不适合。 那么&#x…

c#利用Chart 画图

c#利用Chart 画图 添加画图组件 编写代码 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; …