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