代码改变世界

Jmeter JAVA请求

2018-08-23 18:33  鸣仁  阅读(422)  评论(0编辑  收藏  举报

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();
}
复制代码