jmeter 二次开发详解

背景:

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){}  // 根据入参,执行核心逻辑,保存结果至相应的变量中

 感谢每一个认真阅读我文章的人,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走:

这些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴上万个测试工程师们走过最艰难的路程,希望也能帮助到你!有需要的小伙伴可以点击下方小卡片领取 

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Springboot+vue的船舶监造系统(有报告)。Javaee项目,springboot vue前后端分离项目。

演示视频&#xff1a; Springbootvue的船舶监造系统&#xff08;有报告&#xff09;。Javaee项目&#xff0c;springboot vue前后端分离项目。 项目介绍&#xff1a; 本文设计了一个基于Springbootvue的船舶监造系统&#xff0c;采用M&#xff08;model&#xff09;V&#xff…

温湿度传感器SHT21

SHT21是一款基于IIC的温湿度传感器&#xff0c;它的引脚及定义如下&#xff1a; 标准的IIC器件&#xff0c;没有其他多余的引脚&#xff0c;应用框图如下&#xff1a; 温度的测量范围是-40到125℃&#xff0c;湿度测量范围0-100%RH&#xff0c;具体参数及采样精度见下图&#x…

鸿蒙ArkTs开发问题总结

版本问题 现阶段鸿蒙ArkTs开发主要分为两个版本 HarmonyOS3.x.x(API9)及HarmonyOS4.x.x(API10) 一下简称为 API9,API10 官方现在所有案例均以 HarmonyOS4.x.x(API10) 为基础请注意选择分支 API9&HarmonyOS3.x.x 鸿蒙开发编译器默认下载的为public版本SDK不是全量SDK需要…

【Linux】输入系统应用

# 前置知识 (1)输入子系统分为三层&#xff0c;分别是事件处理层、核心层、设备驱动层&#xff1b; (2)鼠标移动、键盘按键按下等输入事件都需要通过设备驱动层→核心层→事件处理层→用户空间&#xff0c;层层上报&#xff0c;直到应用程序; 事件处理层 (1)事情处理层主要是负…

Windows10蓝牙开关按钮不见了问题??

Windows10蓝牙开关按钮不见了问题&#xff1f;&#xff1f;此类问题一般是系统更新不及时的bug&#xff0c;遗漏掉了蓝牙相关驱动插件 试过很多方法&#xff0c;直接下载一个驱动人生即可&#xff0c;主要通过官网下载 下载这个就行 打开软件自动扫描就可以了 最后查看结果

Linkedln领英账号限制问题|通过代理IP安全使用Linkedln

LinkedIn是跨境外贸必备的拓客工具&#xff0c;世界各地的许多专业人士都使用领英来作为发布和共享内容的主要工具&#xff0c;这使得它成为跨境出海必备的渠道工具。 但是不少做外贸的朋友都知道&#xff0c;领英账号很容易遭遇限制封禁&#xff0c;但如果善用工具&#xff0…

深度相机xyz点云文件三维坐标和jpg图像文件二维坐标的相互变换函数

深度相机同时拍摄xyz点云文件和jpg图像文件。xyz文件里面包含三维坐标[x,y,z]和jpg图像文件包含二维坐标[x&#xff0c;y],但是不能直接进行变换&#xff0c;需要一定的步骤来推演。 下面函数是通过box二维框[xmin, ymin, xmax, ymax, _, _ ]去截取xyz文件中对应box里面的点云…

2023人机交互期末复习

考试题型及分值分布 1、选择题&#xff08;10题、20分&#xff09; 2、填空题&#xff08;10题、20分&#xff09; 3、判断题&#xff08;可选、5题、10分&#xff09; 4、解答题&#xff08;5~6题、30分&#xff09; 5、分析计算题&#xff08;1~2题、20分&#xff09; 注意&…

埃隆・马斯克46页文件起诉OpenAI违反成立初衷:一场涉及通用人工智能未来的法律纠纷

近日&#xff0c;科技界的重量级人物埃隆・马斯克对十年前他参与创立的生成式人工智能公司OpenAI提起诉讼&#xff0c;引发了广泛关注。马斯克指控OpenAI违反了他们之间的合同&#xff0c;并提出了一系列引人注目的言论&#xff0c;包括指责OpenAI将GPT-4称为通用人工智能&…

C# Onnx segment-anything 分割万物 一键抠图

目录 介绍 效果 模型信息 sam_vit_b_decoder.onnx sam_vit_b_encoder.onnx 项目 代码 下载 C# Onnx segment-anything 分割万物 一键抠图 介绍 github地址&#xff1a;https://github.com/facebookresearch/segment-anything The repository provides code for runn…

光伏储能MPPT控制系统如何进行浪涌静电保护?

MPPT&#xff08;Maximum Power Point Tracking&#xff09;是太阳能电池板光伏发电系统中重要的一种控制技术。MPPT控制器能够实时侦测太阳能板的发电电压&#xff0c;并追踪最高电压电流值&#xff08;VI&#xff09;&#xff0c;使系统以最大功率输出对蓄电池充电&#xff0…

libswift_Concurrency.dylib (which was built for iOS 13.0)

app启动时崩溃&#xff1a;libswift_Concurrency.dylib (which was built for iOS 13.0) ios真机系统版本过低

AI技术初探:普通人ALL IN AI入门指南

自从去年ChatGPT如流星划过夜空&#xff0c;照亮了整个AI领域&#xff0c;它所带来的技术革新与热潮仿佛一场无声的暴风雨&#xff0c;席卷了全球的科技圈。身为一名低阶IT从业者&#xff0c;感觉这太高大上了&#xff0c;与我的工作有毛线关系。 但是&#xff0c;AI技术的飞速…

数据库学习案例20240304-mysql数据库案例总结(碎片,统计信息)

1 表中的碎片 在InnoDB中删除行的时候&#xff0c;这些行只是被标记为“已删除”&#xff0c;而不是真正从物理存储上进行了删除&#xff0c;因而存储空间也没有真正被释放回收。InnoDB的Purge线程会异步地来清理这些没用的索引键和行。但是依然没有把这些释放出来的空间还给操…

pydub、playsound播放声音;gradio、streamlit页面播放声音;gradio 页面图像、视频及调用摄像头

1、pydub from pydub import AudioSegment from pydub.playback import playsong AudioSegment.from_wav(r"C:\Users\loong\Downloads\zh.wav") play(song)2、playsound from playsound import playsoundplaysound(r"voice.wav")3、streamlit import s…

李沐动手学习深度学习——3.5练习

减少batch_size&#xff08;如减少到1&#xff09;是否会影响读取性能&#xff1f; 肯定会影响&#xff0c;计算机io性能而言&#xff0c;随着batch_size增大&#xff0c;读取越来越快&#xff0c;需要的时间越少。这里会涉及到计算机操作系统的知识点&#xff0c;内存与硬盘之…

牛客网C++专项题目整理(1)

1. 若有定义语句:char s[3][10],(*k)[3],*p;则以下赋值语句错误的是 1.p s; 2.p k; 3.p s[0]; 4.k s; 答案&#xff1a;124 char s[3][10] s 是数组指针&#xff0c;类型为char (*)[3]&#xff0c;所指向的每个数组长度为10; char (*k)[3] k是一个数组指针&a…

C/C++ 乘积尾零问题(蓝桥杯)

如下的10行数据&#xff0c;每行有10个整数&#xff0c;请你求出它们的乘积的末尾有多少个零&#xff1f; 5650&#xff0c;4542 3554 473 946 4114 3871 9073 90 4329 2758 7949 6113 5659 5245 7432 3051 4434 6704 3594 9937 1173 6866 3397 4759 7557 3070 2287 1453 9899…

MySQL数据库运维第一篇(日志与主从复制)

文章目录 一、错误日志二、二进制日志三、查询日志四、慢查询日志&#xff08;记录超时的sql语句&#xff09;五、主从复制概括六、主从复制原理七、搭建主从复制八、主从复制的测试 在这篇深入的技术文章中&#xff0c;作者将以明晰透彻的方式详细介绍MySQL数据库中关键的日志…

蓝桥杯——123

123 二分等差数列求和前缀和数组 题目分析 连续一段的和我们想到了前缀和&#xff0c;但是这里的l和r的范围为1e12&#xff0c;明显不能用O(n)的时间复杂度去求前缀和。那么我们开始观察序列的特点&#xff0c;可以按照等差数列对序列进行分块。如上图&#xff0c;在求前10个…