JMeter取样器中的Java请求底层实现

JMeter取样器中的Java请求底层实现,第1张

JMeter取样器中的Java请求底层实现 一、前言

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运行原理
  1. 我们使用JMeter自带的java请求demo来断点去看看它的执行实现
  2. 创建一个java request请求

  1. 我们直接在JMeter源码找到JMeterThread类对应的doSampling方法,如图打个断点,这是JMeter执行压测必经之路

没看过我之前的文章可以参考这篇:JMeter engine启动原理

  1. 随后进入到JavaSampler下的sampler方法,处理内容如下
  2. 至此,JMeter的引擎就完成了,剩下的内容都交由自定义jar即JavaTest类来实现

在这里请注意JMeter提供的java request只是一个demo,实际并没有发出请求到外界,参数都是自己定义好的,然后return回去,若要实现真正的一个java request需要参考如下实践demo写法

四、自己手动实现Java Request
  1. 首先idea新建一个module,pom.xml引入以下依赖

    org.apache.jmeter
    ApacheJMeter_java
    5.4



    apache-httpclient
    commons-httpclient
    3.1

  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();
    }
}

  1. 写完通过maven打包生成java-sampler-study-1.0-SNAPSHOT.jar

  2. 将自定义jar打入到JMeter项目 /lib/ext目录下,启动JMeter,Java Request即可看到该类,选中即可

  1. 执行请求查看结果树已获取到请求百度的响应内容了

欢迎分享,转载请注明来源:内存溢出

原文地址: https://www.outofmemory.cn/zaji/5697852.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存