基于jmeter进行接口测试实践
摘要:
本次jmeter接口测试实践,其中涉及到数据参数化、动态获取参数值、使用第三方jar导入编写代码进行MD5加密、并发测试同步定时器、测试计划承上启下的接口组装等知识点的使用。
一、接口定义:
-
缴费订单生成接口
http://*******/portal/wallet/online/consume
请求方式: POST方法
Content-Type : application/json
image.png
image.png -
免密支付接口
image.png
请求例子:
image.png
image.png
以上接口使用到的privateKey值由第三方的设备生成,测试环境使用privateKey=##########
三、生成订单接口与免密支付接口使用场景测试点分析(本次只实践功能测试):
由于两个接口中的入参,都是来至PHP后端接口输出,入参存在跨数据库服务器使用,
并且java接口内部逻辑中还存在回调PHP端接口进行参数一致性的校验;
因此,不能随便给个参数值进行测试,需要从接口业务使用场景上进行分析与测试
1. 用户与车牌未绑定
2. 正常缴费订单免密支付
3. 支付金额与订单消费金额不一致
4. 最高金额小于200
5. 余额不足校验
6. 订单超时后,再进行免密支付
7. 同用户绑定多个车牌,并发缴费
四、构造测试数据:
本次测试使用数据驱动的方法测试,测试数据保存在txt文件中,jmeter测试计划参数化引用txt文件,读取参数数据达到测试不同目的
- 数据构造方法
- PHP后端数据库中,db.nonsecret_payment表增加测试数据,创建某用户进行开通免密支付数据 image.png
- 在db.nonsecret_payment_permission表中增加测试数据,创建某用户绑定车牌号,一个用户可以绑定多个 image.png
- 在db.payment_records表中增加某用户某车牌号停车消费金额 image.png
- 在钱包java 服务端数据库中设置该用户钱包余额db.user_wallet表中设置用户余额 image.png
五、jmeter构建接口测试框架
-
参数化定义
订单接口入参数据参数化定义保存于consume.txt文件:
goodsDetail //对应订单接口中的goodsDetail参数
memberId //对应订单接口中的memeberId参数
merOrderId //对应订单接口中的merOrderId参数
orderAmount //对应订单接口中的orderAmount参数
tranType //对应订单接口中的tranType参数
privateKey //对应订单接口中的privateKey参数
assert //断言期望结果参数超时订单免密支付入参数据参数化定义保存于orderId.txt文件:
orderId //对应超时缴费订单ID
privateKey //加密用的第三方privateKey
assert //断言期望结果参数模拟多个出口缴费并发参数保存于concurrency.txt文件中:
参数定义同consume.txt - 用例数据 image.png
-
jmetr组装接口业务用例流程步骤
image.png 添加钱包用户登录请求
数据参数化实现
用户需要在微信端进行登录钱包后,才可以进入生成缴费订单接口、免密支付接口执行, 实现方法:使用jmeter直接调用钱包的登录接口,post请求传入个人微信号的openId与unionId
登录接口: http://*******/portal/user/login
image.png 登录成功返回结果: image.png 登录钱包后获取登录状态token保存在header中,提供给其他接口判断是否已登录成功
jmeter获取token方法:
请求接口后,增加一个正则表达式提取器后置处理器
设置一个引用名称token,提取token值,该token名称会在别地方当做变量天引用
在全局的header信息头管理器中,引用token变量
image.png image.png 添加生成订单接口请求
根据接口定义,其中有一个sign参数,需要进行md5加密,加密的参数需要用例入参所有参数,而这些参数值都不是固定,由PHP后端调用传入.因此, jmeter需要动态获取入参进行MD5加密,获取动态sign值:- 找开发要MD5加密算法的类,创建一个java工程,编写一个MakeMd5类,定义实现两个加密方法 image.png image.png
- 导出以上类方法为jar包,把该jar放入apache-jmeter-3.0\lib\ext路径中,注意此时需要重启jmeter,否则import该包是不成功的。
-
在订单接口请求上一步骤添加一个BeanShell Sampler取样器,导入MD5加密包,并根据方法中定义的参数顺序,传入参数值进行MD5加密
image.png
image.png
添加消费接口请求
image.png
接口请求成功后,会返回一组json串
image.png
其中orderId是提供给免密支付接口使用,因此,在此步骤我们需要获取出orderId值赋于一个变量
我们使用正则表达式提取器获取: image.png 最后进行断言,因为在消费接口逻辑里不进行校验,只要传入符合参数类型的值,都会生成订单成功,返回200 image.png 添加免密支付接口请求
image.png 添加接口响应断言,引用用例数据中期望结果进行结果校验 image.png -
超时订单支付例的编写同以上的用例框架
同用户多车辆在不同出口进行并发免密支付用例组装基本同以上框架,但是有一点必须得注意,即是在哪个点上进行并发,本用例是在支付接口那里进行并发,因此在请求支付接口前,需要加一个同步定时器配置等待多少个线程到达此处时,就可以同时进行并发请求 image.png 至此,用例组装与数据准备完毕,下一步即是进行用例执行
六、执行结果
整个测试计划与执行结果如下:
由结果看,用例根据数据,逐条执行 image.png
各接口请求情况: image.png image.png image.png