jmeter之自定義java請求性能測試


寫在前面

最近個人情緒不穩定、心情很不美麗,特別懶,沒有博客和技術文章更新,這個文章也是遲到了一周多的時間,啰嗦完了,開始正題吧。

我們在實際做性能測試的時候,一般會采用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
 
附接口服務啟動圖:

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM