在目前的中大型企业中,仅仅进行功能测试已经不足以满足企业的需求,在重大客户基数下性能测试将会直接影响到用户体验
所以在这篇文章中我们将会学习性能测试的相关知识以及常用工具Jmeter
我们将会从以下角度进行介绍:
- 性能测试基础信息
- 性能测试工具介绍
性能测试基础信息
首先我们需要去系统的了解一下性能测试的相关信息
性能测试简述
首先我们需要了解我们为什么需要学习性能测试:
- 在目前企业里功能测试是最基本的需求,但随着用户量的增加,产品的品质也需要逐渐优化
- 性能测试主要是针对产品的执行速率,执行占用资源,并发度,最大可承受执行次数等多方面进行测试并判断是否满足产品需求
接下来我们需要理解性能主要针对什么:
- 性能测试主要针对两方面进行评估
- 时间层面:用户执行该操作最后效果展现所消耗的时间
- 资源层面:用户执行该操作对自身计算机所占用CPU等资源的消耗比率
那么性能测试就是在多种情况下对性能情况进行测试得出结果:
- 使用自动化工具,模拟不同场景下,对软件各项性能指标进行测试和评估的过程
最后我们简单讲一下性能测试的目的:
- 评估当前系统能力
- 寻找性能瓶颈,优化性能
- 评估软件是否满足未来需求,是否需要优化
性能测试对比
我们在之前的文章中已经学习了功能测试,那么我们简单给出两者的区别:
# 功能测试
# 目的:主要为了验证系统的功能需求规格是否满足产品需求
# 正向功能测试:采用完整正确的测试用例进行测试,判断是否满足产品需求
# 逆向功能测试:采用不完整或部分错误或错误的测试用例进行测试,判断是否满足产品需求
# 性能测试
# 目的:主要为了判断产品是否满足其业务需求场景
# 时间性能测试:采用业务需求场景下的测试用例获取最终时间结果,判断是否满足产品需求
# 资源性能测试:采用业务需求场景下的测试用例获取计算机资源占比,判断是否满足产品需求
我们还需要知道其两者之间的先后顺序关系:
- 在前后端提测之后,我们首先需要进行功能测试并回归完完全功能之后,判断该产品无任何问题后再进行性能测试
- 在完成功能测试和性能测试后,两者自动化的书写无先后顺序关系
性能测试分类
我们下面来介绍性能测试的多种测试方式
基准测试
首先我们需要介绍基准测试:
- 狭义:基准测试其实就是单用户测试
- 广义:基准测试是采用单用户测试在某一固定场景下进行测试并得到具体数据,以该数据作为基准和后续测试数据进行对比
我们给出一个简单实例来说明基准测试:
- 我们在最开始采用一种情况进行测试并得到结果进行记录,后续我们采用其他方式进行测试并与基准测试结果进行对比
- 基准测试:项目1.0版本,测试机配置(8G+16G),单用户查询一万条数据采用3.0s
- 后续测试:项目1.0版本,测试机配置(8G+32G),单用户查询一万条数据采用2.0s
- 后续测试:项目1.1版本,测试机配置(8G+16G),单用户查询一万条数据采用2.5s
那么基准测试的用途也很明显:
- 基准测试从不会单独出现,它需要与其他数据比较才有意义
- 基准测试采用单用户测试,主要是为了给后续多用户测试综合测试场景提供参考意义
- 基准测试采用测试机测试,主要是为了给后续不同配置测试机测试综合测试场景提供参考意义
负载测试
我们同样首先来介绍负载测试的意义:
- 通过逐步增加系统负载,确定满足系统性能指标情况下(响应时间或CPU占用率),找到该系统的最大承受量
我们给出一个简单实例来说明负载测试:
- 我们首先会从产品那里得到一个客户性能需求,例如该电梯从1楼运输到5楼的运行时间控制在15s内
- 那么我们就需要采用不同重量进行测试,判断是否满足客户需求并将该负载结果告诉产品
- 我们会从下述case中选择最大的满足性能需求的重量作为负载测试的最终结果
- case1:100KG物品在电梯中从1楼运输到5楼的运行时间是10s
- case2:500KG物品在电梯中从1楼运输到5楼的运行时间是10s
- case3:700KG物品在电梯中从1楼运输到5楼的运行时间是14s
- case4:900KG物品在电梯中从1楼运输到5楼的运行时间是17s
针对负载测试我们还需要知道这些内容:
- 系统对外宣称的一般是最大负载量
- 负载测试的测试时间一般为1-2小时
- 通过负载测试可以确定系统的最大负载量和极限负载量
负载测试的用途主要针对客户需求:
- 系统最大负载量达到客户需求时,系统才能正式上线使用
稳定测试
我们首先给出稳定性测试的概念:
- 稳定性测试主要是针对产品在稳定运行(正常业务负载下)的情况下进行长时间测试,并保证产品满足线上业务需求
我们现实中其实存在很多案例:
- 因为不同业务存在不同业务场景,所以稳定性测试的测试时间是不同的
- 例如12306铁路抢票软件,每天的0点到6点之间是不允许抢票的,那么我们只需要测试在一天情况下能否满足业务需求
- 例如淘宝京东购物软件,每天无时无刻都可以进行购物,那么我们测试时长就需要稍微拉长一些来判断能否满足业务需求
负载测试的用途主要针对产品持久性:
- 系统在用户要求的业务负载下达到规定的执行时间时,系统才能正式上线使用
压力测试
我们首先给出压力测试的概念:
- 压力测试主要针对在高压情况下,查看系统是否存在功能隐患,判断是否是否良好的容错能力和可恢复能力
针对压力测试主要分为两方面的压力测试:
- 系统在持续高压情况下的稳定性测试
- 系统在超高压情况下崩溃后的恢复能力测试
我们分别给出两个案例:
# 持续高压下压力测试
# 例如B站中某个视频爆火,在一段时间内,该视频的点击率一直上升,一直调用get接口
# 那么我们就需要去测试该接口在高负荷情况下(超过正常调用频率)在一段时间内(一天或三天)是否能够正常调用且无错误
# 超高压情况下恢复测试
# 例如某个功能爆火,导致该功能的点击量/接口调用率突然提升超过预期,导致该接口/数据库信息报错
# 那么我们就需要测试在该功能崩溃情况下,是否能在较短时间内恢复该功能的正常运行/接口调用无异常
并发测试
我们同样给出并发测试的概念:
- 并发测试是在极短的时间内,发送多个请求,判断是否出现资源争夺导致的异常情况
我们在日常生活中可以见到很多案例:
- 双十一定时抢券活动
- 春节火车票抢购时间
但是我们需要注意到的是并发测试和负载测试虽然都是测试资源消耗或者说是资源的最大承受量,但两者是不同的:
- 负载测试:是指一段时间内,在高负载的情况对于资源的消耗,是否会存在资源耗尽问题
- 并发测试:是指在极短时间内,判断是否会出现由于资源互相抢夺而导致功能无法实现问题
其实并发测试的主要测试点更像是我们操作系统中出现的死锁情况:
- 假设我们的资源A存在10个,资源B存在10个
- 同时存在20个线程都需要资源A和资源B,同时启动导致10个线程得到资源A,10个线程得到资源B
- 但两者都无法得到剩余的线程,从而出现资源死锁问题,导致资源无法释放,功能无法实现从而出现并发问题
性能测试指标
我们在进行性能测试时,当然不能只根据我们的感觉来判断该性能是否符合标准,因此就出现指标这一概念
响应时间
首先我们来介绍响应时间:
- 狭义:用户进行操作后,得到最后结果之间所消耗的时间
- 广义:主要包含浏览器传输时间,服务器处理时间,服务器传输时间,数据库处理时间等多时间汇总所得到的结果
我们可以简单给出一张图片进行解释:
我们的响应时间通常是我们进行性能测试最直接的判断结果:
- 例如我们查询一万条数据时所需要得到的响应时间在3s之内
但我们还需要注意一点:
- 我们所获取的响应时间并不能是单次运行所得到的时间
- 而是在多次运行下,所得到的所有运行时间的平均值(Jmeter会有一个字段存储平均响应时间)
吞吐量
我们来简单介绍一下吞吐量:
- 吞吐量指单位时间内处理客户端的请求数量,可以直接体现出系统的性能承载能力
吞吐量主要分为两种:
- TPS每秒事务数
- QPS每秒查询数
我们首先来介绍TPS:
- 即控制服务器每秒处理的事务请求的数量
- 该计算仅仅针对事务的数量进行计算,一次事务(一次点击)可能会出现1个或多个请求,而这些请求都被划分为一次事务
我们采用一张图片解释:
我们再来介绍QPS:
- 即控制服务器每秒处理的指定请求的数量
- 该计算是指针对某单一接口请求,去统计该单位时间内所处理的请求个数
我们同样采用一张图片解释:
资源利用率
我们来简单介绍一下资源利用率:
- 即计算机内各种资源的使用情况
- 通常是一个比率值,采用当前使用资源数/计算机全部资源数来获取
我们常见的一些计算机资源包括有:
- CPU使用率
- 显卡使用率
- 内存使用率
- 磁盘IO效率
- 网络传输率
性能测试流程
首先我们直接给出一张性能测试流程图:
需求分析
首先我们来讲解性能测试需求分析:
- 所有测试的需求分析的过程都是相同的,由产品给出具体指标,由我们进行解析梳理
我们通常将性能测试需求分析划分为四步:
# 1.明确被测系统
# 我们首先需要了解我们所测试的系统的业务功能和技术架构
# 我们需要去了解我们所测试的系统的常用模块,并了解其执行步骤
# 2.明确测试内容
# 在产品给出需求的情况下,我们直接去测试产品需求点即可
# 若产品未给出需求,那么我们主要针对用户使用最频繁的部分进行测试或者针对性能过低的部分进行测试优化
# 3.明确测试策略
# 该测试策略就是我们前面所提到的测试分类方法
# 该测试策略并非需要全部执行,我们需要针对不同情况采用不同测试策略进行测试
# 4.明确测试指标
# 同样,我们以产品的需求为主,如果存在需求,则满足需求即可
# 若不存在需求,我们可以参考其他软件或之前版本的测试数据进行判断其指标
测试计划
测试计划其实主要依照公司主管所制定的计划:
- 所测内容:依据项目背景,给出测试目的及测试范围即可
- 所测人员:由主管进行分配各个人员的分工以及完成时间等信息
- 所测方法:测试方法可以由主管指定,也可以由各个人员进行判断
测试用例
我们给出一张测试用例的常用模板图即可:
测试执行
我们的性能测试通常通过工具进行测试:
- 由于性能测试需要长时间点击或频繁点击,人工无法实现
- 我们通常通过参数化和脚本等,然后结合测试工具Jmeter或其他性能测试工具等去结合执行
我们的性能测试执行大概划分为四阶段:
# 1.建立测试环境
# 搭建性能测试环境,包括硬件环境,软件环境,网络环境
# 2.编写测试脚本
# 按照性能测试需求用例,使用性能测试工具书写测试脚本
# 3.性能测试监控
# 一般我们所使用的脚本工具都会存在性能测试监控窗口,我们只需要查看数据是否存在问题即可
# 4.执行测试脚本
# 设置性能运行场景,执行性能测试,收集测试结果并与指标进行对比
测试分析
我们在执行测试用例之后会获取到其性能测试结果,我们只需要对比即可:
- 针对不满足产品需求的性能测试结果,我们需要要求后端对其进行优化,并在优化后回归测试
测试报告
我们在测试结束之后通常需要去书写测试报告,主要是为了我们后续测试作为对照,主要包含以下内容:
- 测试流程记录
- 测试风险评估
- 测试结果记录
- 测试分析记录
- 测试总结改进
性能测试工具介绍
接下来我们开始正式介绍Jmeter工具的使用
Jmeter性能比较
其实除了Jmeter之外,我们还有很多性能测试工具,其中之前比较出名的就是Loadrunner,我们这里简单介绍一下两者的区别:
# 首先我们来简单说一下Loadrunner
# Loadrunner实际上算是一款很知名的性能测试工具
# Loadrunner的主要特点是:高收费,占用内存较大,功能全面无阉割,同时可模拟上万人同步操作
# 而Jmeter其实就是针对Loadrunner所做出来的阉割版性能测试工具
# 但是由于Jmeter的免费且开源使得它在如今社会满足企业需求且可以由我们自己插入第三方插件
# Jmeter的主要特点是:免费且开源,占用内存极小,基本满足企业需求,同时可模拟千人同步操作,可以手动导入第三方实现企业需求
# 且两者都包容多协议,像我们常用的Http,Https,FTP等协议,两者都可以使用
# 且两者都存在监听件,我们所做的性能操作都会直接体现在监听件中,不需要我们手动记录
Jmeter下载安装
Jmeter的下载非常简单,我们只需要到官网下载对应压缩包即可:Apache JMeter - Download Apache JMeter
我们将其压缩到对应文件夹即可,注意需要是全英文文件夹,下面我们使用一张图来介绍各文件内容:
如果我们希望快速打开Jmeter,我们通常会将该文件的bin目录放入我们的环境变量,那么我们仅需要使用一行简单命令就开启服务:
最后我们给出一下Jmeter的一个页面展示:
这里我们所看到的是英文界面,当然我们可以将其变为中文界面,我只需要进入bin目录的Jmeter.properties文件修改:
最后我们给出一个小提示,因为我的电脑存在这个问题,所以记录下来:
# 如果电脑是高刷新率,像我的电脑是240HZ刷新,就会导致Jmeter的GUI界面出现重叠问题
# 我们只需要在Jmeter.bat脚本中的第一行,加入这行代码即可
set JVM_ARGS=-Dsun.java2d.d3d=false
Jmeter元件介绍
我们首先给出一张Jmeter工具的相关元件图,我们会在下面进行解释:
下面我们依次来介绍上述元件的作用:
# 取样器
# 取样器就是用来发送请求的元件,我们在页面上点击按钮其实就是发送请求,这里就是模拟发送请求
# 逻辑控制器
# 逻辑控制器就是控制我们的元件是否执行,包含我们常用的if,while,foreach等
# 前置处理器
# 前置处理器是对我们的请求参数在执行前进行处理
# 后置处理器
# 后置处理器是对我们请求后所返回的响应进行处理
# 断言
# Python中常用的判断结果是否符合预期的功能
# 定时器
# 定时器主要用来控制我们多久后执行该取样器(发送请求)
# 配置元件
# 配置元件内的元件都是用于进行初始化的东西
# 监听器
# 监听器主要是用来获取我们使用取样器发送请求后的响应数据相关信息
接下来我们需要知道元件的作用范围都在哪里:
# Ø取样器:核心,没有作用域
# Ø逻辑控制器:只对其子节点中的取样器和逻辑控制器起作用
# Ø其他元件:
# •如果是某个取样器的子节点,则该元件只对其父节点起作用
# •如果其父节点不是取样器,则其作用域是该元件父节点下的其他所有后代节点(包括子节点,子节点的子节点等)
我们还需要注意其执行顺序:
# 在同一个作用域(目录/级别/缩进)的不同元件的执行顺序:
# 配置元件 - 前置处理程序 - 定时器 - 取样器 - 后置处理程序 - 断言 - 监听器
# 在同一个作用域(目录/级别/缩进)的相同元件的执行顺序:
# 从上到下的顺序依次执行
我们给出一张图,并给出它的执行顺序,大家可以明白其作用范围:
Jmeter案例展示
首先我们给出一个最简单的案例进行展示:
# 步骤
# 1.启动Jmeter
# 2.在“测试计划”下添加线程组
# 3.在“线程组”下添加“http请求”取样器
# 4.填写“http请求”取样器信息
# 5.在“线程组”下添加“查看结果树”监听器
# 6.点击启动按钮,并查看结果
我们这里首先给出http请求的界面展示,后续我们会详细介绍:
然后我们这里直接启动,给出查看结果树的执行界面展示:
Jmeter线程介绍
在了解其元组具体信息之前,我们首先需要了解一下线程组:
# 线程组一共只有三种,我们右键测试计划就可以创建线程组,这里不给图片展示了
# 1.线程组
# 控制Jmeter用于执行测试的一组用户,用于执行测试用例,可以有1个或者多个(并行/串行),后续我们会给出具体参数信息设置
# 2.Setup线程组
# 预测试操作,所有脚本之前执行
# 类似于Pytest里面的Setup方法
# 3.Teardown线程组
# 测试后操作,所有脚本之后执行
# 类似于Pytest里面的Teardown方法
我们给出线程组的展示图并说明其具体使用参数信息:
而最后我们在给出一个小贴士,是关于线程组的并行或串行启动的开关按钮:
Jmeter交互介绍
我们直接给出Jmeter请求的一张展示图,并在该展示图上进行介绍:
除了这些请求之外,我们在请求时,还需要传递参数信息:
- 如果是get请求,我们可以直接在路径后以?key1=value1&key2=value2的形式进行传递
- 其他请求类型,我们通常在下方的参数栏进行传递,也可以选择消息体数据采用JSON或其他格式传递,如果传递文件可以选择第三种
我们给出一张展示图:
我们顺便给出一张查看结果树的请求和响应展示图:
Jmeter参数处理
我们在之前的自动化测试中也学习到了参数化,现在我们来学习Jmeter的参数化设置:
- 参数化的本质就是实现测试数据与测试方法的分离
- 参数化主要使用不同的测试数据,调用相同的测试方法进行测试
全局变量
我们首先学习Jmeter参数化最基本的全局变量:
- 用户定义的变量 —— 全局变量
首先我们进行一些全局变量信息的讲解:
# 如何定义?
# 我们可以在线程组下,创建配置元件的用户定义的变量
# 具体作用?
# 定义一些全局变量方便我们频繁使用,例如我们频繁使用某些字段或某些数据,我们就可以定义为全局变量进行使用
# 如何使用?
# 我们只需要在需要导入的地方采用${变量名}就可以使用
我们直接给出全局变量定义的界面:
我们再给出一张使用图:
用户参数
同样我们首先给出用户参数的相关概念:
- 用户参数 —— 为每个用户分配不同的参数值
我们先来进行简单介绍:
# 如何定义?
# 我们可以在线程组下,创建前置处理器的用户参数
# 具体作用?
# 针对一组参数,当不同用户使用时,会获取不同的数据
# 如何使用?
# 我们只需要在需要导入的地方采用${变量名}就可以使用
我们首先给出一张用户参数设置图:
然后我们再给出一张使用图或者说我们的设置图:
数据文件
我们首先给出数据文件的相关定义:
- CSV数据文件设置 —— 文件方式参数化
我们同样给出介绍:
# CSV文件?
# CSV文件是一种分行存储数据的文件
# CSV文件类型1(存在表行头)
username,password,isOP
user1,123456,True
user2,123321,False
user3,111111,True
# CSV文件类型2(无表头行)
user1,123456,True
user2,123321,False
user3,111111,True
# 如何定义?
# 我们可以在线程组下,创建配置元件的CSV 数据文件设置
# 具体作用?
# 针对一组参数,当每次使用都会使用不同数据信息
# 如何使用?
# 我们只需要在需要导入的地方采用${变量名}就可以使用
我们首先给出一张CSV文件导入Jmeter的展示图:
我们在使用时,同样采用$符进行数据导入,注意key值是我们在CSV数据文件设置里设置的变量名称:
函数参数
最后我们介绍一下函数参数:
- 函数 —— 随机数据
我们同样给出基本介绍:
# 如何定义?
# 我们点击工具栏-选择函数助手对话框-弹出对话框-选择函数类型(这里我们仅介绍__counter计数器)
# 具体作用?
# 自动生成不重复的数据,让每个用户每次循环都获取到不同的数据,且不需要提前定义
# 如何使用?
# 我们只需要在需要导入的地方采用${函数名}就可以使用
我们给出函数定义界面展示:
这是我整理的《2024最新jmeter接口测试和jmeter接口自动化测试全套教程附带性能测试》,以及配套的接口文档/项目实战【网盘资源】,需要的朋友可以下方视频的置顶评论获取。肯定会给你带来帮助和方向。
b站最新最全的jmeter接口测试和jmeter接口自动化测试,jmeter性能测试保姆级全套教程!