如何使用jmeter测试app端口的md5加密接口

一、 基本介绍
jmeter是一款优秀的开源性能测试工具,目前最新版本4.0版本(jmeter4.0下载地址)。jmeter可用于测试接口、数据库测试。本文主要介绍jmeter在接口方面的压力测试。

在使用jmeter之前需要安装jdk环境,并将java路径添加到系统变量的path里。
在环境变量里面配置JAVA_HOME

打开下载好的jmeter后进入bin目录打开jmeter.bat文件即可。
技术研发中心 > 2018-05-03 使用jmeter进行压测 > image2018-4-28_17-28-9.png

第一步:在测试计划中右击添加线程组

技术研发中心 > 2018-05-03 使用jmeter进行压测 > image2018-4-28_17-28-19.png

第二步:在线程组页面添加http请求、查看结果数以及聚合报告

在这里插入图片描述

其中,http请求即为我们模拟手机端发出的请求,一般压力测试都涉及到很多接口同步使用,所以需要用到多少个接口就添加多少个http请求,其中最重要的就是出参和入参的设定,有时还需将第一个接口返回的值作为第二个接口的输入参数,比如登录和下单。点击下单时需要调用登录后返回的userId的值,这时就需要就jmeter里面的JSON extractor功能,把接口返回的数据里面的某一个值提取出来,当做变量。

二、 http请求
1.用一个http请求来模拟一次操作,例如点击登录这个动作就可以用一个http请求来模拟,填上服务器的ip和端口号和路径,以及是get请求还是post请求。如果待测的几个接口数据都用同一个ip,就可以添加一个http请求默认值减少操作量。

在这里插入图片描述

接下来详细分析http请求里面的路径,以平安地铁压测的步骤为例,1.手机账号注册,2.获取位置,3.创建护航员考勤,4.护航员考勤日志。总共四个接口,分析这个四个接口文档。找到接口名称,输入参数和输出参数,以及一些必填项。如下图,是护航员考勤接口的详细信息。

技术研发中心 > 2018-05-03 使用jmeter进行压测 > image2018-4-28_17-31-59.png

其中,系统级别输入参数大部分是必填的,输入参数和输出参数看业务要求自己选择输入参数。输入参数的格式要符合接口文档中规定的格式(没有就问开发要),例如第一个接口,手机账号注册的接口名(account),据业务要求,我们需要输入如下7个参数:

appkey,method,sign,v,timestamp,sign_method,account

其中6个系统级别的输入参数和一个应用级别的输入参数account。图中的名称和值输入接口文档中写好的即可,如果很多参数都是固定的就可在用户定义的变量预先设置好变量的值,然后再http请求里使用${}格式调用之前设定好的值,这样很方便用户之后改动变量的值,而不需要在所有地方变更参数值。

其中timestamp时间戳可以用jmeter自带的函数功能来实现,选择函数,设置格式可以轻松生成时间戳,最基本的就是${__time(,)}这种毫秒级的,因为我们每一次的请求所带的时间戳的值都不一样,所以我们添加一个前置处理器里面的用户参数,将时间戳用函数来参数化。这里的参数和我们设置的用户定义的变量不一样,用户定义的变量只会初始化一次,是固定的,每次请求都会发送固定的值,而用户参数里面的变量是不固定的,每次请求都会取生成的新的值。

技术研发中心 > 2018-05-03 使用jmeter进行压测 > image2018-4-28_17-32-37.png

再看最后一个参数,account,这个接口我们需要输入一个11位的手机号码,在不进行压测时可以随机输入11位数字进行测试,之后进行压测的时候可以将account进行参数化,

使得每一次请求都注册不同的手机号码。

同样,在进行模拟手机端的发送请求时会用到一个十分重要的参数,就是sign签名的计算,一般使用MD5加密,关于sign签名的计算会在下面详细介绍。

在设置好参数后可以将线程组设为1,判断接口是否通畅

在这里插入图片描述

可以看出改接口可以正常访问,在查看结果数的请求里可以看出post data为:app_key=FEDA506D38D8E930626E850139E74E0C&method=railway.user.info.by.account.get&sign=E855E0FDE49850FC2D8E2811290D8E72&v=1.0&timestamp=1524811903057&sign_method=md5&account=16646060048,可知我们访问的接口地址实际上为101.37.106.40/router? pp_key=FEDA506D38D8E930626E850139E74E0C&method=railway.user.info.by.account.get&sign=E855E0FDE49850FC2D8E2811290D8E72&v=1.0&timestamp=1524811903057&sign_method=md5&account=16646060048

有appkey,method,sign,v,timestamp,sign_method,account,刚好七个参数,即为我们在请求里设定好的7个参数。而这6个参数又需要在计算sign时用到,所以sign签名的计算和跟随请求一起发送的参数紧密相关。关于sign的算法我们使用jmeter里的BeanShell PreProcessor功能实现,让他输出MD5Signature,再在http请求里添加进sign的值,这样一个请求才算完成。

三、 sign签名的计算
我们在模拟手机端发送的请求时需要用到手机端的appkey和secret,这两个参数可以问开发要,在Jmeter的Http请求下添加一个 BeanShell PreProcessor, 在里面使用BeanShell 语言实现MD5加密。sign签名MD5的计算方法如下图所示,右击线程组-添加后置处理器-BeanShell PreProcessor。

在这里插入图片描述

主要看这一段代码:

String param = vars.get(“secret”)+“account”+vars.get(“account”)+“app_key”+vars.get(“app_key”)+“method”+“railway.user.info.by.account.get”+“sign_method”+vars.get(“sign_method”)+“timestamp”+vars.get(“timestamp”)+“v”+vars.get(“v”)+vars.get(“secret”);

方法为,将手机号注册这个接口里同请求一起发送的参数的名称的6个参数(除了sign),按照secret+名称+名称+名称+名称+

+名称+名称+secret的方式排序,注意顺序是按照英文字母的顺序进行排序,不能出错,否则无法计算出MD5加密后的Sign签名的值。

四、 参数化和函数介绍
在做完第一个接口手机号码注册后,接下面设计第二个接口,获取位置,此时的接口输入参数需要用到第一个接口返回的userId,我们来看一下第一个接口返回的数据,

{

"class":"com.xiniunet.railway.response.UserGetInfoByAccountResponse",

"errors":

[

],

"escortTime":"0",

"firstErrorMessage":"",

"safetyEscort":

{

    "autoLaid":true,

    "class":"com.xiniunet.railway.domain.SafetyEscort",

    "id":"989758975539023872",

    "isLaid":false,

    "rowVersion":"0",

    "tenantId":"973848199737774088",

    "userId":"989758975383834624"

},

"todayEscortTime":"0",

"user":

{

    "age":0,

    "class":"com.xiniunet.railway.domain.User",

    "id":"989758975383834624",

    "needCheck":false,

    "online":false,

    "rowVersion":"0"

}

}

从上面的相应数据可以看出userId的值为989758975383834624,而这个值会在第三个接口创建护行员考勤日志里面要用到,因为根据创建护行员考勤日志的接口信息,我们看到userid是必填项,所以我们就需要使用JSON extractor提取这个返回的userId,提取的格式为$.user.id

关于提取格式的介绍如下:

Variable names : 名称
JSONPath Expression:JSON表达式
Match Numbers:匹配哪个,可为空即默认第一个
Default Value:未取到值的时候默认值

比如某一请求的返回值为:

{“statusCode”:200,“data”:{“userId”:“4a2cbe616eb74f0d99190af072c8dea6”,“token”:“37e7a9e198186f5a443e50e6138a5bd20bd”}}

这里因为返回的是json数据,$.data.token,获取token的值

但是有碰到一个坑 ,外一个接口请求返回值为:

{“statusCode”:200,“data”:[{“code”:“407949”,“id”:“aa477ad2085d492a99b877d14343d68d”,“name”:“90一中4545”}]}

同样,使用$.data.id去提取id的值时,发现获取到的数据为空
原来这个responses 的data为数组,故应为 $.data[0].id 提取第1个值,

在提取userId后,继续输入另外两个必填参数,requestData和requestTime,其中requestTime的值我们用jmeter函数里面的UUID设定为随机的唯一值。requestdata我们使用jmeter里的配置文件-csv

功能,使得每次发出的请求的requestdata都不一样。

Jmter的三种参数化方式包括:
1.用户参数
2.函数助手
3.CSV Data Set Config

1.用户参数

位置:添加-前置处理器-用户参数
在这里插入图片描述
操作:可添加多个变量或者参数
在这里插入图片描述

  1. 函数助手

在这里插入图片描述

位置:按照1-2-3的步骤

操作:4中填写文件的位置,5中填写要读取的列的位置,第一列为0。点击【生成】按钮,拷贝字符串,去替换要参数化的值。

注意:Jmeter读取的文件中第一行没有标题,直接就是值了。

3.CSV Data Set Config

1.为文件所在的位置,可以建txt文档,然后,直接改后缀名。里面的内容,第一行直接为数据。这里支持csv,txt,dat三种格式。

2.utf-8,编码格式,直接照写就行

3.sku,为参数的名字,用${sku}替换要参数化的地方。如果有多个变量,则用逗号隔开,如user,pwd

五、 线程组和报告分析
按照上面介绍的方式,设计好四个接口确定返回值正确的话就可以增加线程数进行压测了。例如:

其中

Label:每个JMeter的element的Name值。例如HTTP Request的Name

#Samples:发出请求数量。如第三行记录,模拟20个用户,循环100次,所以显示了2000

Average:平均响应时间(单位:)。默认是单个Request的平均响应时间,当使用了Transaction Controller时,也可以以Transaction为单位显示平均响应时间

Median:中位数,也就是50%用户的响应时间

90%Line:90%用户的响应时间不超过

95%Line:95%用户的响应时间不超过

99%Line:99%用户的响应时间不超过

Min:最小响应时间

Max:最大响应时间

Error%:本次测试中出现错误的请求的数量/请求的总数

Throughput:吞吐量。默认情况下标示每秒完成的请求数(具体单位如下图)

KB/sec:每秒从服务器端接收到的数据量。

响应时间分布图:横坐标是时间,Y轴是响应时间单位为毫秒

例如:1500并发下的报告
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值