计算机性能测试软件 手机测试和软件测试区别
2023-04-25 20:48 ca 蜻蜓知识 浏览: 3637 作者: tiger
一、性能测试基础知识
1.性能测试分类
- 基准测试
- 狭义上讲:就是单用户测试。测试环境确定后,对业务模型中的重要业务做单独的测试,获取单用户运行时的各项性能指标。
- 广义上讲:是一种测试量和评估软件性能指标的活动,可以在某个时刻通过基准测试建立一个已知的性能基准线,当系统的软硬件环境发生变化之后再进行一次基准测试以确定变化对性能的影响。
- 负载测试
- 通过逐步增加系统负载,确定在满足系统的性能指标情况下,找出系统所能够承受的最大负载量的测试。
- 稳定性测试
- 概念:在服务器器稳定运行(用户正常业务负载下)的情况系进行长时间(1天-1周不等),并最终保证服务器能满足线上业务需求。
- 作用:系统在用户要求的业务负载下运行达到规定的时间时,系统才能正式上线使用。
- 压力测试
- 概念:在强负载下的测试,查看系统在峰值情况下是否存在功能隐患,系统是否具有良好的容错能力和可恢复能力。
- 测试场景
- 极限负载情况下的破坏性压力测试
- 高负载下的长时间的稳定性压力测试
- 并发测试
- 概念:是指在极短的时间内,发送多个请求,来验证服务器对并发的处理能力。
重点:基准测试→负载测试→压力测试,是在对系统不断加压的过程。
2.性能测试指标
- 响应时间
- 定义:指用户从客户端发起一个请求开始,到客户端从收到服务器端返回结果,整个过程锁耗费的时间。
- 响应时间=网络时间+应用程序处理时间
- 并发用户数
- 定义:某一时刻同时向服务器发送请求的用户数
- 吞吐量
- 定义:指的是单位时间内处理的客户端请求数量,直接体现软件系统的性能承载能力。
- QPS(Query Per Second):每秒查询数,即服务器每秒处理的指定请求的数量
- 查询:即http或http请求
- 不同业务接口对应不同的QPS
- TPS(Transaction Per Second):每秒事务数,即服务器每秒处理的事务请求的数量
- 事务:即业务,页面上的一次操作,可能对应一个请求/多个请求。
- 点击数
- 定义:指客户端向服务端发送请求时,所有的页面资源元素(如:图片、链接、框架css、js等)的请求总数量。
- 错误率
- 定义:只系统在负载情况下,失败业务的概率。错误率=(失败业务数/业务总数)*100%
- 资源利用率
- 定义:是指系统各种资源的使用情况,一般用“资源的使用量/总的资源可用量*100%”,形成资源利用率数据。
- 根据经验,资源指标同城要求:
- CPU不高于80%
- 内存不高于80%
- 磁盘IO不高于90%
- 网络使用率不高于80%
3.性能测试流程
(1)性能测试需求分析
- 明确被测系统
- 熟悉被测系统的业务功能
- 熟悉被测系统的技术架构
- 明确测试内容
- 业务角度:
- 用户使用频率较高的关键业务功能
- 技术角度:
- 逻辑复杂度高的业务
- 数据量大的业务
- 明确测试策略
- 负载测试
- 稳定性测试
- 并发测试
- 明确测试指标
- 有明确需求指标
- 下单业务并发20个用户
- 平均响应时间要小于等于3S
- 事务成功率100%
- CPU使用率小于等于85%
- 无明确需求指标(分析指标)
- 查找资料
- 类似的系统对比
- 对未来流量的预估
(2)性能测试计划和方案
- 测什么
- 项目背景
- 测试目的
- 测试范围
- 谁来测
- 任务分工与进度安排
- 交付清单
- 怎么测
- 测试策略
(3)性能测试用例设计
- 性能测试用例:
- 用例八要素:编号、标题、模块、级别、预置条件、测试数据、步骤、预期结果。
- 示例
(4)性能测试执行
- 搭建测试环境
- 搭建性能测试环境,包括硬件环境、软件环境、网络环境
- 提示:一般情况下可以要求运维和开发工程师协助完成
- 编写测试脚本
- 按照性能测试用例的需要,使用性能测试工具进行编写测试脚本
- 提示:脚本可以自己编写,也可以使用工具来录制
- 性能测试监控
- 在执行脚本前,配置各项性能的监控指标
- 如:响应时间、TPS、错误率、资源使用率(CPU、内存、磁盘、网络)
- 性能监控工具(Zabbix、WGCLOUD)
- 执行测试脚本
- 设置性能运行场景,执行性能测试,并同步收集各项性能指标
- 提示:执行性能测试脚本前,保证脚本都调试通过
(5)性能分析和调优
- 说明:性能测试分析人员经过对结果分析以后,如果不符合性能要求,则会提出性能bug,然后又开发人员进行后续的调优
- 提示
- 调优:开发人员为主导,数据库管理、系统管理员、网络管理员,性能测试分析人员配合进行
- 验证:性能测试人员进行第二轮、第三轮......的测试,与以前的测试结果进行对比,从而确定经过调整以后系统的性能是否有提升
(6)性能测试报告总结
- 测试报告是对性能测试工作的总结,为软件后续验收和交付发下基础
- 测试报告的主要内容:
- 测试工作的经过回顾
- 缺陷分析和调优
- 风险评估
- 性能测试结果
- 测试工作总结与改进
二、性能测试常见面试题
5.有验证码的功能,怎么做性能测试
- 将验证码暂时屏蔽,完成性能测试后,再恢复
- 使用万能的验证码
6.你们性能测试做的是前台还是后台?
- BS架构:测试的是后台服务器接口的性能
- APP项目:手机端和服务器端的性能都需要做(更重要的是服务器接口性能)
7.性能测试发现问题,你是符合分析或定位的?
- 响应时间不达标:查看所消耗的时间主要在网络传输还是服务器,如果是网络,就结合吞吐量,考虑增加带宽。如果主要时间是消耗在服务器上,就要分别查看接口服务器和数据库服务器的CPU,内存的使用率,分别取出日志,发给开发定位,如果问题定位困难,直接让开发现场调试)。
- 服务器CPU指标异常|数据库CPU指标异常|内存泄漏等等,统一答案【取出对应日志,发给开发定位,如果问题定位困难,直接让开发现场调试】
三、性能测试工具
8.JMeter脚本编写实例
8.1脚本编写
8.1.1 添加线程组
右键点击“测试计划” -> “添加” -> “Threads(Users)” -> “线程组”
这里可以配置线程组名称,线程数,准备时长(Ramp-Up Period(in seconds))循环次数,调度器等参数:
线程组参数详解:
- 线程数:虚拟用户数。一个虚拟用户占用一个进程或线程。设置多少虚拟用户数在这里也就是设置多少个线程数。
- Ramp-Up Period(in seconds)准备时长:设置的虚拟用户数需要多长时间全部启动。如果线程数为10,准备时长为2,那么需要2秒钟启动10个线程,也就是每秒钟启动5个线程。
- 循环次数:每个线程发送请求的次数。如果线程数为10,循环次数为100,那么每个线程发送100次请求。总请求数为10*100=1000 。如果勾选了“永远”,那么所有线程会一直发送请求,一到选择停止运行脚本。
- Delay Thread creation until needed:直到需要时延迟线程的创建。
- 调度器:设置线程组启动的开始时间和结束时间(配置调度器时,需要勾选循环次数为永远) 持续时间(秒):测试持续时间,会覆盖结束时间 启动延迟(秒):测试延迟启动时间,会覆盖启动时间 启动时间:测试启动时间,启动延迟会覆盖它。当启动时间已过,手动只需测试时当前时间也会覆盖它。 结束时间:测试结束时间,持续时间会覆盖它。
8.1.2 添加HTTP请求
右键点击“线程组” -> “添加” -> “Sampler” -> “HTTP请求”
对于我们的接口http://www.baiduu.com/origin/s?ie=utf-8&wd=jmeter性能测试,可以参考下图填写:
Http请求主要参数详解:
- Web服务器 协议:向目标服务器发送HTTP请求协议,可以是HTTP或HTTPS,默认为HTTP 服务器名称或IP :HTTP请求发送的目标服务器名称或IP 端口号:目标服务器的端口号,默认值为80 2.Http请求 方法:发送HTTP请求的方法,可用方法包括GET、POST、HEAD、PUT、OPTIONS、TRACE、DELETE等。 路径:目标URL路径(URL中去掉服务器地址、端口及参数后剩余部分) Content encoding :编码方式,默认为ISO-8859-1编码,这里配置为utf-8
- 同请求一起发送参数 在请求中发送的URL参数,用户可以将URL中所有参数设置在本表中,表中每行为一个参数(对应URL中的 name=value),注意参数传入中文时需要勾选“编码”
8.1.3 添加察看结果树
右键点击“线程组” -> “添加” -> “监听器” -> “察看结果树”
这时,我们运行Http请求,修改响应数据格式为“HTML Source Formatted”,可以看到本次搜索返回结果页面标题为”jmeter性能测试_百度搜索“。
8.1.4 添加用户自定义变量
我们可以添加用户自定义变量用以Http请求参数化,右键点击“线程组” -> “添加” -> “配置元件” -> “用户定义的变量”:
新增一个参数wd,存放搜索词:
并在Http请求中使用该参数,格式为:${wd}
8.1.5添加断言
右键点击“HTTP请求” -> “添加”-> “断言” -> “响应断言”
我们校验返回的文本中是否包含搜索词,添加参数${wd}到要测试的模式中:
8.1.6添加断言结果
右键点击“HTTP请求” -> “添加”-> “监听器” -> “断言结果”
这时,我们再运行一次就可以看到断言结果成功或失败了
8.1.7添加聚合报告
右键点击“线程组” -> “添加” -> “监听器” -> “聚合报告”,用以存放性能测试报告
这样,我们就完成了一个完整Http接口的JMeter性能测试脚本编写。
8.2 执行性能测试
8.2.1 配置线程组
点击线程组,配置本次性能测试相关参数:线程数,循环次数,持续时间等,这里我们配置并发用户数为10,持续时间为60s
8.2.2 执行测试
点击绿色小箭头按钮即可启动测试,测试之前需要点击小扫把按钮清除之前的调试结果。
8.3 分析测试报告
待性能测试执行完成后,打开聚合报告可以看到:
聚合报告参数详解:
- Label:每个 JMeter 的 element(例如 HTTP Request)都有一个 Name 属性,这里显示的就是 Name 属性的值
- Samples:请求数——表示这次测试中一共发出了多少个请求,如果模拟10个用户,每个用户迭代10次,那么这里显示100
- Average:平均响应时间——默认情况下是单个 Request 的平均响应时间,当使用了 Transaction Controller 时,以Transaction 为单位显示平均响应时间
- Median:中位数,也就是 50% 用户的响应时间
- 90% Line:90% 用户的响应时间
- Min:最小响应时间
- Max:最大响应时间
- Error%:错误率——错误请求数/请求总数
- Throughput:吞吐量——默认情况下表示每秒完成的请求数(Request per Second),当使用了 Transaction Controller 时,也可以表示类似 LoadRunner 的 Transaction per Second 数
- KB/Sec:每秒从服务器端接收到的数据量,相当于LoadRunner中的Throughput/Sec
一般而言,性能测试中我们需要重点关注的数据有: Samples 请求数,Average 平均响应时间,Min 最小响应时间,Max 最大响应时间,Error% 错误率及Throughput 吞吐量。
8.4使用命令执行性能测试
jmeter -n -t D:\apache-jmeter-5.1.1\bin\baiduu.jmx -l result.jtl -e -o D:\CentOS\CentOS7
注: D:\apache-jmeter-5.1.1\bin\baiduu.jmx 文件保存的位置
D:\CentOS\CentOS7 测试结果保存的位置
8.5参数化方法
8.4.1参数化的使用场景
1)多个请求都是同一个ip地址,若服务器地址更换了,则脚本需要更改每个请求的ip
2)注册账号,不允许账号重复;想批量注册用户时
3)模拟多个用户登录,需要用到不同用户信息登录时
4)上一个请求的输出结果用于下一个请求的参数传入,例如登录获取到的token信息,用于提交账单请求的参数调用
8.4.2.什么是参数化
概念:根据需求动态获取数据并进行赋值的过程。
参数化:通俗的讲就是在进行测试的时候,测试数据是一项重要的准备工作,每次迭代的数据当不一样的时候,需要进行参数化,从参数化的文件中来读取测试数据。例如:测试用户登录时需要输入用户名和密码,假如系统不允许相同的用户名和密码同时登录,或者想更好的模拟多个用户来登录系统。这个时候就需要对用户名和密码进行参数化,使每个虚拟用户都使用不同的用户名和密码进行访问。
8.4.3.jmeter的几种参数化方式
这里以下边的这个注册接口为例:接口地址:http://api.apiopen.top/api.html
开发者注册
请求方式:POST
请求地址:http://api.apiopen.top/developerRegister
Query参数名 | 类型 | 必需 | 描述 | 示例 e.g. |
name | string | 是 | 用户名 | peakchao |
passwd | string | 是 | 密码 | 123456 |
string | 是 | 邮箱,用户反馈相关会邮件通知。 | 309324904@qq.com |
返回示例:
{
&34;code&34;: 200,
&34;message&34;: &34;成功!&34;,
&34;result&34;: {
&34;apikey&34;: &34;b9b3a96f7554e3bead2eccf16506c13e&34;
}
}
8.4.3.1在jmeter中,通过${变量名}来获取参数值。
1、用户定义的变量
1)线程组右键添加-->配置元件-->用户定义的变量,出现如下设置页面后
输入名称、值;注意:名称可以自定义设置,如下图所示:
2)然后将设置后的变量名称,在注册、登录请求中进行参数化引用、{email}
注意:引用的参数名跟用户定义变量设置的名称必须保持一致,宏哥这里例举了一个注册实例,如下图所示:
3)点击运行,查看结果树,显示成功,如下图所示:
2、函数助手获取参数值
1)选择菜单栏 选项-->函数助手对话框,弹出函数助手框,功能下面有多个函数可供选择,我们主要看下__RandomString,其他可以自行了解下哟
2)要进行多个账号注册(比如10个用户),注册信息要求邮箱 email 和用户名 name 不能重复;所以可以这么来思考,QQ邮箱后边的@qq.com段固定,那就对QQ邮箱前几位进行随机,页面设置如下图所示:
3)拷贝生成的函数字符串,粘贴进行参数引用,如下图所示:
4)设置线程组线程数为10,模拟10个虚拟用户的注册,如下图所示:
5)点击运行,查看结果树,显示成功,(宏哥这里只举例说明邮箱,用户名你可以模仿设置后《宏哥这里在“北京宏哥”后边加了一个随机函数random,这样北京宏哥后带有一个数字就不会重复了》,才能注册成功,否则会报用户名重复的错误)如下图所示:
3、CSV Data Set Config获取参数值
1)若需要注册的QQ邮箱不能随机,必须是用户真实提供的QQ邮箱进行注册的话,就采用以下这种方式,提前收集用户真实QQ号及昵称,存放在本地txt或者CSV文件(CSV文件默认逗号隔开),如下图所示:
2)线程组右键添加-->配置元件-->CSV Data Set Config,如下图所示:
关键参数说明:
Filename:需要传入文件的完整路径。我的文件位于C盘目录下,文件名为users.txt。
File encoding:参数文件的编码格式。可以不填。
Variable Names:对应参数文件中每列的变量名,也是你要引用到请求中的参数变量名。这里第一列是用户名、第二列是密码、第三列是邮箱。变量名可以自定义。
igonre first line(only used if Variable Names is not empty):当 CSV 文件中首行设置了变量名时,该项设为 true,此时每次请求读取文件时会自动忽略首行,直接读取第二行的数据。若首行未设置,则选择False
Delimiter:文件中的分隔符,默认英文的逗号分隔。所以注意txt文档中每行多个参数用英文逗号分隔。
Recycle on EOF: 设置为True后,允许重头循环取值;为False,当读取文件到结尾时,停止读取文件
Stop Thread EOF: 当Recycle on EOF为false并且Stop Thread EOF 为true,则读完csv文件中的记录后,停止运行,线程数及执行次数无效。
Sharing Mode:共享模式。All threads:所有线程,所有线程循环取值,线程1取第一行,线程2取下一行;Current thread group:当前线程组,各个线程组分别循环取值;Current thread:当前线程,该测试计划内的所有线程都取第一行。
备注说明:这里我用通俗的语言大概讲一下Recycle on EOF与Stop thread on EOF结果的关联
Recycle on EOF :到了文件尾处,是否循环读取参数,选项:true和false
Stop thread on EOF:到了文件尾处,是否停止线程,选项:true和false
当Recycle on EOF 选择true时,Stop thread on EOF选择true和false无任何意义,通俗的讲,在前面控制了不停的循环读取,后面再来让stop或run没有任何意义
当Recycle on EOF 选择flase时,Stop thread on EOF选择true,线程4个,参数3个,那么只会请求3次
当Recycle on EOF 选择flase时,Stop thread on EOF选择flase,线程4个,参数3个,那么会请求4次,但第4次没有参数可取,不让循环,所以第4次请求错误
3)使用CSV Data Set Config中定义好
a、直接参数化引用,如下图所示:
b、通过函数助手进行参数化引用,如下图所示:
4)设置线程组中线程数为3,执行后,输出如下结果:成功,如下图所示:
8.4.3.4.小结
1.在文件中输入变量的值时,尤其是.txt和.bat文件中的变量值之间要用英文的逗号隔开。 2.变量值中有中文时,要在后边勾选utf-8。 如果报错,请求不成功,注意检查是不是这两点没有注意到。
版权声明
本文仅代表作者观点,不代表蜻蜓百科-做你身边的百科发动机立场。
本文系作者授权蜻蜓百科-做你身边的百科发动机发表,未经许可,不得转载。