JMeter接口测试-HTTPS验证登录
这里用一个实际例子(以https方式登录服务器,并通过接口修改数据)来演示JMeter测试工具的使用操作过程。
一.JMeter中使用Beanshell来引用第三方jar包
网上查了才知道,现在版本的JMeter已经没有_MD5加密函数了,需要自己导入md5.jar包,进行加密操作。
于是开启了我的寻包过程:Java 对字符串进行加密并生成MD5值
1.从网上copy一份MD5加密方法,当然一些细节地方需要自己修改,比如要加密的具体内容(我的是ChallengeString:GDS3710IZpRsFzCbM:admin),然后从eclipse中导出md5.jar包
package com.cjh.md5;
import java.security.MessageDigest; import java.util.Scanner; /* * message-digest algorithm 5(信息摘要算法) * md5的长度默认是128bit * 128/4=32,换成16进制表示后为32位了 * */ public class MD5Util { //测试方法 /*public static void main(String[] arg) { Scanner scan=new Scanner(System.in); String ChallengeString,pwd1; System.out.println("请输入ChallengeString"); ChallengeString=scan.next(); pwd1 = ":GDS3710lZpRsFzCbM:admin"; System.out.println("加密前: "+ChallengeString+pwd1); System.out.println("加密后: "+MD5Util.getMD5(ChallengeString+pwd1)); } */ /*生成md5 * */ public static String getMD5(String message) { String md5str=""; String pwd=":GDS3710lZpRsFzCbM:admin"; String pwd2=message+pwd; try { //1.创建一个提供信息摘要算法的对象,初始化为md5算法对象 MessageDigest md=MessageDigest.getInstance("MD5"); //2.将消息变成byte数组 byte[] input=pwd2.getBytes(); //3.计算后获得字节数组,得到的是128位的字符串 byte[] buff=md.digest(input); //4.把数组每一字节(一个字节占8位)转换成16进制的字符串 md5str=bytesToHex(buff); } catch (Exception e) { e.printStackTrace(); } return md5str; } /* * 二进制转换十六进制 * * / */ public static String bytesToHex(byte[] bytes) { StringBuffer md5str=new StringBuffer(); //把数组每一字节转换成16进制连城md5字符串 int digital; for (int i = 0; i < bytes.length; i++) { digital=bytes[i]; if(digital<0){ digital+=256; } if (digital<16) { md5str.append("0"); } md5str.append(Integer.toHexString(digital)); } return md5str.toString().toLowerCase(); } }
2.导出jar包
3.将导出的jar包放到JMeter安装目录下的lib文件夹下
4.打开JMeter,新建测试计划,添加线程组,新建BeanShell Sampler,并写入以下测试内容
//导入jar包 import com.cjh.md5.MD5Util; //调用md5Hex方法生成最终的加密串 String param="${ChallengeString}"; String pass=MD5Util.getMD5(param); System.out.println(pass); //将生成的加密串赋值给变量authcode,这样可以便于后续的使用 vars.put("code",pass);
添加监听器->查看结果树,运行测试,可以看到JMeter控制台中输出了加密后的字符串。
检测加密结果是否正确,在百度上搜索“md5在线加密”,我加密的数据是5c1110a935c062e1ee672d9f98e7be56:GDS3710IZpRsFzCbM:admin
String param="${ChallengeString}"; String pass=MD5Util.getMD5(param); System.out.println(pass);
你们在测试的时候可以将这一段修改为:
String pass=MD5Util.getMD5("hello");
System.out.println(pass);
然后你的加密数据是hello:GDS3710IZpRsFzCbM:admin
因为我的ChallengeString是从上一个http请求的返回数据中获取到的,所以如果是仅仅测试加密是否成功的话,给param赋一个定值就行了。
与上述窗口打印的数据是一致的,说明md5.jar包导入正确,并且对数据成功加密。
二.JMeter如何将上一个请求的结果作为下一个请求的参数---使用正则表达式提取器
正则表达式提取器是一个后置处理器,作用是在请求完成后,从响应数据中截取一部分字符串保存到变量中,以便下一个请求使用,下面我们就来做一个简单的例子。
1.在第一个HTTP请求下添加正则表达式提取器
2.在第一个HTTP请求添加好IP地址,路径,端口号,协议,方法,如果有参数,还需要添加参数
3.点击绿色箭头启动,查看第一个HTTP请求完成后的响应数据
4.第一个HTTP请求完成后的响应数据的ChallengeCode是随机变化的,每次HTTP请求完成后的响应数据的ChallengeCode是不同的,现在需要获取第一个HTTP请求完成后的响应数据的ChallengeCode作为BeanShell Sampler的加密参数,这个时候就需要用到正则表达式提取器,正则表达式提取器是一个后置处理器,作用是在请求完成后,从响应数据中截取一部分字符串保存到变量中,以便下一个请求使用。
5.现在编辑正则表达式提取器
说明:
(1)引用名称:作为下一个请求要用的参数名称,如填写ChallengeString,则可用${ChallengeString}引用它来作为BeanShell Sampler的参数
(2)正则表达式用<ChallengeCode></ChallengeCode>包起来,如第一个HTTP请求完成后的响应数据<?xml version="1.0" encoding="UTF-8" ?><Configuration><ResCode>0</ResCode><ChallengeCode>5c1110a935c062e1ee672d9f98e7be56</ChallengeCode><LoginType>0</LoginType><RetMsg>OK</RetMsg></Configuration>,我们只需要ChallengeCode,所以正则表达式为<ChallengeCode>(.+?)</ChallengeCode>,()表示括起来的部分就是要提取的。
.表示匹配任何字符串。
+表示一次或多次。
?表示不要太贪婪,在找到第一个匹配项后停止。
(3)模板:用$$引用起来,如果在正则表达式中有多个正则表达式,则可以是$2$,$3$等,表示解析到第几个值给ChallengeString。如:$1$表示解析到的第1个值,我们这里只有一个正则表达式,所以是$1$。
(4)匹配数字:0代表随机取值,1代表全部取值,通常情况下填1。
(5)缺省值:如果参数没有取得值,那默认给一个值让它取,通常情况下为空。
6.正如我前面写到的BeanShell Sampler程序中有一句代码:String param="${ChallengeString}";这句代码的意思就是使用第一个HTTP请求返回的数据。点击运行。
注:如果是要获取第一个HTTP的响应数据的URL地址的后面数字作为第二个HTTP的参数,做法也是一样的,只是正则表达式不一样。

三.JMeter如何实现session保持
既然都验证登录成功了,那我们总得搞点事情吧?所以光登录成功还不行,还要继续下一步的操作。这就要用到HTTP Cookie管理器。
添加HTTP Cookie管理器后,那么现在就可搞事情啦!
文章来源:http://blog.csdn.net/CjhLoveAndroid/article/details/77867613
posted on 2018-01-28 15:37 bijian1013 阅读(862) 评论(0) 收藏 举报