Jmeter Java请求

摘要:
1、 为什么我们使用Java来请求现有的post和get不能测试加密、解密和身份验证接口。我们需要封装它们,然后请求它们。我们如何封装它们?

一、为什么要使用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、需要实现四个方法,分别是:

Jmeter Java请求第1张

三、直接上具体代码

说明:以下代码已脱敏处理,直接复制是跑不通的,主要是领悟其用法

  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.0libext文件夹里面,Java项目lib的依赖包在打成.jar 时生成,所以不用单独处理

导出

Jmeter Java请求第2张

五、创建Jmeter java 请求

Jmeter Java请求第3张

六、查看响应结果

 Jmeter Java请求第4张

综上按照以上写个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();
}

免责声明:文章转载自《Jmeter Java请求》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Java获取精确到秒的时间戳git 生成公钥、私钥方法与clone使用方法下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

5.移动渗透测试工具之drozer

本篇博文主要来介绍drozer在移动渗透中的作用 本次实验环境所用工具为:夜神模拟器,drozer-2.3.4,sieve.apk,adb drozer安装这里不再多嘴,给出链接:https://www.cnblogs.com/JDragons/p/5596258.html adb作为移动与pc的调试桥,我这里也已经安装完成。 1.安装agent.apk...

为 Windows Phone 8.1 app 解决“The type does not support direct content.”的问题

我在 VS 14 CTP 中新建了一个空的 app store 项目名叫 PlayWithXaml ,项目的 MainPage.xaml 文件改为了以下内容: <Page x:Class="PlayWithXaml.MainPage"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/pre...

CKEditor&ckfindtor

前言 之前的项目中一直使用的是FCKeditor,昨天突然有个想法:为什么不试一下新的CKEditor呢?于是花了大半天的时间去学习它的使用方法,如今把我的学习过程与大家分享一下。 谈起FCKeditor,相信没几个Web程序猿不知道的吧。只是,官方已经停止了该产品的更新,其最新版是2.6.6,于2010年2月15日公布。 代替FCKedi...

CSS content内容生成技术以及应用

一、简介 content属性早在 CSS2.1的时候就被引入了,可以使用:before以及:after伪元素生成内容。此特性目前已被大部分的浏览器支持:(Firefox 1.5+, Safari 3.5+, IE 8+, Opera 9.2+, Chrome 0.2+)。另外,目前Opera 9.5+ 和 Safari 4已经支持所有元素的content...

Meta标签详解

Meta标签详解,希望对大家有用 您的个人网站即使做得再精彩,在“浩瀚如海”的网络空间中,也如一叶扁舟不易为人发现,如何推广个人网站,人们首先想到的方法无外乎以下几种:● 在搜索引擎中登录自己的个人网站● 在知名网站加入你个人网站的链接 ● 在论坛中发帖子宣传你的个人网站 很多人却忽视了HTML标签META的强大功效,一个好的META标签设计可以大大提...

我与Python惺惺相惜

while循环 死循环,会一直一直的重复循环.True的首字母要大写. while True: print("我与世界格格不入,我只与你惺惺相惜") count = 1 while count <=5: print("我与世界各格格不入,我只与你惺惺相惜") count = count + 1 解析: cou...