寫在前面
最近個人情緒不穩定、心情很不美麗,特別懶,沒有博客和技術文章更新,這個文章也是遲到了一周多的時間,啰嗦完了,開始正題吧。
我們在實際做性能測試的時候,一般會采用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.1\lib\ext路徑下
- 打開jmeter,添加線程組,再添加一個java請求,如下圖:
- 添加查看結果樹,運行后結果如下:
補充事項
如果我們的代碼在運行時發生異常,就會被打印在doc窗口中

我這里沒有發生異常,所以沒有數據,當發生異常時就會打印在這里。注意觀察,有助於調試代碼
總結
繼承了AbstractJavaSamplerClient后,可以對測試結果,做很多處理,這里僅僅做了一個拋磚引玉,上面的代碼只是模擬了HTTP請求,實際意義不大。
但是當我們需要進行一段代碼的性能測試的時候,可以通過這樣的形式來進行書寫,並且在runTest方法中進行調用后,那么就可以測試出這段代碼的性能如何了。
參考文章:https://www.cnblogs.com/lingfengblogs/p/4269587.html
附接口服務啟動圖:
