一、前言
JMeter作为一款主流的性能框架,可以执行主流的:http压测、jdbc压测、tcp压测、dubbo协议压测,关于它支持的压测类型都是基于取样器去实现的,本文我们着重介绍java request
取样器的底层实现
二、Java Request介绍
- 取样器:java request ,本质是通过用户自定义的jar打入到JMeter /lib下的一个扩展jar,表面是使用JMeter引擎来执行压测,但是压测的内容是通过你自定义jar来实现的
FAQ:为何执行http请求用java request来做而不用,自带的http取样器来做?
答:由于通过java request来做,灵活性更高,自己通过代码来实现一些请求的前置依赖、自己根据现有业务特定的参数化等
三、Java Request运行原理
- 我们使用JMeter自带的java请求demo来断点去看看它的执行实现
- 创建一个java request请求
- 我们直接在JMeter源码找到
JMeterThread
类对应的doSampling
方法,如图打个断点,这是JMeter执行压测必经之路
没看过我之前的文章可以参考这篇:JMeter engine启动原理
- 随后进入到
JavaSampler
下的sampler
方法,处理内容如下
- 至此,JMeter的引擎就完成了,剩下的内容都交由自定义jar即
JavaTest
类来实现
在这里请注意JMeter提供的java request只是一个demo,实际并没有发出请求到外界,参数都是自己定义好的,然后return回去,若要实现真正的一个java request需要参考如下实践demo写法
四、自己手动实现Java Request
- 首先idea新建一个module,pom.xml引入以下依赖
<!-- JMeter依赖jar -->
<dependency>
<groupId>org.apache.jmeter</groupId>
<artifactId>ApacheJMeter_java</artifactId>
<version>5.4</version>
</dependency>
<!-- http请求jar -->
<dependency>
<groupId>apache-httpclient</groupId>
<artifactId>commons-httpclient</artifactId>
<version>3.1</version>
</dependency>
- 新建一个class类
JMeterJavaRequest
,本demo仅供思路参考
import org.apache.commons.httpclient.Header;
import org.apache.commons.httpclient.HostConfiguration;
import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.methods.GetMethod;
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.IOException;
/**
* 通过继承AbstractJavaSamplerClient类来实现自定义jar实现的内容
* @description: jmeter java请求
**/
public class JMeterJavaRequest extends AbstractJavaSamplerClient {
/**
*
* @param javaSamplerContext jmeter上下文内容,请求参数等
* @return
*/
@Override
public SampleResult runTest(JavaSamplerContext javaSamplerContext) {
long beginTime = System.currentTimeMillis();
//sampleResult为JMeter需要接受的结果内容
SampleResult sampleResult = new SampleResult();
//定义一个http客户端对象
HttpClient httpClient = new HttpClient();
HostConfiguration hostConfiguration = new HostConfiguration();
GetMethod getMethod = new GetMethod();
getMethod.setRequestHeader("java","custom-java-test");
hostConfiguration.setHost("www.baidu.com");
try {
//执行请求并获取状态吗
int status = httpClient.executeMethod(hostConfiguration, getMethod);
String responseBodyAsString = getMethod.getResponseBodyAsString();
long responseContentLength = getMethod.getResponseContentLength();
Header[] responseHeaders = getMethod.getResponseHeaders();
for (Header header:responseHeaders){
String name = header.getName();
String value = header.getValue();
sampleResult.setResponseHeaders(name);
sampleResult.setResponseHeaders(value);
}
Header[] requestHeaders = getMethod.getRequestHeaders();
for (Header header:requestHeaders){
String name = header.getName();
String value = header.getValue();
sampleResult.setRequestHeaders(name);
sampleResult.setRequestHeaders(value);
}
sampleResult.setResponseCodeOK();
sampleResult.setResponseCode(String.valueOf(status));
sampleResult.setAllThreads(10);
sampleResult.setBytes(21312L);
long endTime = System.currentTimeMillis();
sampleResult.setConnectTime(endTime -beginTime);
sampleResult.setEndTime(endTime);
sampleResult.setTimeStamp(beginTime);
sampleResult.setBodySize(responseContentLength);
sampleResult.setResponseMessage(responseBodyAsString);
sampleResult.setSuccessful(true);
return sampleResult;
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
@Override
public void teardownTest(JavaSamplerContext context) {
super.teardownTest(context);
}
@Override
public Arguments getDefaultParameters() {
return super.getDefaultParameters();
}
}
-
写完通过maven打包生成
java-sampler-study-1.0-SNAPSHOT.jar
-
将自定义jar打入到JMeter项目
/lib/ext
目录下,启动JMeter,Java Request即可看到该类,选中即可
- 执行请求查看结果树已获取到请求百度的响应内容了