一、需求背景

在日常压测过程中,有些请求逻辑比较复杂的时候,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. eDrawings Pro 2020中文版
  2. Android6.0 keyguard锁屏加载流程分析
  3. gateway sentinel 熔断 不起作用_Sentinel 的一些概念与核心类介绍
  4. zookeeper命令行操作
  5. mysql5.6 二进制免编译安装
  6. python判断语句 if elif else(一分钟读懂)
  7. 车位编号lisp_cad自动编号插件
  8. php日程提醒,PHPOA日程安排系统,建立井然有序的工作计划
  9. C++求解一元三次方程的实根
  10. 唯美的英文短文!!!
  11. MyBatis14 缓存
  12. [UE4][Blueprint]虚幻4实现照相机拍照功能
  13. 解决Apple Watch 更新时出现红色感叹号「!」的问题
  14. goahead(嵌入式) webservice (3.3.0)运行goforms
  15. CSAPP datalab实验
  16. 矩阵的特征:主成分分析(PCA)
  17. 电话聊天狂人(java)
  18. Description Resource Path Location Type Call requires API level 5 (解决方法)
  19. 阿里云RDSDRDS初探
  20. NTFS、FAT32、exFAT这三种格式的区别

热门文章

  1. 牛仔裤是如何传到中国的,有着怎样的背后故事?
  2. 高压电源模块12V升110V/150V/250V/350V稳压直流电源
  3. Fedora35双系统的详细安装教程
  4. linux 节省资源 版本,哪个版本的Linux占用资源少些
  5. What is a nuclear reactor?(核反应堆是什么)
  6. 分巧克力 c/c++
  7. 视音频编解码基本术语及解释MediaInfo
  8. 项目七 网络打印的配置与管理
  9. IEEE ACCESS账户与ORCID账户关联
  10. Git分布式版本工具的部署与使用