一、為什么要使用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();
}