1.性能测试理论
1.1 性能的概念
1.1.1 什么是性能
- 对于应用和软件来说,主要包括时间和资源两个维度
- 时间:系统处理用户请求的响应时间
- 资源:系统运行过程中,系统资源的消耗情况
1.1.2 什么是性能测试?
使用自动化工具,模拟不同的场景,对软件各项性能指标进行测试和评估的过程。
1.1.3 性能测试的目的?
- 评估当前系统能力
- 寻找性能瓶颈,优化性能
- 评估软件是否能够满足未来的需要
1.2 性能测试和功能测试:
1.2.1 功能测试和性能测试有什么不同?
功能测试:验证系统的功能需求规格。焦点:功能(正向、逆向)
性能测试:验证系统的业务需求场景。焦点:时间、资源
1.2.2 功能测试和性能测试有什么关系?
一般项目中,先功能测试通过后,后进行性能测试。
2 性能测试分类:
2.1 基准测试:
(1)概念:
狭义上讲:就是单用户测试。(单用户循环多次得到的数据)
广义上讲:建立基准线,当系统的软硬件环境发生变化之后再进行一次基准测试以确定变化对性能的影响。
(2)作用
基准测试不会单独存在
为多用户并发测试和综合场景测试等提供参考依据
为系统/环境配置、系统优化前后的性能提升/下降提供参考指标
2.2 负载测试
(1)概念:
通过逐步增加系统负载,确定在满足系统的性能指标(如响应时间等)情况下,找出系统所能够承受的最大负载量的测试。
(2)作用
系统最大负载量达到用户要求时,系统才能正式上线使用。
案例:电梯行业规范:电梯从1楼到5楼(15m)的运行时间不超过24s
进行负载测试:
case1: 1人乘坐电梯,从1楼到5楼,运行时间为20s
case2:7人乘坐电梯,从1楼到5楼,运行时间为20s
case3: 13人乘坐电梯,从1楼到5楼,运行时间为20s--->[最大负载量]
case4: 16人乘坐电梯,从1楼到5楼,运行时间为25s
Case5: 19人乘坐电梯,从1楼到5楼,运行时间为28s
Case6: 21人乘坐电梯,从1楼到5楼,运行过程中绳子断了。。。注意:
通过负载测试,可以确定系统的最大负载量和极限负载量
系统对外宣称的最大负载量
负载测试的时间一般为1-2小时
2.3 稳定性测试:
(1)概念
在服务器稳定运行(用户正常的业务负载下)的情况下进行长时间测试(1天-1周等),并最终保证服务器能满足线上业务需求。
(2)作用
系统在用户要求的业务负载下运行达到规定的时间时,系统才能正式上线使用。
2.4 其它分类-压力测试
背景:1、软件实际使用时,用户量超过预期(系统最大负载量),该如何反应?2、软件由于意外情况出现问题,多久能恢复?
(1)概念:
在强负载下的测试,查看系统在峰值情况下是否功能隐患、系统是否具有良好的容错能力和可恢复能力。
(2)测试场景
极限负载情况下的破坏性压力测试。
高负载下的长时间的稳定性压力测试。
2.5 其它分类-压力并发测试:
(1)概念:
并发测试(绝对并发):是指在极短的时间内,发送多个请求,来验证服务器对并发的处理能力。
(2)应用场景
特定活动场景,如:抢红包、秒杀、抢购等。
生活中的案例:
悬赏任务:做菜一西红柿炒鸡蛋(但是只有一个鸡蛋和一个西红柿)
(3)与负载测试对比:
负载测试:主要目的是测试高负载情况下,对系统资源的消耗,是否会耗尽的问题(双11活动)
并发测试:主要目的是测试极短时间内,并发请求时,系统资源争抢的问题(抢红包、秒杀)
3 性能测试的指标
3.1 响应时间:
指从客户端发起请求开始,到客户端接收到结果的总时间
包括:服务器处理时间 + 网络传输时间
3.2 并发用户数:
某一时刻同时向服务器发送请求的用户数
案例:淘宝系统案例—哪个是并发数?
3.3 吞吐量:
吞吐量(Throughput):指的是单位时间内处理的客户端请求数量,直接体现软件系统的性能承载能力。
从业务角度来看
- 单位:“业务数/小时”、“业务数/天”、“访问人数/天”、“页面访问量/天”
从网络角度来看
- 单位:“字节数/小时”、“字节数/天”
从技术角度来看
- 单位:每秒事务数(TPS)、每秒查询数(QPS)
QPS:
QPS(Query Per Second)每秒查询数:即控制服务器每秒处理的指定请求的数量
TPS:
TPS(Transactions Per Second)每秒事务数:即控制服务器每秒处理的事务请求的数量
事务:即业务,页面上的一次操作,可能对应一个请求/多个请求。
3.4 点击数:
所有的页面元素(如:图片、链接、框架等)的请求总数量.
注意:点击数是请求数,不是页面上的一次点击
3.5 错误率:
指系统在负载情况下,失败业务的概率
注意:
- 错误率是性能指标,是高负载下的失败业务的概率
- 随机bug是功能bug,先解决随机bug才能进行性能测试
3.6 资源利用率:
(1)什么是资源利用率?
系统各种资源的使用情况,“资源的使用量/总的资源可用量×100%”
(2)常见资源指标有哪些?
- CPU使用率:不高于75%-85%
- 内存(大小)使用率:不高于80%
- 磁盘IO(速率):不高于90%
- 网络(速率):不高于80%
4.性能测试的流程
性能测试的核心:需求分析、性能测试执行、性能分析调优
4.1 需求分析
4.2 性能测试计划和方案
测什么
- 项目背景
- 测试目的
- 测试范围
谁来测
- 进度与分工
- 交付清单
怎么测
- 测试策略
4.3 编写性能测试用例
用例模板:
4.4 性能测试执行
4.5 性能分析和调优
性能测试分析人员经过对结果的分析以后,如果不符合性能需求,则会提出性能bug,然后由开发人员进行后续的调优。
提示:
- 调优-开发人员为主导,数据库管理员、系统管理员、网络管理员、性能测试分析人员配合进行
- 验证-性能测试人员继续进行第二轮、第三轮.的测试,与以前的测试结果进行对比,从而确定经过调整以后系统的性能是否有提升
4.6 性能测试报告总结
测试报告是对性能测试工作的总结,为软件后续验收和交付打下基础。测试报告的主要内容:
- 测试工作的经过回顾
- 缺陷分析和调优
- 风险评估
- 性能测试结果
- 测试工作总结与改进
5.性能测试工具介绍
5.1 Loadrunner
简介
HP Loadrunner是一种工业级标准性能测试负载工具,可以模拟上万用户实施测试,并在测试时可实时检测应用服务器及服务器硬件各种数据,来确认和查找存在的瓶颈
支持多协议:Web(HTTP/HTML)、Windows Sockets、FTP、ODBC、MS SQL Server等协议
采用c语言编写
优点
1.多用户(支持用户以万为单位)
2.详细的分析报表(以秒为单位)
3.支持IP欺骗功能
缺点:
1.收费
2.体积庞大(安装包单位GB)
3.无法定制功能
5.2 JMeter
JMeter是Apache组织开发的基于Java的开源软件,用于对系统做功能测试和性能测试。它最初被设计用于web应用测试,但后来扩展到其他测试领域,例如静态文件、Java程序、shell脚本、数据库、FTP、 Mail等。
优点:
1.开源免费
2.小巧(安装包50MB左右)
3.丰富的学习资料和扩展组件
缺点:
1.不支持IP欺骗
2.分析和报表能力相对于LR欠缺精度(以分钟为
单位)
5.3 对比
相同点
1.都能模拟大量用户
2.都能支持多协议(常见的协议都支持,如:HTTP)
3.都有监控及分析报表功能
不同点
结论:项目日常性能测试Jmeter足够用,出商业报告优先Loadrunner
6.JMeter安装和基本使用
6.1 JMeter安装
安装JDK
安装 JMeter
下载JMeter
- jmeter是免安装的,下载解压配置环境变量即可使用。
环境配置(可不配)
jdk1.8环境配置:Java -version 查看jdk版本。
jmeter环境配置(不配置不影响)
1)桌面上选择“我的电脑”(右键),高级, 环境变量, 在“系统变量”—>“新建”, 在变量名中输:
JMETER_HOME,变量值中输入:D:\apache-jmeter-2.11
2)再修改CLASSPATH变量,变量值中添加%JMETER_HOME%\lib\ext\ApacheJMeter_core.jar;% JMETER_HOME%\lib\jorphan.jar;%JMETER_HOME%\lib\logkit-1.2.jar; 然后确定即可。
Jmeter启动
三种方式:进入JMeter安装目录下的bin目录
1、双击 jmeter.bat
2、双击ApacheJMeter.jar
3、命令行输入:java-jar ApacheJMeter.jar
启动效果
6.2 JMeter常用目录介绍和汉化设置
6.2.1 常用文件目录介绍
- Bin目录:存放可执行文件和配置文件
- docs目录:是JMeter的api文档,用于开发扩展组件
- printable_docs目录:用户帮助手册
- lib目录:存放JMeter依赖的jar包和用户扩展所依赖的jar包
6.2.2 JMeter界面的汉化
临时性:
启动JMeter->选择菜单、Options'->Choose Language->Chinese(Simplified)
永久性 — 修改配置文件:
1.找到jMeter安装目录下的bin目录
2.打开jmeter.properties文件,把第37行修改为"language=zh_CN"
3.重启JMeter即可
7.JMeter原件和组件介绍
7.1 元件的基本介绍
元件:多个类似功能组件的容器(类似于类)
如上图所示,主要包括:
1.取样器:发送请求
2.逻辑控制器:控制语句的执行顺序
3.前置处理器:对请求参数进行预处理
4.后置处理器:对响应结果进行提取
5.断言:检查接口的返回结果是否与预期结果一致
6.定时器:设置等待
7.测试片段:封装一段代码,供其他脚本调用
8.配置元件:测试数据的初始化配置
7.2 组件的基本介绍
组件:实现独立的某个功能(类似于方法)
例如:取样器的组件
7.3 小结
如下接口自动化脚本的实现过程对应着Jmeter哪个元件?
元件与组件有什么关系?
元件:多个类似功能组件的容器(类似于类)
组件:容器中实现独立的某个功能(类似于方法)
7.4 Jmeter元件作用域和执行顺序
元件的作用域:是靠测试计划的树形结构中元件的父子关系来确定的。
提示:所有的组件都是以取样器为核心来运行的。组件添加的位置不同,生效的取样器也不同
作用域的原则:
取样器:核心,不和其他元件相互作用,没有作用域。
逻辑控制器:只对其子节点中的取样器和逻辑控制器起作用。
其他元件:
如果是某个取样器的子节点,则该元件只对其父节点起作用。
如果其父节点不是取样器,则其作用域是该元件父节点下的其他所有后代节点(包括子节点,子节点的子节点等)。
元件的执行顺序
同一个作用域下不同类型元件:
1.配置元件(config elements)
2.前置处理程序(Per-processors)
3.定时器(timers)
4.取样器(Sampler)
5.后置处理程序(Post-processors)
6.断言(Assertions)
7.监听器(Listeners)
同一个作用域下多个相同类型元件:
按照在测试计划中从上到下的顺序依次执行
执行顺序样例
正确:定时器1-请求1-定时器1-定时器2-请求2-定时器1-定时器3-请求3
8.Jmeter第一个案例
需求:使用JMeter访问百度首页接口,并查看请求和响应信息
步骤:
1.启动JMeter
2.在测试计划
下添加线程组
3.在线程组
,下添加HTTP请求
取样器
4.填写HTTP请求
的相关请求数据
5·在线程组
下添加查看结果树
监听器
6.点启动
按钮运行,并查看结果
9.Jmeter三个重要组件(重点)
9.1 线程组
作用:线程组就是控制Jmeter用于执行测试的一组用户
位置:右键点击、测试计划'-->添加-->线程(用户)-->线程组
特点:
- 模拟多人操作
- 线程组可以添加多个,多个线程组可以并行或串行
- 取样器(请求)和逻辑控制器必须依赖线程组才能使用
- 线程组下可以添加其他元件下组件
线程组分类:
普通线程组:普通的、常用的线程组,可以看做一个虚拟用户组,线程组中的每一个线程都可以理解为一个虚拟用户
setUp线程组:一种特殊类型的线程组,可用于执行预测试操作
tearDown线程组:一种特殊类型的线程组,可用于执行测试后工作
线程组的属性:
练习:如下场景如何设置线程组?
模拟10个用户并行执行:----线程数
模拟10个用户5s内启动完成:----线程数10,ramp-up时间:5s
模拟2个用户各循环3次:----线程数:2,循环次数:3
模拟2个用户运行30s:----线程数:2,循环:永远,持续时间:30s
模拟2个用户等待10s后开始执行:----在上一个的基础上,增加延迟启动时间:10s
9.2 HTTP请求
作用:向服务器发送http及https请求
位置:选中线程组->右键->添加->取样器->HTTP请求
参数:
案例:
案例一:GET请求,URL为http://www.baidu.com/S?wd=test
要求:使用HTTP请求-路径来传递get请求参数案例二:GET请求,URL为https://www.baidu.com/S?wd=test
要求:使用HTTP请求-参数列表来传递get请求的参数案例三:PosT请求,URL为https://www.baidu.com/S,请求体为:wd=test(form表单)
要求:使用HTTP请求-参数列表来传递POST请求的form格式参数案例四:POST请求,URL为http://www.baidu.com/s,请求体为:wd=test(form表单)
要求:使用HTTP请求-消息体数据来传递POST请求的form格式参数
9.3 查看结果树
作用:查看HTTP请求的请求和响应结果
位置:选中测试计划/线程组->右键->添加->监听器->察看结果树
组成:
- 取样结果:查看响应信息头信息、响应状态码
- 请求:查看请求相关信息(url、方法、参数)
- 响应:查看响应信息
10.Jmeter参数化
定义:使用不同的测试数据,调用相同的测试方法进行测试
本质:实现测试数据与测试方法的分离。
JMeter中常见的参数化方式
- 用户定义的变量——全局变量
- 用户参数——为每个用户分配不同的参数值
- CSV数据文件设置——文件方式参数化
- 函数——随机数据
- 数据库
全局变量
步骤:
1.添加线程组
2.添加用户定义的变量。格式:变量名-变量值
3.添加HTTP请求,引用定义的变量名。格式: ${变量名}
4.添加查看结果树
用户参数-[在线程组配置]
作用:针对同一组参数,当不同的用户来访问时,可以获取到不同的值
步骤:
- 添加线程组,设置线程数为n(表示模拟的用户数)
添加用户参数
- 第一列添加多个变量含
- 后续每一列为一组用户的数据
3.添加HTTP请求用定义的变量名。格式: ${变量名}
4.添加查看结果树
CSV数据文件设置
作用:当不同的用户,或者同一个用户多次循环时,都可以获取到不同的值
位置:测试计划-->线程组--> 配置元件--> CSV 数据文件设置
步骤:
1.定义csv数据文件
user01,123456,0000
user02, 123456, 1111
user03, 123456, 2222
2.添加线程组
3.添加csv数据文件设置
4.添加HTTP请求,引用定义的变量名。格式: ${变量名}
5.添加查看结果树
函数(案例:_counter函数)
为什么要使用函数参数化?
性能测试时,如果模拟1000个用户,每个用户循环执行10万次添加商品操作,请求参数要求不同,该怎么做?
作用:计数函数,一般做执行次数统计使用
位置:在菜单中选择-->选项-->函数助手对话框
设置:
TRUE,每个用户有自己的计数器;FALSE,使用全局计数器
Name of variable in which to store the result(optional):用于存储结果的变量名(可选)
操作步骤:
1.添加线程组,设置虚拟用户数和循环次数
2.生成_counter函数
3.添加HTTP请求,使__counter
函数
4添加查看结果树
4种参数化方式有何不同?如何选择适当的方式?
用户定义的变量:
-作用:定义全局变量
-局限性:每次取值(无论是否相同的用户)都是固定值
用户参数:
-作用:保证不同的用户针对同一组参数,可以取到不同的值
-局限性:同一个用户在多次循环时,取到相同的值
csv数据文件设置:
-作用:保证不同的用户及同一用户多次循环时,都可以取到不同的值
-局限性:需要手动进行测试数据的设置
函数:
-作用:保证不同的用户及多次循环时,都可以取到。的值,不需要提前设置
-局限性:输入数据有特定的业务要求时无法使用(如:登录时的用户名密码)
评论 (0)