博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
性能测试工具 java ur_jmeter之自定义java请求性能测试
阅读量:5109 次
发布时间:2019-06-13

本文共 5102 字,大约阅读时间需要 17 分钟。

写在前面

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

我们在实际做性能测试的时候,一般会采用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,收尾的工作可以由它来做。

示例代码

packagecom.jmeter.demo;importorg.apache.http.HttpEntity;importorg.apache.http.NameValuePair;importorg.apache.http.client.ClientProtocolException;importorg.apache.http.client.config.RequestConfig;importorg.apache.http.client.entity.UrlEncodedFormEntity;importorg.apache.http.client.methods.CloseableHttpResponse;importorg.apache.http.client.methods.HttpPost;importorg.apache.http.impl.client.CloseableHttpClient;importorg.apache.http.impl.client.HttpClients;importorg.apache.http.message.BasicNameValuePair;importorg.apache.http.util.EntityUtils;importorg.apache.jmeter.config.Arguments;importorg.apache.jmeter.protocol.java.sampler.AbstractJavaSamplerClient;importorg.apache.jmeter.protocol.java.sampler.JavaSamplerContext;importorg.apache.jmeter.samplers.SampleResult;importorg.slf4j.Logger;importorg.slf4j.LoggerFactory;importjava.io.IOException;importjava.util.ArrayList;importjava.util.HashMap;importjava.util.List;importjava.util.Map;/***@authorrongrong

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

public class JmeterForJavaTest extendsAbstractJavaSamplerClient {private static final Logger log = LoggerFactory.getLogger(AbstractJavaSamplerClient.class);//测试结果

privateSampleResult sr;private static String lable = "放大招了奥!";/*** 初始化性能测试时,每个测试线程

*

*@paramcontext*/@Overridepublic voidsetupTest(JavaSamplerContext context) {

log.debug(getClass().getName()+ ": setupTest");

}/*** 主要设置传入的参数

*

*@return

*/@OverridepublicArguments getDefaultParameters() {

Arguments arguments= newArguments();

arguments.addArgument("url", "http://localhost:8888/login?");

arguments.addArgument("userName", "rongrong");

arguments.addArgument("passWord", "123456");returnarguments;

}/*** 为性能测试的运行体

*

*@paramcontext

*@return

*/@OverridepublicSampleResult runTest(JavaSamplerContext context) {

String url= context.getParameter("url");

String userName= context.getParameter("userName");

String passWord= context.getParameter("passWord");

String sbResultData= null;

sr= newSampleResult();

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);returnsr;

}/*** 模拟接口请求

*

*@paramurl

*@paramuserName

*@parampassWord

*@paramsbResultData

*@return

*/

privateString 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= newHttpPost(url);

httpPost.setConfig(requestConfig);

List ps = new ArrayList();

Map params = new HashMap();

params.put("userName", userName);

params.put("passWord", passWord);for(String pKey : params.keySet()) {

ps.add(newBasicNameValuePair(pKey, params.get(pKey)));

}

httpPost.setEntity(newUrlEncodedFormEntity(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();

}

}returnsbResultData;

}

@Overridepublic voidteardownTest(JavaSamplerContext context) {

log.debug(getClass().getName()+ ": teardownTest");

}

}

jmeter运行java代码

将代码打包成jar包

把打包成的jar放在\apache-jmeter-5.1.1\lib\ext路径下

打开jmeter,添加线程组,再添加一个java请求,如下图:

3af968e28bad05eaf652415279734262.png

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

49ad52751ed606fb1b76caa3251497e5.png

91f78276523a72631ba6a3858c8ab805.png

af6c883156dfdb3a9468b1c591141e61.png

补充事项

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

d0c54375b5fdfb9eaf451171d116b3e1.png

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

总结

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

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

参考文章:https://www.cnblogs.com/lingfengblogs/p/4269587.html

附接口服务启动图:

eb084ae367ae626a1cc9418240962c38.png

你可能感兴趣的文章
免费的论文查重网站
查看>>
C语言程序第一次作业
查看>>
leetcode-Sort List
查看>>
常用的Javascript设计模式
查看>>
静态库
查看>>
关于hibernate查询结果类的封装
查看>>
突然感到人生很绝望_
查看>>
IIS7:通过脚本来配置ftp站点
查看>>
淘宝用户杭州30个小区分布,根据默认收货地址统计用户id
查看>>
一行代码解决各种IE兼容问题,IE6,IE7,IE8,IE9,IE10
查看>>
北京信息科技大学第十一届程序设计竞赛(重现赛)I
查看>>
【转载】Android 的 Handler 机制实现原理分析
查看>>
scanf函数
查看>>
HTML5——新表单元素 表单属性 语义元素
查看>>
CSS3—— 分页 框大小 弹性盒子 多媒体查询 多媒体查询实例
查看>>
使用反射获取Android中隐藏的方法
查看>>
【原创】Leetcode -- Reverse Linked List II -- 代码随笔(备忘)
查看>>
人脸识别技术开发人证比对访客系统
查看>>
Android之人脸识别
查看>>
HDU 5340——Three Palindromes——————【manacher处理回文串】
查看>>