【Jmeter】深度解剖Jmeter的二次开发

JMeter 是一个功能强大的性能测试工具,但它可能无法满足特定项目或组织的特定需求。通过进行二次开发,可以定制 JMeter,使其适应具体项目的需求。例如,可能需要添加自定义的测试元件、报告生成器或结果分析器等。二次开发三种方式:

  • 自定义 BeanShell 功能

  • 自定义请求编写(Java Sampler)

  • 自定义函数助手

  • 自定义 BeanShell 功能

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

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

01 配置元件中的 BeanShell

在 JMeter 的配置元件中,可以使用 BeanShell 功能来设置变量、生成动态数据或执行其他自定义逻辑。

例如,想要在每个线程中生成一个随机数,并将其存储在一个变量中,可以使用以下 BeanShell 脚本:

  1. int randomNumber = (int) (Math.random() * 100);

  2. vars.put("randomNumber", String.valueOf(randomNumber));

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

02 前置处理器和后置处理器中的 BeanShell

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

  1. log.info("code is "+prev.getResponseCode());

  2. #获取响应的状态码

  3. log.info("response is "+prev.getResponseDataAsString());

  4. #获取响应信息

  5. log.info("content_type "+prev.getContentType());

  6. #获取头文件中ContentType类型

  7. log.info("header "+prev.getRequestHeaders());

  8. #获取取样器请求首部字段

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

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

  • JMeter 本身需要自行拓展的请求或者不支持的测试协议,我们可以使用 Java 请求来完成;

  • 自定义辅助函数,协助我们进行性能测试。

03 自定义请求编写(Java Sampler)

  • 实现 Java Sampler 功能的两种方式

  • 继承 AbstractJavaSamplerClient 抽象类;

  • 实现 JavaSamplerClient 接口。

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

3.1 setupTest(JavaSamplerContext)

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

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

3.2 getDefaultParameters()

getDefaultParameters 方法用于定义默认的请求参数。它返回一个 JMeterArgumentsArray 对象,该对象包含了请求参数的默认值和描述。

这些默认参数将显示在 JMeter 的用户界面中,用户可以根据需要进行修改。通过这个方法,您可以为您的自定义 Java Sampler 提供默认的请求参数,使其易于配置和使用。

3.3 getSampleVariables()

getSampleVariables 方法返回一个字符串数组,其中包含您希望在请求执行期间保存的变量名。

这些变量将存储在 JMeter 的 SampleResult 对象中,供其他组件使用。通过这个方法,您可以指定自定义 Java Sampler 生成的变量,以便在测试计划中的其他组件中进行引用和使用。

3.4 runTest(JavaSamplerContext)

runTest 方法是最重要的方法,它包含了自定义请求逻辑的实现。它接收一个 JavaSamplerContext 对象作为参数,该对象提供了访问测试计划、线程组和全局配置等的上下文信息。

在 runTest 方法中,您可以编写自定义的请求逻辑,例如执行 HTTP 请求、数据库查询或其他自定义操作。您可以使用 JMeter 提供的 API 来访问请求参数、变量、结果收集器等,并使用 SampleResult 对象设置请求结果、响应消息和状态码等。

04 测试案例使用 JavaSampler

重写 HTTP 的 POST 请求

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

  1. //HttpClients提供功支持 HTTP 协议的客户端工具

  2. httpClient = HttpClients.createDefault();

  3. //新建一个HttpPost请求的对象将url,接口参数等信息传给这个对象

  4. HttpPost httpPost = new HttpPost(URL);

  5. //传入请求参数

  6. httpPost.setEntity(new UrlEncodedFormEntity(Value, UTF8_CHARSET));

  7. // 设置header信息,指定报文头Content-type等

  8. httpPost.setHeader("Content-type", "xxxxx");

  9. // 执行请求操作,并拿到结果

  10. response = httpClient.execute(httpPost);

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

  1. public Arguments getDefaultParameters() {

  2. Arguments arguments = new Arguments();

  3. arguments.addArgument("url","127.0.0.1:9081");

  4. arguments.addArgument("username", "zhangtian");

  5. arguments.addArgument("password", "12345");

  6. return arguments;

  7. }

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

  1. public SampleResult runTest(JavaSamplerContext javaSamplerContext) {

  2. //生成sampleResult对象,用于请求的命名、标记状态、添加返回内容等

  3. SampleResult sampleResult=new SampleResult();

  4. sampleResult.setSampleLabel("cctester_login");

  5. //调用上文中实现的post请求

  6. PostTest postTest=new PostTest();

  7. //接受JMeter界面上传输的参数

  8. String username = javaSamplerContext.getParameter("username");

  9. String password = javaSamplerContext.getParameter("password");

  10. String url = javaSamplerContext.getParameter("url");

  11. //标记请求开始

  12. sampleResult.sampleStart();

  13. try {

  14. HttpResponse result =postTest.Request(url,username,password);

  15. String entity= EntityUtils.toString(result.getEntity());

  16. //根据返回内容判断结果状态并展示结果

  17. if (result.getStatusLine().getStatusCode()==200){

  18. sampleResult.setSuccessful(true);

  19. sampleResult.setResponseCodeOK();

  20. sampleResult.setResponseData(entity, "utf-8");

  21. }else {

  22. sampleResult.setSuccessful(false);

  23. sampleResult.setResponseData(entity, "utf-8");

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

05 自定义函数助手

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

  1. <dependency>

  2. <groupId>org.apache.jmeter</groupId>

  3. <artifactId>ApacheJMeter_functions</artifactId>

  4. <version>5.3</version>

  5. </dependency>

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

  1. public String getReferenceKey() {} //这一方法表示函数助手对话框中的下拉框中显示的函数名称

  2. public List<String> getArgumentDesc() {} //设置入参的描述语,用于函数助手对话框中,显示函数名称提示

  3. public void setParameters(Collection<CompoundVariable> collection) {} // 参数值传入

  4. public String execute(SampleResult sampleResult, Sampler sampler){} // 根据入参,执行核心逻辑,保存结果至相应的变量中

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

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

​​​​​​​

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

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

相关文章

621-3580RC输入模块

621-3580RC 输入模块621-3580RC 是工业自动化控制系统中的 数字/离散输入模块&#xff0c;用于接收现场开关、传感器或其他数字设备的信号&#xff0c;并将其传递给控制系统进行处理。核心作用信号采集&#xff1a;将现场数字量&#xff08;开关状态、继电器信号等&#xff09;…

宏智树AI藏大招!课程论文不用熬,3步写出高分稿

作为深耕论文写作科普的博主&#xff0c;后台每天都被同学问&#xff1a;“课程论文怎么写才不敷衍&#xff1f;”“几千字的稿子&#xff0c;有没有高效又不踩雷的方法&#xff1f;” 其实课程论文虽不像毕业论文那样严苛&#xff0c;却也卡在“知识点落地、格式合规、查重达标…

2025年市场新动向:中式服装加盟哪家强?最新排行揭晓,中式服装加盟排行榜技术领航者深度解析

近年来,随着文化自信的回归与消费升级的深化,中式服装市场正经历一场从“国潮”到“国风”的深刻演变。消费者不再满足于简单的符号化设计,转而追求更具文化底蕴、工艺价值与日常穿着体验的新中式服饰。这一趋势催生…

2026 1月晚练记录

Week 4 Tuesday(1.20) P3092 [USACO13NOV] No Change G 水题(但我为什么数组开小了呢) 不难发现,\(k\) 的值很小,我们可以考虑状态压缩。 令 \(f_i\) 表示我状态为\(i\) 时我能走到的最大距离,最后用二分和前缀…

软件测试or车载测试,到底该怎么选?

随着各种软件的开发&#xff0c;以及智能汽车的发展&#xff0c;软件测试和车载测试在保障各系统的可靠性和稳定性起着至关重要的作用。 他们都致力于确保系统的质量&#xff0c;保障各系统正常运行&#xff0c;但因为二者的应用领域不同&#xff0c;在诸多方面既有相同点也有…

那曲市英语雅思培训辅导机构推荐,2026权威出国雅思课程中心学校口碑排行榜

经教育部教育考试院备案、全国雅思教学质量评估中心独家指导,参照《2025-2026中国大陆雅思备考趋势白皮书》核心指标,结合那曲市色尼区、安多县、聂荣县、班戈县、比如县等区县9000份考生调研问卷、95家教育机构实测…

lvgl v8之list控件使用

static lv_obj_t* list1;static void event_handler(lv_event_t* e) {lv_event_code_t code = lv_event_get_code(e);lv_obj_t* obj = lv_event_get_target(e);if (code == LV_EVENT_CLICKED

宏智树 AI:一键生成三类高分 PPT,学术汇报再也不用熬大夜

作为深耕论文写作科普的教育博主&#xff0c;后台被问得最多的问题不是 “论文框架怎么搭”&#xff0c;也不是 “参考文献怎么排”&#xff0c;而是 “PPT 怎么做才能让导师眼前一亮”。不管是开题报告的思路呈现、论文答辩的成果展示&#xff0c;还是职场的工作汇报&#xff…

分布式架构:Dubbo 协议如何做接口测试

传统单体架构是一个应用程序进程内处理完所有的逻辑&#xff1a;一个系统糅合了多个功能&#xff0c;如注册 --登录--充值--余额管理--用户积分等&#xff0c;所有的功能模块都是在一个应用程度里处理完的&#xff1b;一个请求过来--> 到应用程序系统-->数据库处理-->…

北京研究生留学中介top10排名揭晓,收费透明,选择无忧

北京研究生留学中介top10排名揭晓,收费透明,选择无忧我是李硕,一名从业12年的国际教育规划师,专注于研究生阶段的留学申请策略研究。在2026年1月10日的今天,随着留学申请竞争日趋激烈与信息愈发繁杂,许多计划赴海…

详细介绍:STM32百问百答:从硬件到软件全面解析

详细介绍:STM32百问百答:从硬件到软件全面解析pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", …

java_ssm13低值高校办公耗材易耗品管理信息系统的设计与实现_1s9ke

目录具体实现截图摘要系统所用技术介绍写作提纲源码文档获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&#xff01;具体实现截图 摘要 高校办公耗材管理是行政后勤工作的重要组成部分&#xff0c;传统人工管理方式存在效率低、易出错、库存不透明等问题。…

量子开发崛起:软件工程师必学的3个入门技能

量子时代的测试新挑战 量子计算正从实验室走向产业化&#xff0c;IBM和Google等公司已实现超千量子比特系统&#xff0c;为软件开发奠定硬件基础。对软件测试从业者而言&#xff0c;量子软件的特性&#xff08;如叠加态和纠缠&#xff09;带来了前所未有的测试难题&#xff1a…

DeepSeek+LangChain+DeepDiff:智能测试数据自动对比工具

在日常的测试工作中&#xff0c;我们在测试数据对比时经常会遇到以下难题&#xff1a; 对比的差异结果缺少清晰的可视化呈现&#xff1b; 两个表处于不同的数据库中&#xff0c;增加了对比难度&#xff1b; 源表和目标表字段数量众多&#xff0c;业务逻辑复杂&#xff0c;手动…

广州最好的研究生留学机构评选,学员满意度高成核心优势

广州最好的研究生留学机构评选,学员满意度高成核心优势一、 广州学子如何甄选可靠的研究生留学伙伴?在广州这座高等教育资源丰富的城市,每年都有大量本科毕业生将目光投向海外名校,期盼通过研究生深造提升竞争力。…

智慧水务为什么越来越多项目选择 BL118|水务物联网边缘计算方案解析

智慧水务,为什么越来越多项目选择 BL118? ——基于钡铼技术 BL118 的水务物联网采集与边缘计算方案 过去,水厂、管网、泵房的运维大多依赖人工巡检。流量、压力、水质、液位是否异常?只能靠现场查看;设备出了故障…

2026合肥优质设备搬运吊装公司推荐榜

2026合肥优质设备搬运吊装公司推荐榜行业背景与筛选依据据《2026-2026中国城市搬家服务行业发展白皮书》数据显示,合肥地区工业设备搬运吊装需求同比2024年增长18.7%,随着制造业、餐饮业、金融业的扩张,企业对重型设…

揭秘苏州硕士留学机构:top10申请成功率高的关键因素

揭秘苏州硕士留学机构:top10申请成功率高的关键因素一、苏州学生如何甄别高成功率留学机构?在苏州,许多计划攻读硕士学位的学子们常常在搜索引擎中提出这样的问题:“苏州本地哪家留学中介最靠谱?”、“如何判断一…

指数期权备兑策略量化实现

策略功能与核心逻辑说明 本策略聚焦于指数期权备兑开仓场景的量化实现&#xff0c;通过Backtrader框架完成从数据接入、指标计算到交易执行的全流程自动化。核心功能包括&#xff1a;实时获取标的指数&#xff08;如沪深300&#xff09;行情数据&#xff0c;动态计算期权隐含波…

探索超声波方案在汽车门板塑焊机中的奇妙应用

超声波方案 汽车门板朔焊机电路板控制板显示板源码程序 可代客户加工生产超声波 换能器 手柄外壳 铝件 焊头嘿&#xff0c;各位技术爱好者们&#xff01;今天咱来聊聊超有趣的超声波方案&#xff0c;特别是在汽车门板塑焊机电路板、控制板以及显示板源码程序这块。这可是个技术…