JMeter進階—詳解Java sampler的設計方法(附源碼)
JMeter Java Sampler介紹
我們通常使用jmeter做http或者https請求的測試,但是有些場景我們需要直接調用Java接口進行性能測試, jmeter通過Java請求可以實現該需求(這樣就可以處理一些公司自定義的協議了,開發提供協議接口,然后我們通過java sampler進行調用)。本文將會詳細介紹jmeter中如何編寫 java請求并對其進行調用!
添加Java請求

Java請求如下:

其中上圖里com.my.demo.JmeterDemo2,即我們需要調用的Java類;str是我們需要傳入的參數。那么Jmeter中如何實現對java請求的調用呢?我會在本文詳細講解!
設計Java請求思路與代碼解析
如何編寫jmeter java請求,簡單地說分如下幾點:
1寫一個類,叫做Demo,使其繼承AbstractJavaSamplerClient;
2.在public SampleResult runTest(JavaSamplerContext arg0)方法里,寫處理java代碼的邏輯;
3.在public Arguments getDefaultParameters()方法里定義從jmeter中傳入java代碼的參數;
4.把類Demo 打成jar包并放入jmeter的\lib\ext 目錄下(如果Demo需要依賴其它jar包需要一起放入\lib\ext目錄下)
實例代碼如下:
- import org.apache.commons.lang3.StringUtils;
- 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;
- public class JmeterDemo2 extends AbstractJavaSamplerClient
- {
- private SampleResult sr;
- public Arguments getDefaultParameters() {
- Argumentsparams = new Arguments();
- params.addArgument("str", "");
- return params;
- }
- public SampleResult runTest(JavaSamplerContext arg0) {
- this.sr.setSampleLabel("commonsio-demo2");
- try {
- Stringstr=arg0.getParameter("para");
- //使用jar包中StringUtils類的countMatches方法來統計字符串a的個數
- int num=StringUtils.countMatches(str, "a");
- if (num==0) {
- this.sr.setResponseMessage("ResponseMessage:參數匹配0個"); //Sample Result 中的Response message
- this.sr.setResponseData("ResponseData:參數匹配0個","UTF-8"); //Response Data的值,會被后面的覆蓋
- this.sr.setSuccessful(true);//Sample Result 中的結果
- }else {
- this.sr.setResponseMessage("ResponseMessage:參數匹配"+num+"個");
- this.sr.setResponseData("ResponseData:參數匹配"+num+"個","UTF-8");
- this.sr.setSuccessful(false);
- }
- }catch (Exception e) {
- this.sr.setResponseMessage(e.getMessage().toString());
- this.sr.setSuccessful(false);
- }finally {
- //this.sr.setResponseData("結束測試", "UTF-8");
- super.getNewLogger().info("####測試執行####");
- try {
- Thread.sleep(500);
- }catch (InterruptedException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- }
- return this.sr;
- }
- public void setupTest(JavaSamplerContext context) {
- super.setupTest(context);
- super.getNewLogger().info("####測試開始####");
- this.sr = new SampleResult();
- this.sr.sampleStart();
- }
- public void teardownTest(JavaSamplerContext context) {
- super.teardownTest(context);
- this.sr.sampleEnd();
- super.getNewLogger().info("####測試結束####");
- }
- }
這里對上述代碼做詳細分析:
主要用到的方法如下:

方法執行的先后順序為:
getDefaultParameters() -->
setupTest(JavaSamplerContext context)-->
runTest(JavaSamplerContext context) -->
teardownTest(JavaSamplerContext context)
代碼運行后,打開日志結果如下,參數para 對應代碼String str=arg0.getParameter("para");

從日志中可以看到
setupTest(JavaSamplerContext context) 中的代碼被執行1次,打印
####測試開始####
teardownTest(JavaSamplerContext context) 中的代碼被執行1次,打印
####測試結束####
而runTest中的方法super.getNewLogger().info("####測試執行####"); 被執行5次,因為在線程組中,設置執行5次。(線程組線程執行的次數,影響java請求中的runTest,而不會影響setupTest和teardownTest)。方法super.getNewLogger().info("")會把值寫入日志。
setResponseMessage("ResponseMessage:參數匹配0個");打印到Sample Result 中的Response message里;setSampleLabel("commonsio-demo2");設置java請求的顯示名稱,如下圖:

setResponseData("ResponseData:參數匹配0個","UTF-8"); 打印到Response Data,如下圖:

最后,方法setSuccessful(true)會影響測試結果
在IDE中開發Jmeter Java 請求
在IDE中開發Jmeter Java 請求與普通java開發一致,引入需要的java包以及jmeter相關jar包即可,引入Jmeter lib\ext下的ApacheJMeter_core.jar和ApacheJMeter_java.jar到IDE中!