JMeter是Apache组织的开放源代码项目,它是功能和性能测试的工具,100%的用java实现;
JMeter可以用于测试静态或者动态资源的性能(文件、Servlets、Perl脚本、java对象、数据库和查询、ftp服务器或者其他的资源)。JMeter用于模拟在服务器、网络或者其他对象上附加高负载以测试他们提供服务的受压能力,或者分析他们提供的服务在不同负载条件下的总性能情况。你可以用JMeter提供的图形化界面分析性能指标或者在高负载情况下测试服务器/脚本/对象的行为。
常用元件
- 取样器
- 逻辑控制器
- 前置处理器
- 后置处理器
- 断言
- 定时器
- 测试片段
- 配置元件
- 监听器
元件作用域
- 取样器:元件不和其他元件相互作用,因此不存在作用域的问题
- 逻辑控制器:元件只对其子节点中的取样器和逻辑控制器起作用
- 其他六大元件:除了取样器和逻辑控制器外,如果是某个取样器的子节点,则该元件对其父子节点起作用。
- 如果其父节点不是取样器。则其作用域是该元件父节点下的其他所有后代节点
元件执行顺序
- 配置元件
- 前置处理程序
- 定时器
- 取样器
- 后置处理程序
- 断言
- 监听器
重点组件
-
线程组:是控制Jmeter将用于执行测试的线程数,可以把一个线程理解为一个测试用户
-
特点:
- 模拟多人操作
- 线程组可以添加多个,多个线程组可以并行或串行
- 取样器和逻辑控制器必须依赖线程组才能使用
- 线程组下可以添加其他元件的组件
-
线程组分类:
- 线程组:普通的、常用的
- setUp线程组:执行预测试操作
- tearDown线程组:执行测试后的工作
-
HTTP取样器(在取样器中)
-
察看结果树(在监听器中)
简单的就不写了!!!
正则表达式
参数设计![在这里插入图片描述](https://img-blog.csdnimg.cn/d763e6e472764c78a25ddc80f7721b5a.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBAcGN5YmI=,size_20,color_FFFFFF,t_70,g_se,x_16)
案例:
1.先获取到播客的响应数据
2.可以利用网页看自己写的正则表达式是否可以匹配成功
3.填写参数
Xpath
参数设置
JSON 提取器
参数设置
案例:
1.先运行需要提取数据的接口,得到json数据
2.填写参数
3.结果
跨线程组关联
多个请求之间有关联关系(一个请求的参数需要使用前面请求的响应),但两个请求不在一个线程组中,此时提取器无法完成关联,需要使用Jmeter属性来完成数据的传递。
面试题:Jmeter中如何实现关联?
上一个接口中通过正则表达式或jsonpath解析器提取下一个接口需要的参数值保存到变量,然后再写一个接口通过${变量名}去获取变量。
案例:
1.添加两个线程组
如果两个线程组需要按顺序执行时,勾选如下:
2.使用json提取器提取需要的变量,设置为全局变量
使用生成全局变量函数
4.将该全局变量放在另一个需要使用他的请求中
5.成功!!!
Jmeter录制脚本
原理
Jmeter在客户端和服务器之间做代理,收到所有的请求和响应数据之后,Jmeter在进行逆向解析的动作,将数据报文转化为脚本。
- 在测试计划下新建 HTTP代理服务器与线程组,填写必须参数
- 配置本机代理服务器
- 点击启动
- 在浏览器中输入 127.0.0.1 之后查看线程组中 就有对应的请求
过滤规则
抓到的请求中可能有一些不需要的东西,所以设置过滤
所有表达式都需要使用正则表达式
.* 127.0.0.1. * 代表抓取只含有127.0.0.1的请求
再点击重启,再次发送请求
别忘了结束后关闭代理服务器~!!!!
在测试计划下新建 察看结果树 就可以看回放
碰到有cookie的 要添加cookie管理器
Jmeter直连数据库
通过连接数据库实时查看数据库的响应与请求的是否一致,校验数据的正确性
案例:连接tpshop商城数据库获取商品名为:小米手机5的商品id
- 在测试计划中导入mysql连接
- 添加所有元件、组件,并配置
- 结果
Jmeter逻辑控制器
常用的逻辑控制器:
- 如果(If)控制器:控制它下面的测试元素是否运行
- 循环控制器:控制子节点下HTTP请求的执行次数
- ForEach控制器:与用户定义的变量或者正则表达式提取器配合使用,循环读取用户定义的变量或者正则表达式结果中的所有数据
IF控制器
案例:
1.添加元件,组件,并配置
2.根据用户定义的变量执行http请求,定义的是百度,那么则执行name==baidu的请求
Jmeter中If控制器,没有对应的ELse语句,不同的分支相当于else,所以不同条件是,需要多个if控制器。
还可以用jexl3函数。我懒得写了。但是使用函数时,需要勾选
循环控制器
循环控制器与线程组中的循环次数的对比:
- 循环控制器只控制其子节点下的HTTP请求,线程组对所有的请求都有效。
- 假如线程组循环次数为2,循环控制器的次数为3,那么循环控制器下的请求执行次数为:2*3
ForEach控制器
参数配置:
与用户定义的变量配合
案例:
配置用户变量时,参数名为:固定前缀+连续编号
与正则表达式配合
案例:
1.添加各种元件、组件
2.提取地址
3.配置ForEach控制器
4.结果
定时器
同步定时器
保证大量的请求在同一时间进行发送,形成绝对的并发。
实现原因:设置同步定时器,有请求要发出时,同步定时器会暂缓请求发送,一直到积攒的请求数达到要的数量时,将所有的请求同步发送出去,形成绝对的并发(更大的压力负载)
案例:
1.添加元件、组件
2.配置参数
只有请求数量达到100,才一次性发送出去
3.结果
常数吞吐量定时器
案例:
1.添加元件、组件
2.配置参数
由于我的电脑可能qps达不到20,所以我选择qps=10,那么填写参数应该是10*60=600
3.查看聚合报告,吞吐量一列
JMeter分布式测试
在使用JMeter进行性能测试时,如果并发数比较大,单台电脑可能无法支持,这时可以使用JMeter提供的分布式测试的功能。
分布式相关注意事项:
- 测试机上所有的防火墙关闭
- 所有的控制机、代理机、被测系统都在一个子网中
- 所有的控制机和代理机上安装的Jmeter和JDK版本必须完全一样
- 要关闭Jmeter中的RMI SSL开关
聚合报告
HTML报告
通过命令行方式生成报告
常见图表
性能测试常用图表:
Concurrency Thread Group
TPS
运行中传输速率
客户端监控服务器 硬件资源:
并发数的计算
- 普通计算方式:
TPS = 总的请求数量 / 总的时间
存在的问题:对于同一天,不同的时间段。请求速率会有波动,这样计算会被平均掉,无法测试负载高的情况 - 二八原则
80%的请求会集中在20%的时间内完成
TPS = 总的请求数量 * 80% / 总的时间 * 20% - 按照每天的具体业务数据进行计算(稳定性测试TPS)
- 模拟用户峰值业务操作的并发数(压力测试TPS)
获取每天的交易峰值时间段,以及这个时间段内所有的请求的数量
TPS = 峰值时间内的请求书 / 峰值时间段 * 系数
面试题 :如何利用工具做接口测试?
我在小程序项目中使用了接口测试,主要有登录接口,支付接口等。
-
首先我根据API接口文档,了解接口业务,包括接口地址、请求方式、入参、出参、token、返回格式等信息。
-
使用postman或者Jmeter工具进行接口测试,一般步骤是:
- 新建一个线程组,发起HTTP请求(输入接口服务器和IP端口)
- 再新建其他HTTP请求,一个请求一个用例(输入接口路径,访问方式,参数等);创建断言和察看结果树
- 最后调式并执行用例。
如何获取token?
在请求中需要使用正则表达式提取token值。在填写到相关的http请求中。
postman如何接口测试,获取token?
在小程序项目中,如果要获取用户的订单,那么必须处于登录状态下才可以,我在操作是:执行后端操作,获取code值,通过code值,获取token。将得到的code值放入请求体中,发送请求后,响应体中则会有对应的token值,再将token值设置为全局变量。如果这个token值是有效的,即当前处于登陆状态,可以获取用户的订单。