本文共 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请求,如下图:
添加查看结果树,运行后结果如下:
补充事项
如果我们的代码在运行时发生异常,就会被打印在doc窗口中
我这里没有发生异常,所以没有数据,当发生异常时就会打印在这里。注意观察,有助于调试代码
总结
继承了AbstractJavaSamplerClient后,可以对测试结果,做很多处理,这里仅仅做了一个抛砖引玉,上面的代码只是模拟了HTTP请求,实际意义不大。
但是当我们需要进行一段代码的性能测试的时候,可以通过这样的形式来进行书写,并且在runTest方法中进行调用后,那么就可以测试出这段代码的性能如何了。
参考文章:https://www.cnblogs.com/lingfengblogs/p/4269587.html
附接口服务启动图: