性能工具之JMeter二次开发总结

文章目录

    • 一、前言
    • 二、自定义脚本
    • 三、自定义请求编写(Java Sampler)
    • 四、自定义函数
    • 五、小结

一、前言

掌握 JMeter 的脚本编写和执行,这基本已满足大部分的性能测试需求,但是面对各种各样的项目技术方案,有些需求是需要我们写代码实现的,那么性能测试工程师对 JMeter 二开就无法避免了,而 JMeter 作为 Apache 的开源性能测试工具允许使用者对其进行二次开发扩展,本文对常见的几种二开方法进行总结,方便大家学习查阅。

二、自定义脚本

JSR223 是一个用于将脚本嵌入 JMeter的Java源代码的框架。相当于一个小巧的 Java 源码解释器,简单来说就是可以在里面写代码,然后通过解释语言翻译成插件可以识别的指令去执行相关操作。

由于 JSR223 组件可用于增强对测试计划的控制,因此它们是使用 JMeter 进行性能测试的最有用工具之一。有一整套JMeter JSR223 组件:一个采样器,一个断言,前后之处理器,一个监听器和一个定时器。

在 JSR223 组件中使用一系列解释语言,常见的有 Groovy 和 BeanShell。

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

常见用法举例:

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

通过以上方式,基本实现了对请求的基本信息的获取,然后我们可以对这些信息做进一步的提取、判断等操作。

另外,我们可以使用 log 变量访问组件的 Logger 对象。Logger 类对于脚本编写非常重要,因为可以让我们更轻松地调试脚本,通过信息输出到 JMeter 日志,方便我们调试脚本。

BeanShell 日志打印示例如下:

#打印线程号
log.debug('Current thread number:'+ String.valueOf(ctx.getThreadNum()));#打印启动采样器名称
log.info('Sampler '+ sampler.getName()+' started’);#自定义告警
log.warn('Could not convert string, using default encoding');#打印错误信息
log.error("Malformed URL detected:", e);#打印响应数据
log.error("Response data:"+ prev.getResponseDataAsString());

其它使用方式可以参考本文:性能工具之 JMeter 快速入门

注意在 JMeter 高并发时不建议使用 BeanShell ,因为其消耗资源较多,相比 Groovy 要更高效。

三、自定义请求编写(Java Sampler)

实现 Java Sampler 自定义请求的两种方式

  • 继承 AbstractJavaSamplerClient 抽象类;
  • 实现 JavaSamplerClient 接口。

通过阅读源码可以发现 AbstractJavaSamplerClient 抽象类是 JavaSamplerClient 接口的子类,所以,我们可以新建一个 JavaClass,并继承 AbstractJavaSamplerClient。

AbstractJavaSamplerClient中 默认实现了四个可以覆盖的方法,分别是 getDefaultParameters(), setupTest(), runTest()和 teardownTest()方法。

  • getDefaultParameters 方法:主要用于设置传入界面的参数,这个方法由 JMeter 在进行添加 JavaRequest 时第一个运行,它决定了你要在 GUI 中默认显示哪些属性。当每次在 GUI 里点击建立 java requst sampler 的时候会调用该方法。该方法设置了 parameters 的初始值,也可以在 sampler 的 GUI 界面做进一步的修改;
  • setupTest方法:初始化方法,用于初始化性能测试时的每个线程,用于初始化测试脚本里面用到的变量,这些变量会在后续执行中使用。
  • runTest方法:性能测试时的线程运行体,实现功能逻辑的主方法,每个线程会循环执行这个方法。
  • teardownTest:方法为测试结束方法,用于结束性能测试中的每个线程,在每个线程执行完所有的测试工作之后执行,有点像 finally 的功能,比如,我开了一个数据库的连接,那么我要在所有的线程完成工作后关闭。

使用案例:

  • 性能工具之Jmeter压测Thrift RPC服务
  • 性能工具之Jmeter压测Hprose RPC服务

四、自定义函数

要实现二次扩展函数,主要有两点:
1、定义function 的类的 package 声明必须包含 .functions(新建的包需要特别注意,名字只能是 functions 结尾,否则打包放到 JMeter 中是没有办法识别这个插件)

2、需要继承实现 AbstractFunction 四个方法

  • execute方法用于接收Jmeter传入的参数值并执行工作
  • setParameters方法用于传递执行过程中的实际参数值
  • getReferenceKey方法用于定义函数名字
  • getArgumentDesc方法用于描述函数参数

在这里插入图片描述
使用案例:

  • 性能工具之Jmeter扩展函数及压测ActiveMQ实践

五、小结

通过本文学习,我们知道了如何使用代码方式扩展实现自己需要的工具,使用解释语言脚本和 jar 包插件引入都是工作中常见的,这也是 JMeter 的特色功能,希望大家日常工作中有所说帮助。

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

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

相关文章

mybatis多表查询(xml)

多表查询都用resultMap resultMap 说白了就是他可以手动设置映射参数&#xff0c;例如 可以指定 column代表数据库的参数 property 代表实体类的参数 <id column"roleid" property"id"></id> column代表数据库的参数 property 代表实体类…

【隐私计算】安全三方计算(3PC)的加法和乘法计算协议

ABY3中采用replicated secret sharing&#xff08;复制秘密分享&#xff09;机制&#xff0c;即2-out-of-3秘密分享&#xff0c;三个参与方的每一方都拥有share中的两份。下面来看一下这样做有什么好处。 2-out-of-3秘密分享 有 x , y x, y x,y两个操作数&#xff0c;先进行秘…

列表插槽使用

{label: 是否展示,prop: isShow,solt: true, }<!--自定义列 展示 1 不展示 0 --><template slot-scope"scope" slot"display"><div style"color: red;cursor: pointer"><el-switch v-model"scope.row.display" :…

在gitlab中使用gitlab-sshd替换ssh服务

参考&#xff1a;https://docs.gitlab.com/ee/administration/operations/gitlab_sshd.html 说明 gitlab-sshd 是 OpenSSH 的轻量级替代品&#xff0c;用于提供 SSH 操作。虽然 OpenSSH 使用受限的 shell 方法&#xff0c;但 gitlab-sshd 的行为更像是一个现代的多线程服务器应…

记录 | CUDA编程中声明内联函数的方法

下面将 say_hello() 声明为内联函数&#xff1a; #include <cstdio> #include <cuda_runtime.h>__device__ __inline__ void say_hello(){printf("Hello, world!\n"); }__global__ void kernel(){say_hello(); }int main(){kernel<<<1, 1>&…

Rust中由于错误使用锁引发的问题,单线程中的死锁现象【已解决】

问题描述&#xff1a;事情是这样的&#xff0c;我的程序在运行一个方法&#xff0c;运行到末尾&#xff0c;发现卡住了。   问题排查&#xff1a;我想这代码也没涉及到其他锁的获取啊&#xff0c;怎么会跑不动了呢&#xff0c;通过阅读代码发现&#xff0c;我创建了一个 Arc&…

ssm的网上奶茶店系统(有报告)。Javaee项目。

演示视频&#xff1a; ssm的网上奶茶店系统&#xff08;有报告&#xff09;。Javaee项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构&#xff0c;通过Spring SpringMvc Mybat…

Leetcode 216 组合总和 III

题意理解&#xff1a; 求数字1-9&#xff0c;任取k个数&#xff0c;其和为n的组合 每个数字只能用一遍 这里的求的是组合&#xff0c;即k个值不看顺序。 解题思路&#xff1a;按照回溯法解题模板 1.确定返回值及参数 List<>results :记录符合条件的结果 path&#xff1a;…

智能优化算法应用:基于动物迁徙算法无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于动物迁徙算法无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于动物迁徙算法无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.动物迁徙算法4.实验参数设定5.算法结果6.参考…

全面解析修复msvcr120.dll缺失问题的方法,msvcr120.dll丢失的原因

在计算机使用过程中&#xff0c;我们经常会遇到一些错误提示&#xff0c;其中最常见的就是“msvcr120.dll丢失”。这个错误通常会导致某些程序无法正常运行&#xff0c;给用户带来很大的困扰。那么&#xff0c;当我们遇到这个问题时&#xff0c;应该如何修复呢&#xff1f;本文…

【6】PyQt信号和槽

1. 信号和槽简介 信号和槽机制是 QT 的核心机制&#xff0c;应用于对象之间的通信 信号和槽是用来在对象间传递数据的方法当一个特定事件发生的时候&#xff0c;signal会被emit出来&#xff0c;slot调用是用来响应相应的signal的Qt中对象已经包含了许多预定义的 signal&#…

JAVA 线程池,及7大参数,4大拒绝策略详解

为什么要使用线程池 线程的生命周期&#xff1a;运行、就绪、运行、阻塞、死亡 下面是一个简单的创建多线程的方法。注意&#xff1a;工作中不可取。 创建线程的时候&#xff0c;我们避不开线程的生命周期。上面的方法虽然可以创建多线程&#xff0c;但是创建完成后&#xff0c…

Ubuntu 环境安装 Kafka、配置运行测试 Kafka 流程笔记

Kafka 介绍 Kafka 是一个由 Apache 软件基金会开发的开源流式处理平台。它被设计用于处理大规模数据流&#xff0c;提供高可靠性、高吞吐量和低延迟的消息传递系统。Kafka 可以用于构建实时数据管道和流式应用程序&#xff0c;让不同应用、系统或者数据源之间能够高效地进行数…

老师怎样避免精神内耗?

在老师的职业生涯中&#xff0c;遇到的挑战和压力可能会导致精神内耗&#xff0c;这会影响到心理和身体健康&#xff0c;更进一步影响到工作成果和个人生活。为了避免精神内耗&#xff0c;老师可以尝试以下方法&#xff1a; 1. 建立正面的心态&#xff1a;老师需要学会积极思考…

卡码网语言基础课 | 19. 洗盘子

目录 一、 栈的基本概念 二、 栈的操作 2.1 引入头文件 2.2 创建栈 2.3 栈的基本认识 三、 解答 通过本次练习&#xff0c;将学习到以下 C知识点&#xff1a; 栈的基本概念&#xff08;空栈、栈顶、栈底&#xff09;和特点&#xff08;先入后出&#xff09;入栈、出栈、获取…

PostGIS学习教程十:空间索引

PostGIS学习教程十&#xff1a;空间索引 回想一下&#xff0c;空间索引是空间数据库的三个关键特性之一。空间索引使得使用空间数据库存储大型数据集成为可能。在没有空间索引的情况下&#xff0c;对要素的任何搜索都需要对数据库中的每条记录进行"顺序扫描"。索引通…

设计模式——七大设计原则

设计模式——七大设计原则 1、单一职责原则&#xff08;SRP&#xff09;2、开放封闭原则&#xff08;OCP&#xff09;3、依赖倒转原则&#xff08;DIP&#xff09;4、里氏替换原则 (LSP)5、接口隔离原则 (ISP)6、合成/聚合复用原则 (CARP)7、迪米特法则 (LoD) 了解 设计模式 的…

网络编程HTTP协议进化史

一、Http报文格式 具有约定格式的数据块 请求报文 request 状态行&#xff1a;本次请求的请求方式&#xff08;post get&#xff09;资源路径url http 协议的版本号&#xff0c;中间用空格划分 本次请求的请求方式&#xff08;post get&#xff09;资源路径url http 协议…

如何使用llm 制作多模态

首先将任何非字符的序列信息使用特殊n个token 编码。 具体编码方法以图像为例子说明&#xff1a; 将固定尺寸图像如256256 的图像分割为1616 的子图像块。 将已知的所有图像数据都分割后进行str将其看做是一个长的字符&#xff0c;而后去重后方式一个词表。 使用特殊1024 个tok…

ajax检查密码是否一致

如果你只需要在前端展示密码是否匹配的信息而不涉及后端处理&#xff0c;可以通过纯HTML和JavaScript实现。以下是一个简单的例子&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"…