Jmeter Java請求


一、為什么要使用Java請求

現有的post 、 get 無法對加解密及鑒權的接口進行測試,需要進行封裝,然后再請求,怎么進行封裝?通常使用的方式是使用httpclient 工具類型來操作,下面舉一個簡單的Java自定義測試代碼例子,使用Java編譯器編寫測試代碼

二、完成以下幾部曲即可

1、打開IDE(這里我使用的是 eclipse Luna 4.3),創建一個Java工程項目名為enterprise

2、從Jmeter的安裝目錄lib/ext中拷貝兩個文件ApacheJMeter_core.jar(必須)和ApacheJMeter_java.jar(必須)到enterprise項目中,然后引入這兩個JAR包;如果需要在eclipse中調試還需要拷貝以下三個工具包可選avalon-framework-4.1.4.jar(jmeter3.2中名稱是framework)、jorphan.jar、logkit-2.0.jar。

3、創建一個測試類CipherTypeRSA 繼承AbstractJavaSamplerClient存在於ApacheJMeter_java.jar這個JAR包中或實現JavaSamplerClient 接口,兩種方式其中一種引用即可調用

4、需要實現四個方法,分別是:

 

三、直接上具體代碼

說明:以下代碼已脫敏處理,直接復制是跑不通的,主要是領悟其用法

  1 package com.hcb.enterprise;
  2 import java.util.HashMap;
  3 import java.util.Iterator;
  4 import java.util.Map;
  5 import org.apache.jmeter.config.Arguments;
  6 import org.apache.jmeter.protocol.java.sampler.AbstractJavaSamplerClient;
  7 import org.apache.jmeter.protocol.java.sampler.JavaSamplerContext;
  8 import org.apache.jmeter.samplers.SampleResult;
  9 import org.wlqq.codec.enums.CipherType;
 10 import org.wlqq.codec.exception.CodecHttpException;
 11 import org.wlqq.codec.http.client.CodecHttpTemplate;
 12 import org.wlqq.codec.http.client.HttpTemplateBuilder;
 13 
 14 public class CipherTypeRSA extends AbstractJavaSamplerClient  {  
 15     private String label;
 16     private String resultData;  
 17     private String url;
 18     private String host;
 19     private String uri;
 20     private String appId;
 21     private String privateKey;
 22     Map<String, String> map = new HashMap<>();
 23     private static final CodecHttpTemplate CODEC_HTTP_TEMPLATE = HttpTemplateBuilder.create().build();
 24 
 25     public Arguments getDefaultParameters() {  
 26         Arguments params = new Arguments(); 
 27         params.addArgument("label","exec name");
 28         params.addArgument("appId", "open-enterprise");  
 29         params.addArgument("privateKey", "MIICdQIBADANBgkqhkiG9w0BAQEFAASCAl8wggJbAgEAAoGBAJPq9N65uR+bHxtUKFv4YgSV5Voa6jLKGhYwPGqAItthp");  
 30         params.addArgument("host","http://enterprise-api.dev-ag.56qq.com");
 31         params.addArgument("uri","/server/servicetask/list");
 32         params.addArgument("content","");
 33         return params;  
 34     }  
 35     
 36   //每個線程測試前執行一次,做一些初始化工作;  
 37     public void setupTest(JavaSamplerContext arg0) {  
 38         Iterator<String> it =arg0.getParameterNamesIterator();
 39         while(it.hasNext()){
 40             String key=it.next();
 41             String value = arg0.getParameter(key);
 42             if("host".equals(key)){
 43                 host = arg0.getParameter(key);
 44             }else if("label".equals(key)){
 45                 label = arg0.getParameter(key);
 46             }else if("uri".equals(key)){
 47                 uri = arg0.getParameter(key);
 48             }else if("appId".equals(key)){
 49                 appId = arg0.getParameter(key);
 50             }else if("privateKey".equals(key)){
 51                 privateKey = arg0.getParameter(key);
 52             }else if("content".equals(key)){
 53                 getContent(arg0.getParameter(key));
 54             }else{
 55                 map.put(key, value);
 56             }
 57             url = host + uri;
 58         }
 59     }  
 60       
 61     public SampleResult runTest(JavaSamplerContext arg0) {         
 62         SampleResult sr = new SampleResult();  
 63         try {  
 64             sr.setSampleLabel(label);
 65             sr.sampleStart();// jmeter 開始統計響應時間標記  
 66             resultData = doPostSign(url, map, appId, privateKey, CipherType.RSA);
 67             if (resultData != null && resultData.length() > 0) {  
 68                 sr.setResponseData(resultData, null);  //將結果輸出到結果樹當中
 69                 sr.setDataType(SampleResult.TEXT);    //請求頭中會多個類型輸出 Data type ("text"|"bin"|""): text
 70             }  
 71             //System.out.println(resultData);  //會輸出到控制台,使用Jmeter 會輸出到控制台或日志里面
 72             sr.setSuccessful(true);  
 73         } catch (Throwable e) {  
 74             sr.setSuccessful(false);  
 75             sr.setResponseData("Check the input parameters is correct !",null);  
 76             e.printStackTrace();
 77         } finally {  
 78             sr.sampleEnd(); //Jmeter 結束統計響應時間標記  
 79         }  
 80         return sr;  
 81     }  
 82   
 83     public void teardownTest(JavaSamplerContext arg0) {  
 84        
 85     }  
 86 /**
 87     public static void main(String[] args) {  
 88         Arguments params = new Arguments();  
 89         params.addArgument("appId", "open-enterprise");  
 90         params.addArgument("privateKey", "MIICdQIBADANBgkqhkiG9w0BAQEFAASCAl8wggJbAgEAAoGBAJPq9N65uR+bHxtUKFv4YgSV5Voa6jLKGhYwPGqAItthp");  
 91         params.addArgument("host","http://enterprise-api.dev-ag.com");
 92         params.addArgument("uri","/server/company/get-company-by-name");
 93         params.addArgument("content", "fullName=XX科技有限公司");
 94         JavaSamplerContext arg0 = new JavaSamplerContext(params);  
 95         CipherTypeRSA test = new CipherTypeRSA();  
 96         test.setupTest(arg0);  
 97         test.runTest(arg0); 
 98         test.teardownTest(arg0);
 99     }  */
100     
101     private  String doPostSign(String url, Map<String, String> params, String appId, String privateKey,
102             CipherType cipherType) throws CodecHttpException {
103         if (params != null) {
104             params.put("__APPID__", appId);
105         }
106         String result = CODEC_HTTP_TEMPLATE.doPostSign(url, params, appId, privateKey, cipherType);
107         return result;
108     }
109     
110     // 拼接的字符串轉換成鍵值對存進map 集合中 content = "a=123&b=&c=234";
111     private  void getContent(String content){
112         if(!content.isEmpty()&&!content.startsWith("&")){
113             String[] list = content.split("&");
114             for(String s:list){
115                 Boolean es = s.endsWith("=");
116                 if(es){
117                     map.put(s.substring(0,s.length()-1),"");
118                 }else{
119                     String[] mapList = s.split("=");
120                     map.put(mapList[0],mapList[1]);
121                 }
122             }
123         }
124     }
125 }  

 

四、 把Java項目導出成.jar,並放於apache-jmeter-3.0\lib\ext文件夾里面,Java項目lib的依賴包在打成.jar 時生成,所以不用單獨處理

導出

五、創建Jmeter java 請求

六、查看響應結果

 

綜上按照以上寫個Java請求是沒有什么問題的,也沒有什么難度,關鍵的需要准備一個工具類(Java請求加解密、鑒權等的工具類)

 

補充:封裝完成的結果函數

private void setSampleResultFailed(SampleResult sr, int status, String result) {
sr.setSuccessful(false);
sr.setResponseCode(String.valueOf(status));
sr.setResponseData(result, "UTF-8"); //把響應結果返回到jmeter中
sr.setResponseOK();
}

private void setSampleResultSuccess(SampleResult sr, int status, String result) {
sr.setSuccessful(true);
sr.setResponseCode(String.valueOf(status));
sr.setResponseData(result, "UTF-8");
sr.setResponseOK();
}

 


免責聲明!

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



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