专栏首页测试人生jmeter之自定义java请求性能测试

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

写在前面

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

我们在实际做性能测试的时候,一般会采用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

本文分享自微信公众号 - 软件测试君(backlight2018),作者:糖小幽

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-07-01

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • spring事物中的传播及隔离

    1、使用 propagation 指定事务的传播行为, 即当前的事务方法被另外一个事务方法调用时。如何使用事务, 默认取值为 REQUIRED, 即使用调用方法...

    软件测试君
  • Selenium中Page Object设计模式

    Page Object(页面对象)模式,是Selenium实战中最为流行,并且被做自动化测试同学所熟悉和推崇的一种设计模式之一。在设计测试时,把页面元素定位和元...

    软件测试君
  • SpringBoot 动态修改定时任务频率

    调试情况如下: 1.调用start 2.调用change,并传入0/3 * * * * * 3.调用stop

    软件测试君
  • 这篇带你深入理解SpringBoot中的自动装配(好文精读)

    SpringBoot的自动装配是拆箱即用的基础,也是微服务化的前提。其实它并不那么神秘,我在这之前已经写过最基本的实现了,大家可以参考这篇文章。这次主要的议题是...

    Java团长
  • 我也能写数据库 —— Streaming(下)

    在上一篇文章中介绍了,如何在select语句中使用stream关键字,进行流查询,并且模拟了简单数据结构,有兴趣的同学可以移步去看看( streaming上篇)...

    麒思妙想
  • Java数据解析---JSON

    听着music睡
  • 算法集锦(14)|图像识别| 图像识别算法的罗夏测试

    随着对基于深度学习的图像识别算法的大量研究与应用,我们倾向于将各种各样的算法组合起来快速进行图片识别和标注。优化后的算法在内存的使用和模型训练上表现越来越好,但...

    用户7623498
  • 如何使用SpringMvc处理Rest异常

    若你的项目中已经在使用spring,然后你又需要提供rest接口,那么springmvc是一个不错的选择。

    Java知音
  • 2 手写实现SpringMVC,第二节:自定义注解及反射赋值

    可以发现,这里面使用了大量的自定义注解,并且还有autuwire的属性也需要被赋值(Spring的IOC功能)。

    天涯泪小武
  • python 用注册表获取无线网络的信息

    def va12addr(val): addr="" for ch in val: addr += ("%02x " %ord(ch)) addr = ...

    用户5760343

扫码关注云+社区

领取腾讯云代金券