首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >jmeter之自定义java请求性能测试

jmeter之自定义java请求性能测试

作者头像
软件测试君
发布2019-07-10 17:40:08
1.8K0
发布2019-07-10 17:40:08
举报
文章被收录于专栏:测试人生测试人生

写在前面

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

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

准备工作

  • 自己编写一个接口(我用springboot随便写了一个,公号内回复接口服务demo即可)
  • 新建一个maven工程
  • pom文件引用ApacheJMeter_core.ja、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、针对复写方法说明:

//这个方法由Jmeter在进行添加javaRequest时第一个运行,它决定了你要在GUI中默认显示出哪些属性。
public Arguments getDefaultParameters() {}
//这个方法相当于loadrunner中的init,我们可以用它来进行一些初始化的动作。
public void setupTest(JavaSamplerContext context) {}
//这个方法相当于loadrunner中的action,我们的核心测试代码就在这里了。
public SampleResult runTest(JavaSamplerContext context) {}
//这个方法相当于loadrunner中的end,收尾的工作可以由它来做。
public void teardownTest(JavaSamplerContext context) {}

示例代码

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.1\lib\ext路径下
  • 打开jmeter,添加线程组,再添加一个java请求,如下图:
  • 添加查看结果树,运行后结果如下:

补充事项

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

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

总结

继承了AbstractJavaSamplerClient后,可以对测试结果,做很多处理,这里仅仅做了一个抛砖引玉,上面的代码只是模拟了HTTP请求,实际意义不大。

但是当我们需要进行一段代码的性能测试的时候,可以通过这样的形式来进行书写,并且在runTest方法中进行调用后,那么就可以测试出这段代码的性能如何了。

参考文章

https://www.cnblogs.com/lingfengblogs/p/4269587.html

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-07-01,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 软件测试君 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档