jmeter测试的组件执行顺序:
测试计划--->线程组--->配置元件--->前置处理器--->定时器--->逻辑控制器--->取样器--->后置处理器--->断言--->监听器
组件的作用范围:
- 同级组件
- 同级组件下的子组件
- 父组件
目前市面上的三类接口
1、基于webservice协议接口,通过xml传输数据
2、基于dubbo协议接口,通过json传输数据
3、基于http协议接口,通过json传输数据
[ ]:数组,多个值
{ }:对象,键值对
接口项目实战:
端口号:http:80
https:443
接口测试实战
- 创建一个线程计划
- 在线程计划中创建一个线程组
- 在线程组中添加配置元件(HTTP信息头管理器、HTTP请求默认值、HTTP Cookie管理器、用户定义的变量)
- 在线程组添加一个结果树来查看测试结果
在HTTP请求默认值中配置测试接口的请求协议、ip、端口号。在这里统一配置后,在接口测试时就不用重复配置这些前缀,只需要把URL填上即可。
在 HTTP信息头管理器,添加请求头信息
在线程组添加一个取样器---HTTP请求。这个组件就是填写要测试接口的信息。接口路径、参数、返回格式都在这里填写。
比如,我要测试的一个接口为用户登录接口,填写好接口路径以及参数后,点击运行,即可在查看树查看结果。
填写完接口信息后,点击运行按钮,然后在结果树查看测试结果。
现在正式开始一组接口测试:
要测试的接口流程:
验证码加载==>用户登录==>查看商品信息==>添加商品到购物车==>结算生成订单==>查看订单
用户登录接口:
方法:post
地址:/sysUser/listb
参数:
- username: admin
- password: admin
- code: aaaaa
- picture: aaaaa
- 不需要鉴权
结果:
{"msg":"操作成功!","code":200,"data":{"jwt":"token值","username":"用户名"}}
查看信息接口:
方法:get
地址:/login
参数:无
结果:
{{"code":200,"msg":"操作成功!","data":[{数据}]}}
添加商品到购物车
方法:post
地址:/sysUser/insertcar
参数:
{
"gname": "string",
"num": 0,
"price": 0,
"seller": "string",
"username": "string"
}
结果:
{{"code":200,"msg":"操作成功!","data":[{数据}]}}
结算生成订单
方法:post
地址:/sysUser/insertcar
参数:
{
"oid": "string",
"address": "string",
"buyer": "string",
"gname": "string",
"num": 0,
"seller": "string",
"created": "2023-07-26T09:11:10.237Z",
}
结果:
{{"code":200,"msg":"操作成功!","data":[{数据}]}}
查看订单
方法:get
地址:/sysUser/insertcar
参数:
name(当前的用户名)
结果:
{{"code":200,"msg":"操作成功!","data":[{数据}]}}
测试登录接口
现在开始测试用户登录接口
添加一个http请求
填入传输类型post,填入url,填入参数
然后,运行,查看结果树
测试查看商品的接口
测试查看商品的接口,除了登录接口的其他接口都需要登录时生成的token,也就是上图的jwt值,没有这个值,是无权进行查看接口这个操作。登录接口与查看商品接口有关联的,我们需要获取到这个token值,添加到后续接口的请求头。
**接口关联:**有两种方法
正则表达式提取器
1、变量名:可以随意定义
2、正则表达式:要包括左边界、右边界以及(.*?),
3、1表示取第一个正则。2表示取第二个正则
4、匹配数字,1表示取第一个匹配到的值
5、默认值,没有匹配到使用默认值。
然后在HTTP信息头管理器添加token信息
JSON提取器
例子
{"jwt":"eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzUxMiJ9.eyJzdWIiOiJhZG1pbiIsImlhdCI6MTY5MDM1OTczNiwiZXhwIjoxNjkwOTY0NTM2fQ.1HPGr2RLQpW8SzcRfHzWhMmJ9zMOVQXqe8g69tkOPF-QbdEPj7N0ASXW86lL0KxQ_rGcNdZ-WYmV9cbUpj8dCw","username":"admin"}
语法规则:只适用于json数据
- $代表根目录
- .代表子节点
$.jwt=>eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzUxMiJ9.eyJzdWIiOiJhZG1pbiIsImlhdCI6MTY5MDM1OTczNiwiZXhwIjoxNjkwOTY0NTM2fQ.1HPGr2RLQpW8SzcRfHzWhMmJ9zMOVQXqe8g69tkOPF-QbdEPj7N0ASXW86lL0KxQ_rGcNdZ-WYmV9cbUpj8dCw
- $.username=>admin
- $.* 取所有的值即jwt和username的值
如果没有通过鉴权测试,是无法访问其他接口的
在登录接口添加一个正则表达式管理器来获取token值
在线程组添加一个HTTP请求(查看商品接口),在接口下添加HTTP信息头管理器,并在信息头管理器里面填写token配置
然后在查看商品接口填写传输方式:get,参数:无;
运行测试,可以看到成功获得商品列表
测试添加商品到购物车
在线程组添加一个HTTP请求(添加商品接口),在接口下添加HTTP信息头管理器,并在信息头管理器里面填写token配置。
在添加商品接口内填写:
传输方式:post
参数:
{ "gname": "苹果手机", "num": 1, "price":4000.00, "seller": "root", "username": "${username}" }
username为当前登录的用户名,所以我们可以通过json提取器来获得登录时的用户名,并在此引用。
然后启动测试,查看结果数
测试结算生成订单接口
在线程组添加一个HTTP请求(生成订单接口),在接口下添加HTTP信息头管理器,并在信息头管理器里面填写token配置
在添加商品接口内填写:
传输方式:post
参数:
[
{"gname": "苹果手机",
"num": 1,
"buyer": "${username}",
"seller": "root",
"address": "广东省xx市xx区",
"created": "2023-06-27T03:19:43.460Z"
}
]
运行测试,得到结果
测试查看订单接口
在线程组添加一个HTTP请求(查看订单接口),在接口下添加HTTP信息头管理器,并在信息头管理器里面填写token配置
传输方式:post
参数:
String username
运行,查看结果树
以上就是jmeter测试接口的基本流程,但是以上例子都是正例。我们可以csv参数化来设置正例、反例来测试接口。以登录接口为例。
csv参数化
- 创建一个csv文件
- 打开文件
- 输入数据
第1行为属性名
username为登录接口的账号,password为密码,code和picture为验证码,duanyan为断言
第1行下面的则为属性值
第2行:账号密码、验证码都正确
第3行:账号为空,密码、验证码正确
第4行:账号、验证码正确、密码为空
第5行 :账号、密码正确、验证码错误
然后再登录接口下面添加一个csv数据文件设置,并配置
然后修改接口的参数
在线程组添加一个循环控制器 ,因为这里有4个用例,所以循环次数为4
把验证码接口和登录接口放到循环控制器中,运行测试,查看结果树,可以得到4组测试结果
压力测试
添加一个线程组,设置线程数为10,线程多少内启动完成,循环次数为1.
然后添加查看结果的页面:(聚合报告)、表格统计结果界面(根据需要,可选)、添加图形结果页面(根据需要,可选)。
然后添加要压力测试的接口,运行测试。
我要测试登录接口以及获取商品库存的接口,添加两个http请求,填好数据(如接口测试那样操作)。运行测试,查看结果:
聚合报告
表格统计
性能测试主要关注如下三个指标
- 吞吐量:每秒钟系统能够处理的请求数、任务数,该值越大越好
- 响应时间:服务处理一个请求或一个任务的耗时
- 错误率:一批请求中结果出错的请求所占比例