一、需求背景

在日常压测过程中,有些请求逻辑比较复杂的时候,Jmeter 中自带的sample取样器不够灵活,或者性能就会比较低了,这个时候就可以自己写java代码实现自己的请求。

二、准备工作

1、创建Maven工程

2、引入Jmeter相关Jar包


其中ApacheJMeter_core和ApacheJMeter_java2个jar是自定义Jmeter请求的核心开发包,两个jar包的版本需要和你本地jmeter版本保持一致,防止因为版本不一致出现问题,unirest-java该jar包主要用于发送get、post请求

相关jar可以去 https://mvnrepository.com/ 查询引用

3、配置maven打包插件

 <build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>3.8.1</version><configuration><source>1.8</source><target>1.8</target></configuration></plugin><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-assembly-plugin</artifactId><version>3.3.0</version><configuration><descriptorRefs><descriptorRef>jar-with-dependencies</descriptorRef></descriptorRefs></configuration><executions><execution><id>make-assembly</id><phase>package</phase><goals><goal>single</goal></goals></execution></executions></plugin></plugins></build>

三、开始

1、创建Java测试类

新建一个类,类名为任意取,遵循Java命名规范即可,该类继承AbstractJavaSamplerClient类,AbstractJavaSamplerClient存在于ApacheJMeter_java.jar这个JAR包中,引用即可调用。

常用的4个方法如下:
setupTest(): 初始化方法,用于初始化性能测试时的每个线程;

getDefaultParameters(): 主要用于设置传入的参数;

runTest(): 为性能测试时的线程运行体;该方法在测试类继承AbstractJavaSamplerClient类时,必须实现的方法

teardownTest(): 测试结束方法,用于结束性能测试中的每个线程。

package com.apache.jmeter.functions;import kong.unirest.HttpResponse;
import kong.unirest.JsonNode;
import kong.unirest.Unirest;
import org.apache.jmeter.config.Arguments;
import org.apache.jmeter.protocol.java.sampler.AbstractJavaSamplerClient;
import org.apache.jmeter.protocol.java.sampler.JavaSamplerContext;
import org.apache.jmeter.samplers.SampleResult;import java.io.Serializable;
import java.util.HashMap;/*** Created by YangWeiMin on 2021/12/6*/
public class PageQuery extends AbstractJavaSamplerClient implements Serializable {// 该部分主要设置一些静态变量,可以是接口请求参数或者其他变量private static final String env = "xxxxx";private static final String creatorUserCode = "xxxxxx";private static final Integer offset = xxxxx;private static final String releaseTimeFrom = "xxxxxxx";private static final String releaseTimeTo = "xxxxxx";private static final Integer size = xxxxxx;private static final String dynamicInfoCode = null;private static final String url = env + "/api/xxxxx/query";private static final String token = null;// 该部分代码主要设置Unirest连接池配置static {Unirest.config().concurrency(1000, 100);}// 该部分代码主要是用于设置参数显示,此处设置的参数可以在jmeter中展示@Overridepublic Arguments getDefaultParameters() {Arguments arguments = new Arguments();arguments.addArgument("env", env);arguments.addArgument("creatorUserCode", creatorUserCode);arguments.addArgument("offset", String.valueOf(offset));arguments.addArgument("releaseTimeFrom", releaseTimeFrom);arguments.addArgument("releaseTimeTo", releaseTimeTo);arguments.addArgument("size", String.valueOf(size));arguments.addArgument("dynamicInfoCode", dynamicInfoCode);arguments.addArgument("token", token);return arguments;}/*** 执行测试,测试的逻辑写在此处** @param context 请求参数* @return 请求结果*/@Overridepublic SampleResult runTest(JavaSamplerContext context) {SampleResult sampleResult = new SampleResult();sampleResult.sampleStart();  // 开启计时HashMap<String, Object> data = new HashMap<>();HashMap<String, String> headers = new HashMap<>();try {data.put("creatorUserCode", context.getParameter("creatorUserCode")); // context.getParameter功能是获取jmeter中填写的参数data.put("dynamicInfoCode", context.getParameter("dynamicInfoCode"));data.put("offset", context.getParameter("offset"));data.put("releaseTimeFrom", context.getParameter("releaseTimeFrom"));data.put("releaseTimeTo", context.getParameter("releaseTimeTo"));data.put("size", size);headers.put("Content-Type", "application/json");headers.put("Authorization", context.getParameter("token"));HttpResponse<JsonNode> response = Unirest.post(url).headers(headers).body(data).asJson();if (response.getStatus() != 200) {sampleResult.setSuccessful(false);}sampleResult.setResponseData(response.getBody().toPrettyString(), "utf-8");sampleResult.setResponseCodeOK();System.out.println("Response data==> " + response.getBody().toPrettyString());sampleResult.setSuccessful(true);} catch (Exception e) {System.out.println("请求失败:" + e.getMessage());sampleResult.setSuccessful(false);} finally {sampleResult.sampleEnd();  // 结束计时}return sampleResult;}
}

四、Jmeter运行

1、编译打包

相关代码编写完成后,使用Idea工具自带的Maven工具进行打包

打包成功后在相关jar在target目录下,将打好的jar包放到jmeter安装目录lib/ext目录下

2、Jmeter如何使用


此时,按照正常Jmeter使用流程,点击运行按钮,即可正常进行压测

五、小结

Jmeter是用java语言开发的,所以我们可以用java开发出代码,可以直接使用,希望大家可以学习到知识。

Jmeter自定义Java请求相关推荐

  1. jmeter java性能_jmeter之自定义java请求性能测试

    写在前面 最近个人情绪不稳定.心情很不美丽,特别懒,没有博客和技术文章更新,这个文章也是迟到了一周多的时间,啰嗦完了,开始正题吧. 我们在实际做性能测试的时候,一般会采用jmeter.Lr进行测试,但 ...

  2. JMeter之Java请求

    一.JMeter中Java请求是什么? Java请求属于JMeter里的取样器,简单使用跟Beanshell差不多,都能够实现运行一定的Java代码逻辑,但Java请求功能更强大. 为什么要用Java ...

  3. jmeter测试java接口测试_简单易学的测试攻略:JMeter测试Java请求示例

    JMeter是Apache组织的开放源代码项目,它是功能和性能测试的工具,100%的用java实现,大家可以到官网下载源代码和查看相关文档. 关于使用JMeter进行JDBC数据库测试.HTTP请求接 ...

  4. jmeter重写java请求_jmeter之编写java请求-扩展Java Sampler

     分类: JMeter实践(19) 版权声明:本文为博主原创文章,未经博主允许不得转载. 新浪围脖>79642549 有以下优势 脚本易维护 易调试 开发脚本周期短 不过网上扩展java请求文章 ...

  5. jmeter发送java请求-Mysql插入操作

    代码编写粗糙,仅提供思路 一.运行效果 二.原理解释 操作环境:jmeter5.4 实现jmeter扩展需要的依赖包 jmeter\apache-jmeter-5.4\lib目录下:jorphan.j ...

  6. jmeter的java请求(socket接口)

    socket简介:网络上的两个程序通过一个双向的通讯连接实现数据的交换,这个双向链路的一端称为一个Socket.Socket通常用来实现客户方和服务方的连接.Socket是TCP/IP协议的一个十分流 ...

  7. jmeter的java请求参数设置_Jmeter中json数据参数化、断言设置

    第一步:光标定位到测试计划上,右键菜单"添加" -> Threads(users) -> 线程组,如下图 第二步: 光标定位到线程组,右键菜单选择 "添加&q ...

  8. apachejmeter_java源码_自定义编写jmeter的Java测试代码

    我们在做性能测试时,有时需要自己编写测试脚本,很多测试工具都支持自定义编写测试脚本,比如LoadRunner就有很多自定义脚本的协议,比如"C Vuser","JavaV ...

  9. jmeter之java代码性能测试_松勤软件性能测试-自定义编写的Java测试代码在Jmeter中如何使用...

    原标题:松勤软件性能测试-自定义编写的Java测试代码在Jmeter中如何使用 我们在做性能测试时,有时需要自己编写测试脚本,很多测试工具都支持自定义编写测试脚本,比如LoadRunner就有很多自定 ...

最新文章

  1. 数字图像处理7:图像增强之灰度变换
  2. WINDOWS渗透与提权总结(1)
  3. 聊一聊:拿到年终奖后马上辞职,厚道吗?
  4. 线程:等待/通知机制
  5. OpenCV中的waitkey()详解
  6. NYOJ 229 工程 二分+dp检验
  7. 使用SQLite3存储和读取数据
  8. 从hadoop-0.20.2升级到hadoop-1.0.3
  9. 技术解析+代码实战,带你入门华为云政务区块链平台
  10. Java算法之两数之加
  11. Linux学习总结(67)——shell脚本中$0 $1 $# $@ $* $? $ 等总结
  12. 多节点什么网络取得技术性突破_一对一直播源码构架的技术性要求以及一对一直播火爆的原因...
  13. React 源码剖析系列 - 不可思议的 react diff
  14. the 1st one
  15. 181117每日一句
  16. 2021 小白版,360 行行行转 IT
  17. arcmap中有火星坐标码_GIS转换之火星坐标系转换
  18. 苍蓝誓约服务器维护什么时候结束,《苍蓝誓约》12月10日09:30停服维护公告
  19. android手机电池寿命,安卓手机如何查电池使用寿命
  20. ffmpeg 视频提取音频 php-ffmpeg

热门文章

  1. 打开计算机网络自动连接,怎么让电脑一开机就自动连接到自己的wifi
  2. 我的世界服务器截图文件在哪个文件夹,迷你世界W7截图保存在哪个文件夹 | 手游网游页游攻略大全...
  3. Alitum Designer 20新建工程及汉化教程
  4. C#窗体将DGV控件中数据导入导出Excel表
  5. cpu风扇转速调节怎么调?怎么查看CPU风扇的转速?所有的CPU风扇都可以调节风扇转速吗,怎么控制?...
  6. 云服务器传文件用什么软件,免费云主机文件传输软件推荐,大文件极速秒传
  7. 记一次安卓app上线应用宝
  8. Vue报错:error Extra semicolon semi 已解决
  9. java mapper层_Java 通用Mapper的设计
  10. 操作系统的自我修养-02-玩你妹的“BIOS”