JMeter作为一款主流的性能框架,可以执行主流的:http压测、jdbc压测、tcp压测、dubbo协议压测,关于它支持的压测类型都是基于取样器去实现的,本文我们着重介绍java request取样器的底层实现
二、Java Request介绍- 取样器:java request ,本质是通过用户自定义的jar打入到JMeter /lib下的一个扩展jar,表面是使用JMeter引擎来执行压测,但是压测的内容是通过你自定义jar来实现的
三、Java Request运行原理FAQ:为何执行http请求用java request来做而不用,自带的http取样器来做?
答:由于通过java request来做,灵活性更高,自己通过代码来实现一些请求的前置依赖、自己根据现有业务特定的参数化等
- 我们使用JMeter自带的java请求demo来断点去看看它的执行实现
- 创建一个java request请求
- 我们直接在JMeter源码找到JMeterThread类对应的doSampling方法,如图打个断点,这是JMeter执行压测必经之路
没看过我之前的文章可以参考这篇:JMeter engine启动原理
- 随后进入到JavaSampler下的sampler方法,处理内容如下
- 至此,JMeter的引擎就完成了,剩下的内容都交由自定义jar即JavaTest类来实现
四、自己手动实现Java Request在这里请注意JMeter提供的java request只是一个demo,实际并没有发出请求到外界,参数都是自己定义好的,然后return回去,若要实现真正的一个java request需要参考如下实践demo写法
- 首先idea新建一个module,pom.xml引入以下依赖
org.apache.jmeter ApacheJMeter_java5.4 apache-httpclient commons-httpclient3.1
- 新建一个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; public class JMeterJavaRequest extends AbstractJavaSamplerClient { @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即可看到该类,选中即可
- 执行请求查看结果树已获取到请求百度的响应内容了
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)