zoukankan      html  css  js  c++  java
  • jmeter之自定义java请求性能测试

    写在前面

    最近个人情绪不稳定、心情很不美丽,特别懒,没有博客和技术文章更新,这个文章也是迟到了一周多的时间,啰嗦完了,开始正题吧。

    我们在实际做性能测试的时候,一般会采用jmeter、Lr进行测试,但是很少有同学用jmeter的测试Java请求,也可以这么说,一般是开发自己搞的多一些。

    准备工作

    • 自己编写一个接口(我用springboot随便写了一个,需要的可以加我好友) 
    • 新建一个maven工程
    • pom文件引用ApacheJMeter_core.jar     ApacheJMeter_java.jar

    写代码前该知道的

    1、创建类的时候需要去继承AbstractJavaSamplerClient抽象类或者是实现JavaSamplerClient接口

    我在这里只继承AbstractJavaSamplerClient抽象类,需要复写的方法有:

    • public SampleResult runTest(JavaSamplerContext context) {}
    • public void setupTest(JavaSamplerContext context) {}
    • public void teardownTest(JavaSamplerContext context) {}
    • public Arguments getDefaultParameters() {}


    2、针对复写方法说明:

    • public Arguments getDefaultParameters() {}

    这个方法由Jmeter在进行添加javaRequest时第一个运行,它决定了你要在GUI中默认显示出哪些属性。

    • public void setupTest(JavaSamplerContext context) {}

    这个方法相当于loadrunner中的init,我们可以用它来进行一些初始化的动作。

    • public SampleResult runTest(JavaSamplerContext context) {}

    这个方法相当于loadrunner中的action,我们的核心测试代码就在这里了。

    • public void teardownTest(JavaSamplerContext context) {}

    这个方法相当于loadrunner中的end,收尾的工作可以由它来做。

    示例代码

    package com.jmeter.demo;
    
    import org.apache.http.HttpEntity;
    import org.apache.http.NameValuePair;
    import org.apache.http.client.ClientProtocolException;
    import org.apache.http.client.config.RequestConfig;
    import org.apache.http.client.entity.UrlEncodedFormEntity;
    import org.apache.http.client.methods.CloseableHttpResponse;
    import org.apache.http.client.methods.HttpPost;
    import org.apache.http.impl.client.CloseableHttpClient;
    import org.apache.http.impl.client.HttpClients;
    import org.apache.http.message.BasicNameValuePair;
    import org.apache.http.util.EntityUtils;
    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 org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    
    import java.io.IOException;
    import java.util.ArrayList;
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;
    
    /**
     * @author rongrong
     * jmeter之自定义java请求性能测试
     */
    public class JmeterForJavaTest extends AbstractJavaSamplerClient {
        private static final Logger log = LoggerFactory.getLogger(AbstractJavaSamplerClient.class);
        //测试结果
        private SampleResult sr;
        private static String lable = "放大招了奥!";
    
        /**
         * 初始化性能测试时,每个测试线程
         *
         * @param context
         */
        @Override
        public void setupTest(JavaSamplerContext context) {
            log.debug(getClass().getName() + ": setupTest");
        }
    
        /**
         * 主要设置传入的参数
         *
         * @return
         */
        @Override
        public Arguments getDefaultParameters() {
            Arguments arguments = new Arguments();
            arguments.addArgument("url", "http://localhost:8888/login?");
            arguments.addArgument("userName", "rongrong");
            arguments.addArgument("passWord", "123456");
            return arguments;
        }
    
    
        /**
         * 为性能测试的运行体
         *
         * @param context
         * @return
         */
        @Override
        public SampleResult runTest(JavaSamplerContext context) {
            String url = context.getParameter("url");
            String userName = context.getParameter("userName");
            String passWord = context.getParameter("passWord");
            String sbResultData = null;
            sr = new SampleResult();
            sr.setSampleLabel(lable);
            //记录测试时间及结果
            sr.sampleStart();
            //执行请求
            sbResultData = executRequest(url, userName, passWord, sbResultData);
            sr.setSuccessful(true);
            sr.setResponseCode("200");
            sr.setResponseCodeOK();
            sr.setRequestHeaders("这是个header呀,但是我就没写呀");
            sr.setResponseMessage("这块是自己瞎写的呀,测试是不是该严谨些呢");
            sr.setContentType("application/json 没想到这块我也要皮一下呢");
            //将数据打印到查看结果树当中
            sr.setResponseData(sbResultData, null);
            sr.setDataType(SampleResult.TEXT);
            return sr;
        }
    
        /**
         * 模拟接口请求
         *
         * @param url
         * @param userName
         * @param passWord
         * @param sbResultData
         * @return
         */
        private String executRequest(String url, String userName, String passWord, String sbResultData) {
            CloseableHttpClient httpClient = null;
            HttpPost httpPost = null;
            try {
                httpClient = HttpClients.createDefault();
                RequestConfig requestConfig = RequestConfig.custom().setSocketTimeout(20000).setConnectTimeout(20000).build();
                httpPost = new HttpPost(url);
                httpPost.setConfig(requestConfig);
                List<NameValuePair> ps = new ArrayList<NameValuePair>();
                Map<String, String> params = new HashMap<String, String>();
                params.put("userName", userName);
                params.put("passWord", passWord);
                for (String pKey : params.keySet()) {
                    ps.add(new BasicNameValuePair(pKey, params.get(pKey)));
                }
                httpPost.setEntity(new UrlEncodedFormEntity(ps));
                CloseableHttpResponse response = httpClient.execute(httpPost);
                HttpEntity httpEntity = response.getEntity();
                sbResultData = EntityUtils.toString(httpEntity, "utf-8");
            } catch (ClientProtocolException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                try {
                    if (httpPost != null) {
                        httpPost.releaseConnection();
                    }
                    if (httpClient != null) {
                        httpClient.close();
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            return sbResultData;
        }
    
        @Override
        public void teardownTest(JavaSamplerContext context) {
            log.debug(getClass().getName() + ": teardownTest");
        }
    
    }

    jmeter运行java代码

    • 将代码打包成jar包
    • 把打包成的jar放在apache-jmeter-5.1.1libext路径下
    • 打开jmeter,添加线程组,再添加一个java请求,如下图:

    • 添加查看结果树,运行后结果如下:

    补充事项
     如果我们的代码在运行时发生异常,就会被打印在doc窗口中

    我这里没有发生异常,所以没有数据,当发生异常时就会打印在这里。注意观察,有助于调试代码

     

    总结

    继承了AbstractJavaSamplerClient后,可以对测试结果,做很多处理,这里仅仅做了一个抛砖引玉,上面的代码只是模拟了HTTP请求,实际意义不大。
    但是当我们需要进行一段代码的性能测试的时候,可以通过这样的形式来进行书写,并且在runTest方法中进行调用后,那么就可以测试出这段代码的性能如何了。
     
    参考文章:https://www.cnblogs.com/lingfengblogs/p/4269587.html
     
    附接口服务启动图:
  • 相关阅读:
    九度oj 题目1371:最小的K个数
    九度oj 题目1131:合唱队形
    九度oj 题目1450:产生冠军
    九度oj 题目1135:字符串排序
    九度oj 题目1534:数组中第K小的数字
    九度oj 题目1179:阶乘
    九度oj 题目1369:字符串的排列
    九度oj 题目1100:最短路径
    [Luogu] 子串
    [Luogu] 魔法树
  • 原文地址:https://www.cnblogs.com/longronglang/p/11111035.html
Copyright © 2011-2022 走看看