jmeter二次开发发送java请求_保姆级教程!!!

news/2025/2/13 22:46:56/

一、引言

JMeter是Apache基金会开发的一款开源性能测试工具,广泛应用于软件性能测试领域。它能够模拟多线程并发用户对应用程序进行压力测试,以评估应用程序的性能和稳定性。然而,在实际使用过程中,用户可能会遇到需要发送Java请求的场景,例如测试Java Web应用程序或其他支持Java RESTful API的服务。本文将介绍如何在JMeter中发送Java请求,并给出一些实用的技巧和注意事项。

二、java请求简介

查阅以往资料,现探究出两种jmater发送Java请求的方式,第一种通过将自己打包的jar通过jmeter函数助手的方式引用到java请求中,第二种是通过java请求直接引入jar包的方式,通过添加Beanshell取样器打印日志的方式,查看返回的结果。现将两种方式分别介绍。

三、实操

3.1jmeter函数二次开发

3.1.1思路
  1. JMeter提供了接口给用户进行二次开发,其中接口可通过引入ApacheJMeter_components.jar、ApacheJMeter_core.jar两个包获取。(或许你看到别人介绍所要用的jar包会更多,其实正常开发就这两个,所以至少保证有这两个包即可)
  2. 开发的代码需要符合JMeter的规范:第一,新建的包名称必须是以 functions 结尾;第二,方法类需要继承AbstractFunction类,而AbstractFunction类中有四个要实现的函数,其中我们要实现的功能需要结合这四个函数实现。
3.2.2环境准备
3.2.2.1添加依赖包
  • 依赖的业务相关jar放到lib目录下
  • jmeter相关jar放到ext目录下
    • 两个jar包在JMeter安装目录下的\lib\ext 文件夹,在工程里新建一个lib目录,把jar包放进去,然后添加到项目工程里
      • ApacheJMeter_components.jar
      • ApacheJMeter_core.jar
3.2.2.2重写AbstractFunction类中的方法

创建的包以functions结尾,同时创建的类继承AbstractFunction类,并重写类中的方法;

3.2.2.3AbstractFunction类四个方法的简单介绍

函数概要说明:

3.2.3案例分享

新建java代码后,将java代码打包传入jmeterext目录下

package com.functions;import org.apache.jmeter.engine.util.CompoundVariable;
import org.apache.jmeter.functions.AbstractFunction;
import org.apache.jmeter.functions.InvalidVariableException;
import org.apache.jmeter.samplers.SampleResult;
import org.apache.jmeter.samplers.Sampler;import java.util.Collection;
import java.util.LinkedList;
import java.util.List;public class HelloFunction extends AbstractFunction {//在jmeter中,约定俗成要求函数的名称必须是以"__"开头。private final static String key = "__hello";private static List<String> params = new LinkedList<String>();static {params.add("请输入用户名");params.add("请输入性别: 男or女");}public String username = "";public String sex = "";//用来定义函数的主体,即函数的结果由该方法来返回@Overridepublic String execute(SampleResult sampleResult, Sampler sampler) throws InvalidVariableException {String result = "";if(sex.equals("男")){result = username+",先生你好。";} else if (sex.equals("女")) {result = username+",女士你好。";}else {result = "无名氏你好,请问你是男是女?";}return result;}//用来接收和处理用户调用函数时所传入的参数值@Overridepublic void setParameters(Collection<CompoundVariable> arg0) throws InvalidVariableException {checkParameterCount(arg0,2);Object[] data = arg0.toArray();username = ((CompoundVariable)data[0]).execute();sex = ((CompoundVariable)data[1]).execute();}//用来定义函数的名称@Overridepublic String getReferenceKey() {return key;}//用来定义函数的参数列表@Overridepublic List<String> getArgumentDesc() {return params;}
}

重启jmeter,在函数助手中即可看到此java请求,示例如下

结果返回

3.2java请求二次开发

3.2.1实现目的
  • java方法打成jar包
  • jmeter二次开发调用该jar包方法
  • 响应结果保存为jmeter参数,供别的请求使用
3.2.2案例分享
3.2.2.1 java方法示例, 将以下方法打包
package com.gmrz.test;public class TestAdd {public int add(int a,int b){return a+b;}public static void main(String[] args) {TestAdd testAdd = new TestAdd();System.out.println(testAdd.add(1,7));}
}
3.2.2.2 新建一个maven,用于二次开发

导入jmeter二次开发核心jar包和加法jar包

3.2.2.3写个简单类,调用加法方法
package com.gmrz.jmeter;import com.gmrz.TestAdd;
import org.apache.jmeter.config.Arguments;
import org.apache.jmeter.protocol.java.sampler.JavaSamplerContext;
import org.apache.jmeter.protocol.java.sampler.AbstractJavaSamplerClient;
import org.apache.jmeter.samplers.SampleResult;
import org.apache.jmeter.threads.JMeterContextService;
import org.apache.jmeter.threads.JMeterVariables;public class JmeterSend1 extends AbstractJavaSamplerClient{public void setupTest(JavaSamplerContext context){System.out.println("start");}public void teardownTest(JavaSamplerContext context) {System.out.println("end");}public SampleResult runTest(JavaSamplerContext context) {TestAdd t = new TestAdd();SampleResult s = new SampleResult();s.sampleStart(); // 开始统计响应时间,取样器开始运行s.setSampleLabel("client"); //聚合报告里的lable名称JMeterVariables vars = JMeterContextService.getContext().getVariables();String first = context.getParameter("a"); //获取jmeter传递的参数String second = context.getParameter("b");Integer a = Integer.parseInt(first);Integer b = Integer.parseInt(second);try {vars.put("result", String.valueOf(t.add(a,b))); //jmeter参数变量名称s.setSamplerData("参数a:"+first+"\t参数b:"+second); //设置请求的数据,在查看结果树中可以看到s.setResponseCode("200");s.setResponseMessage("Success"); //没这个请求会变红s.setSuccessful(true);s.sampleEnd();return s;}catch (Exception e){e.printStackTrace();}s.setResponseCode("500");s.setResponseMessage("fail");return s;}public Arguments getDefaultParameters() {//提取jmeter传递的参数Arguments args = new Arguments();args.addArgument("a", "");args.addArgument("b", "");System.out.println("get Arguments");return args;}
}
3.2.2.4打好的jar包放入jmeter:/lib/ext 下

打开jmeter,此方法即为新加的java请求

返回此java请求的结果

四、总结

在本文中,我们详细介绍了如何在JMeter中发送Java请求,包括使用JMeter内置的Java请求处理器和编写自定义的Java代码来实现复杂的请求。

通过本文的教程,读者应该能够掌握JMeter发送Java请求的基本步骤和技巧。为了更好地理解和应用这些知识,建议读者在实际项目中尝试使用JMeter进行Java请求的发送,并根据实际情况进行调整和优化。

总而言之,JMeter是一款强大的性能测试工具,能够帮助开发人员和测试人员模拟真实用户的行为,对应用程序进行全面的性能测试。掌握JMeter发送Java请求的方法和技巧,将有助于提高软件质量和用户体验。希望本文能够为您提供有益的指导,祝您在性能测试领域取得更好的成果!


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

相关文章

【数据分享】1929-2023年全球站点的逐年平均露点(Shp\Excel\免费获取)

气象数据是在各项研究中都经常使用的数据&#xff0c;气象指标包括气温、风速、降水、能见度等指标&#xff0c;说到气象数据&#xff0c;最详细的气象数据是具体到气象监测站点的数据&#xff01; 有关气象指标的监测站点数据&#xff0c;之前我们分享过1929-2023年全球气象站…

初识云原生、虚拟化、DevOps

文章目录 K8S虚拟化DevOpsdevops平台搭建工具大数据架构 K8S master 主节点&#xff0c;控制平台&#xff0c;Master节点负责核心的调度、管理和运维&#xff0c;不需要很高性能&#xff0c;不跑任务&#xff0c;通常一个就行了&#xff0c;也可以开多个主节点来提高集群可用度…

python项目练习——4.手写数字识别

使用Python和Scikit-learn库进行机器学习模型训练的项目——手写数字识别。 项目分析&#xff1a; 数据准备&#xff1a;使用公开数据集&#xff08;如MNIST&#xff09;作为训练和测试数据。数据预处理&#xff1a;对图像数据进行归一化、展平等操作&#xff0c;以便输入到机…

分布式系统面试全集通第一篇(dubbo+redis+zookeeper----分布式+CAP+BASE+分布式事务+分布式锁)

目录 分布式系统面试全集通第一篇什么是分布式?和微服务的区别什么是分布式分布式与微服务的区别 什么是CAP?为什么不能三者同时拥有分区容错性一致性可用性 Base理论了解吗基本可用软状态最终一致性 什么是分布式事务分布式事务有哪些常见的实现方案?2PC&#xff08;Two Ph…

【目标检测】NMS算法的理论讲解

将NMS就必须先讲IOU&#xff0c; IOU就是交并比&#xff0c;两个检测框的交集除以两个检测框的并集就是IOU 为什么要做NMS操作&#xff0c;因为要去除同一个物体的多的冗余检测框 那么NMS算法是如何做的呢&#xff1f; 以上是算法的流程图 下面讲解算法的流程 首先输入是预…

服务器中有g++,但是查询不到,Command ‘g++‘ not found

有gcc但是查询不到g&#xff0c;gcc版本为9.5.0 (base) zyICML:~$ g -V Command g not found, but can be installed with: apt install g Please ask your administrator. 突然就出现这个问题&#xff0c;导致detectron装不上&#xff0c;现在有时间了专门研究下怎么解决 这…

【工具】Raycast – Mac提效工具

&#x1f308;个人主页: 鑫宝Code &#x1f525;热门专栏: 闲话杂谈&#xff5c; 炫酷HTML | JavaScript基础 ​&#x1f4ab;个人格言: "如无必要&#xff0c;勿增实体" 引入 以前看到同事们锁屏的时候&#xff0c;不知按了什么键&#xff0c;直接调出这个框&a…

git提交和回退

目录 一. git 提交二. git commit 后准备回退&#xff0c;尚未 git push三. git add 添加多余文件 撤销操作四. 更改 Git commit 的默认编辑器五. 撤销某个commit的变更六. 回退到之前的commit状态总结&#xff1a; 一. git 提交 git pull # 更新代码 git status # 查看代码状…