一、需求背景
在日常压测过程中,有些请求逻辑比较复杂的时候,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():测试结束方法,用于结束性能测试中的每个线程。
2、Demo实例
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/dynamic-info/released/page-query"; private static final String token = null; // 该部分代码主要设置Unirest连接池配置 static { Unirest.config().concurrency(1000, 100); } // 该部分代码主要是用于设置参数显示,此处设置的参数可以在jmeter中展示 @Override public 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 请求结果 */ @Override public 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开发出代码,可以直接使用,希望大家可以学习到知识。
原文地址:https://www.cnblogs.com/yang-weimin/p/15785429.html
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。