一、需求背景
在日常压测过程中,有些请求逻辑比较复杂的时候,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开发出代码,可以直接使用,希望大家可以学习到知识。