【性能、Jmeter】性能测试知识以及jmeter工具的基本使用方法
文章目录
- 1、性能测试基础
-
- 1.1、性能测试的概念
-
- 1.1.1、性能
- 1.1.2、性能测试
- 1.1.3、性能测试的目的
- 1.1.4、功能测试与性能测试
- 1.2、性能测试的策略
-
- 1.2.1、基准测试
- 1.2.2、负载测试
- 1.2.3、稳定性测试
- 1.2.4、压力测试
- 1.2.5、并发测试
- 1.3、性能测试的指标
-
- 1.3.1、响应时间
- 1.3.2、并发用户数
- 1.3.3、吞吐量(Throughput)
- 1.3.4、点击数
- 1.3.5、错误率
- 1.3.6、资源利用率
- 1.4、性能测试的流程
-
- 1.4.1、性能测试需求分析
- 1.4.2、性能测试的计划与方案
- 1.4.3、性能测试的用例
- 1.4.4、性能测试的执行
- 1.4.5、性能测试的分析与调优
- 1.4.6、性能测试报告
- 2、性能测试工具:Jmeter
-
- 2.1、loadrunner 与 Jmeter
- 2.2、Jmeter的基本使用
-
- 2.2.1、Jmeter环境安装
- 2.2.2、功能概要
-
- Jmeter文件目录结构
- Jmeter界面汉化
- 2.2.3、元件及作用域
-
- 基本元件
- Jmeter元件的作用域和执行顺序
- 2.2.4、Jmeter第一个案例脚本
- 2.3、Jmeter三个重要组件
-
- 2.3.1、线程组
-
- 特点
- 线程组的分类
- 线程组的属性
- 2.3.2、http请求
-
- 作用
- 位置
- 参数
- 2.3.3、查看结果树
- 2.4、Jmeter参数化
-
- 2.4.1、用户定义的变量
- 2.4.2、用户参数
- 2.4.3、CSV数据文件设置
- 2.4.4、函数[ counter计数函数 ]
- 2.4.5、总结
-
- 参数化
- 四种参数化
- 2.5、Jmeter 断言
-
- 2.5.1、响应断言
- 2.5.2、JSON 断言
- 2.5.3、断言持续时间
- 2.6、Jmeter关联
-
- 2.6.1、正则表达式提取器
-
- 正则表达式
- 正则表达式提取器
- 2.6.2、XPath提取器
- 2.6.3、JSON 提取器
- 2.7、Jmeter属性
-
- 2.7.1、_setProperty函数
- 2.7.2、_property函数
- 2.8、Jmeter脚本录制
1、性能测试基础
1.1、性能测试的概念
1.1.1、性能
就是指软件质量中的效率属性
效率属性:
- 时间特性:系统处理用户请求的响应时间
- 资源特性:系统运行过程中,系统资源的消耗情况。(资源包含:CPU、内存、磁盘等)
1.1.2、性能测试
使用自动化的工具,模拟不同的场景,对软件各项性能指标进行测试和评估的过程
1.1.3、性能测试的目的
- 评估当前系统能力
- 寻找性能瓶颈,优化性能
- 评估软件是否满足未来的需要
1.1.4、功能测试与性能测试
-
不同
功能测试:验证系统的功能需求规格。焦点:功能(正向、逆向)
性能测试:验证系统的业务需求场景。焦点:时间、资源
-
关系
一般项目里,先功能测试通过后,再进行性能测试
1.2、性能测试的策略
1.2.1、基准测试
-
概念
狭义上讲:单用户测试。(单用户循环多次得到的数据)
广义上讲:建立基准线,当系统的软硬件环境发生变化时之后再进行一次基准测试以确定变化对性能的影响
-
基准测试数据的用途
- 基准测试不会单独存在
- 为多用户并发测试和综合场景测试等提供参考数据
- 为系统/环境配置、系统优化前后的性能提升/下降提供参考数据
1.2.2、负载测试
-
概念
通过逐步增加系统负载,确定在满足系统性能指标(如响应时间等)情况下,找出系统所能承受的最大负载量的测试
-
作用
系统最大负载量达到用户要求时,系统才能正式上线使用
1.2.3、稳定性测试
-
概念
在服务器稳定运行(用户正常的业务负载下)的情况下进行长时间测试(1天~1周等),并最终保证服务器能满足线上业务需求
-
作用
系统在用户要求的业务负载下运行达到规定的时间时,系统才能正式上线使用
1.2.4、压力测试
-
概念
在强负载下的测试,查看系统在峰值情况下是否功能隐患、系统是否具有良好的容错能力与可恢复能力
-
测试场景
- 极限负载下的破坏性压力测试
- 高负载下的稳定性压力测试
1.2.5、并发测试
-
概念(绝对并发)
在极短时间内,发送多个请求,来验证服务器对并发的处理能力
-
应用场景:抢红包、秒杀、抢购等
1.3、性能测试的指标
为什么学习性能测试指标:对性能测试结果进行量化衡量
1.3.1、响应时间
从客户端发起请求开始到客户端接收到结果的总时间
包括:服务器处理时间 + 网络传输时间
1.3.2、并发用户数
某一时刻同时向服务器发送请求的用户数
1.3.3、吞吐量(Throughput)
-
概念
单位时间内处理客户端请求数量。直接体现软件系统的性能承载能力
-
单位
- 业务角度:访问人数/天,业务数/天
- 网络角度:b/s
- 技术指标:每秒查询数(QTS)、每秒事务数(TPS)
-
QTS与TPS的关系
事务即业务,一个事务可以对应一个请求或者多个请求
一个事务对应一个请求时:QTS = TPS
一个事务对应 n 个请求时:QTS = n * TPS
1.3.4、点击数
所有页面元素(图片、链接、框架等)的请求总数量
注意:点击数是请求数,不是页面上的一次点击
1.3.5、错误率
系统在负载情况下,失败业务的概率
注意:
- 错误率是性能指标,是高负载下失败业务的概率
- 随机bug是功能bug,先解决随机bug才能进行性能测试
1.3.6、资源利用率
-
概念
系统各种资源的使用情况
-
常见的资源指标
- CPU使用率:不高于75%~85%
- 内存使用率:不高于80%
- 磁盘IO(速率):不高于90%
- 网络(速率):不高于80%
1.4、性能测试的流程
1.4.1、性能测试需求分析
1.4.2、性能测试的计划与方案
- 测什么
- 项目背景
- 测试目的
- 测试范围
- 谁来测
- 进度与分工
- 交付清单
- 怎么测
- 测试策略
1.4.3、性能测试的用例
1.4.4、性能测试的执行
1.4.5、性能测试的分析与调优
说明:性能测试分析人员经过对结果的分析以后,如果不符合性能需求,则会提出性能bug,然后由开发人员进行后续的调优。
1.4.6、性能测试报告
- 测试工作的经过回顾
- 缺陷分析与调优
- 风险评估
- 性能测试结果
- 测试工作总结与改进
2、性能测试工具:Jmeter
2.1、loadrunner 与 Jmeter
相同点:
- 都能模拟大量用户
- 都支持多协议
- 都有监控与分析报表功能
不同点:
2.2、Jmeter的基本使用
2.2.1、Jmeter环境安装
-
安装JDK:下载JDK – 安装JDK – 配置环境变量 – 验证
-
安装Jmeter:下载Jmeter – 安装Jmeter – 配置环境变量 – 启动验证
注意点:
- 下载JDK时,注意电脑操作系统是32位/64位
- 下载Jmeter时,注意与本机安装的JDK版本匹配
- 安装Jmeter时,安装路径中不能有中文/空格
2.2.2、功能概要
Jmeter文件目录结构
Jmeter界面汉化
2.2.3、元件及作用域
基本元件
Jmeter元件的作用域和执行顺序
-
作用域的原则
-
取样器:核心,没有作用域
-
逻辑控制器:只对其子节点中的取样器和逻辑控制器起作用
-
其他元件:
-
如果是某个取样器的子节点,则该元件只对其父节点起作用
-
如果其父节点不是取样器,则其作用域是该元件父节点下的其他所有后代节点(包括子节点,子节点的子节点等)
-
-
-
元件执行顺序:
在同一个作用域(目录/级别/缩进)的不同元件的执行顺序:配置元件 - 前置处理程序 - 定时器 - 取样器 - 后置处理程序 - 断言 - 监听器
在同一个作用域(目录/级别/缩进)的相同元件的执行顺序:从上到下的顺序依次执行 -
案例:执行顺序
定时器1 - 请求1 - 定时器1 - 定时器2 - 请求2 - 定时器1 - 定时器3 - 请求3
2.2.4、Jmeter第一个案例脚本
需求:访问百度首页,并查看请求与响应信息
步骤:
- 启动JMeter
- 在 测试计划 下添加 线程组
- 在 线程组 下添加 HTTP请求 取样器
- 填写 HTTP请求 的相关请求数据
- 在 线程组 下添加 察看结果树 监听器
- 点击 启动 按钮运行,井查看结果
2.3、Jmeter三个重要组件
2.3.1、线程组
特点
控制Jmeter用于执行测试的一组用户
线程组的分类
- Setup线程组:预测试操作,所有脚本之前执行
- 普通线程组:执行测试用例,可以有1个或者多个(并行/串行)
- Teardown线程组:测试后操作,所有脚本之后执行
线程组的属性
- 参数介绍
-
案例分析:
使用1个线程组,添加HTTP请求(百度)- 配置线程数为2,循环次数为3时,运行观察结果
- 配置线程数为3,循环次数为2时,运行观察结果,对比不同
分析:
- 线程数代表虚拟用户数,用户数越多,负载越大
- 循环次数代表运行时间,次数越多,运行时间越长
2.3.2、http请求
作用
向服务器发送http及https请求
位置
选中线程组—>右键—>添加—>取样器—>HTTP请求
参数
2.3.3、查看结果树
2.4、Jmeter参数化
定义:使用不同的测试数据,调用相同的测试方法进行测试
本质:实现测试数据与测试方法的分离。
实现方式:
1. 用户定义的变量: 全局变量
2. 用户参数 :为每个用户分配不同的参数值
3. CSV数据文件设置: 文件方式参数化
4. 函数: 随机数据
5. 数据库
2.4.1、用户定义的变量
配置元件——>用户定义的变量
用户定义的变量是全局变量
定义变量格式:变量名:变量值
引用变量格式:${变量名}
2.4.2、用户参数
前置处理器——>用户参数
针对同一组参数,当不同的用户访问时,可以获取到不同的值
2.4.3、CSV数据文件设置
配置元件——>CSV数据文件设置
当不同的用户,或者同一个用户的多次循环时,都可以获取到不同的值
2.4.4、函数[ counter计数函数 ]
2.4.5、总结
参数化
把测试数据组织起来,用不同的测试数据调用相同的测试方法
四种参数化
-
用户定义的变量
作用:定义全局变量
局限性:每次取值(无论是否相同的用户)都是固定值
-
用户参数
作用:保证不同的用户针对同一组参数,可以取到不同的值
局限性:同一个用户在多次循环时,取到相同的值
-
CSV数据文件设置
作用:保证不同的用户,或者同一个用户的多次循环时,都可以获取到不同的值
局限性:需要手动进行测试数据的设置
-
函数
作用:保证不同的用户,或者同一个用户的多次循环时,都可以获取到不同的值,不需要提前设置
局限性:输入数据有特定的业务要求时无法使用
2.5、Jmeter 断言
断言:让程序自动判断实际结果与预期结果是否一致
提示:
- Jmeter在请求的返回层面有个自动判断机制(响应状态码)
- 请求成功,不代表结果正确
Jmeter中常用的断言:
- 响应断言
- JSON断言
- 持续时间断言(Duration Assertion)
2.5.1、响应断言
任意http请求的响应结果,都可以使用响应断言
http请求——>(右键添加)断言——>响应断言
2.5.2、JSON 断言
对http请求的响应结果为JSON格式时,可以使用
http请求——>(右键添加)断言——>JSON断言
2.5.3、断言持续时间
测试http请求的响应时间是否满足要求时使用
http请求——>(右键添加)断言——>断言持续时间
2.6、Jmeter关联
关联:当请求之间有依赖,比如一个请求的入参时另一个请求返回的数据,这时需要用到关联处理
Jmeter中常用的关联方法:
- 正则表达式提取器
- XPath提取器
- JSON提取器
2.6.1、正则表达式提取器
正则表达式
就是一个公式,或者说一套规则,使用这套规则可以从任意字符串中提取出想要的数据内容
-
通过一个正则表达式可以提取出多组数据,每组数据设置对应的左边界和右边界即可
-
每一组数据都可以有一个或者多个值
公式格式:左边界(匹配符号)右边界:可以提取出想要获取的数据内容. :是通配符,可以代表任意字符(除换行回车)* :代表前面的字符出现0次或者多次.* :找到左边界值后,往右查找有边界,找到最后面的右边界,中间的所有数据都被记录下来? : 代表非贪婪匹配,找到左边界后,往右查找匹配右边界,只要有匹配的右边界就停止继续查找;再次查找左边界和右边界公式格式:左边界(.*?)右边界百度一下,你就知道 百度一下,你就知道 (.*?)
正则表达式提取器
任意格式响应数据,都可以使用正则表达式提取器进行提取
http请求——>(右键添加)后置处理器——>正则表达式提取器
2.6.2、XPath提取器
针对HTML格式的响应数据时可以使用
http请求——>(右键添加)后置处理器——>XPath提取器
案例://a[@id='kw']: 在HTML页面中,找出a标签(有一个属性为id,且id的值为kw)//a : 找出所有的a标签
2.6.3、JSON 提取器
针对JSON格式的响应数据时,使用JSON提取器
http请求——>(右键添加)后置处理器——>JSON 提取器
2.7、Jmeter属性
需要实现跨线程组的数据传递时,可以使用Jmeter属性
2.7.1、_setProperty函数
将值保存成Jmeter属性,需要通过 Beanshell 取样器执行
2.7.2、_property函数
在其他线程组使用property函数读取属性