1.什么是性能
性能测试,一种非功能测试技术,用于根据不同工作负载下的响应性和稳定性确定系统参数。 性能测试度量系统的质量属性,如响应速度、可伸缩性、可靠性和资源使用情况。
性能测试跟功能测试的区别
性能测试 | 功能测试 |
---|---|
验证系统在不同负载下的表现 | 验证是否符合产品需求定义的功能 |
通过自动化功能实现 | 可以通过人工或自动化测试 |
需要模拟多用户同时使用情况 | 一个用户操作 |
需要与客户、测试、开发、BDA和运维team合作 | 需要与客户、测试和开发合作 |
测试环境需要接近生产环境的软硬件配置 | 不需要一定接近生产环境 |
不同角色关注的性能是不一样的,进行性能测试就需要在各角色其关注的维度进行分析测试。
用户视角:
操作的响应速度,页面数据的加载速度,提交数据的响应,是否存在崩溃。
老板视角:
主要关心产品的成本跟收入,用户的满意度。
运维视角:
关心资源的(如CPU、内存、DB)利用率,服务的稳定性(7*24H),可拓展性,系统的容量是多少。
开发视角:
关心架构的设计与业务是否匹配(技术选型,如使用哪种DB、缓存、消息组件等),数据库的设计,代码(逻辑性能问题,内存是否是否合理,线程同步操作是否合理,是否存在不合理资源竞争,是否有更高效的算法或数据结构)
测试视角:
结合上面角色视角的需求,具体化为各种类型跟各种指标。如业务性能指标(QPS,响应时间,成功率等),资源指标,支持最大并发,最优并发,稳定性等。
2.性能测试的好处跟目的
验证Feature是否符合性能要求,测量响应速度,提高用户满意度等。这些都会直接或间接地影响公司产品的收入。
性能测试的好处.png
性能测试的最终目的是为了最大限度的满足用户的需求,通常要达成以下目标:
- 性能评估:测试中评估系统的QPS、响应时间、成功率等
- 寻找系统瓶颈,进行系统调优
- 检测软件中的问题
- 验证稳定性和可靠性
3. 常见性能问题
- 长加载时间
- 长响应时间
- 可拓展性差
- 性能瓶颈
记得工作中遇见过高流量的系统直接被压垮,CPU内存资源不够,DB连接池爆满,出现慢查询导致整个系统的响应时间变长,Redis缓存穿透把DB压垮,业务暴增消息消费系统没有及时处理消息等各种花样的性能问题。
4.性能测试的组成
以中小型电商网站为例,性能基本组成会经过多个路径,包括
- 客户端(Web、移动端、小程序)性能
- DNS性能
- 负载均衡服务性能
- Nginx集群性能、折损率
- CDN缓存性能(回源率、穿透率)
- 应用服务器性能
- DB性能(Mysql/Redis/Memcache)
5. 关注指标
测试关注指标一般可分为业务指标、资源指标、应用指标、前端指标。
- 业务指标:如并发用户数、TPS(系统每秒处理事务数)、成功率、响应时间。
- 资源指标:如CPU资源利用率、内存利用率、I/O、内核参数(信号量、打开文件数)等。
- 应用指标:如空闲线程数、数据库连接数、GC/FULL GC次数、函数耗时等。
- 前端指标:如页面加载时间、网络时间(DNS、连接时间、传输时间等)。
这些指标一般都会使用一些有图形界面的监控工具搭配使用,可以清晰直观地查看具体数值及趋势变化。
6. 性能测试类型
性能的压力模型
TPS变化.png responder time变化.png
为得到性能关注的指标,基本分为以下性能测试类型:
测试类型.png-
容量测试(Capacity testing):容量测试(或者叫体积测试,Volume Testing)是用于确定一个单位容量能够支持的最大负载。一般如新系统上线会做容量测试,评估系统能承受多大压力。
-
负载测试(Load Testing):负载测试用于验证被测试系统或者程序是否可以处理预期的负载流量,并验证正常和峰值负载条件下的系统和程序行为。负载测试的定义有时太广泛和模糊,很多其他测试都可以看作是负载测试的一种,比如容量测试,也是一种负载测试。
-
可扩展性测试(Scalability Testing):可扩展性(或者叫可伸缩性)测试用于确定一个程序和系统的非功能性特征能不能在变化的环境里合理扩展。这里的环境变化包括系统环境的变化、负载量的大小、请求的多样性、数据量的大小等。
-
尖峰测试(Spike Testing):尖峰测试用于确定系统在负载(比如用户请求数)突然变化时的系统行为。这种测试是通过突然增加或减少由用户产生的负载来观察系统的行为。测试的目标是确定性能在这样的场景下是否会受损,系统是否会失败,或者是否能够处理负载的显著变化。尖峰测试的核心是负载变化的突然性,所以也算是一种压力测试。或如常见的电商秒杀活动上线前也会做压力测试及尖峰测试来评估系统的行为。
-
浸泡测试(Soak Testing):浸泡测试有时也叫耐力测试(Endurance Testing 或者耐久测试),是一种非功能性测试。耐力测试是长时间测试具有预期负载量的系统,以验证系统的行为是否正常。
-
压力测试(Stress Testing): 压力测试也是一种负载测试,不过它偏重的是在负载增加到超过系统设计预期后观察和验证系统的行为。
还有其他如瓶颈测试(Bottleneck Testing),断点测试(Breakpoint Testing)、基准测试(Benchmark Testing)等。
7. 常用性能测试工具
- ApacheBench: 一个轻量级工具。主要用于 HTTP 协议的性能测试。非常简单快捷。不支持场景化测试。
- JMeter : Apache提供的完全开源的性能测试工具,用于模拟服务器,服务器组,网络或对象上的繁重负载,以测试其强度或分析不同负载类型下的总体性能,支持分布式运行。因为开源免费,使用跟熟悉的人较多,较多公司都会选择Jmeter。
- LoadRunner: 是一个性能测试工具,但是是闭源收费的软件,且授权费用高昂。使用也较为复杂,而且该工具体积比较大。
- Locust : 易于使用的分布式用户负载测试工具。它旨在对网站进行负载测试,并确定系统可以处理多少个并发用户。非常易用。很方便地基于Python进行脚本扩展和业务请求实现。完全基于事件驱动,所以不受进程和线程的限制,可以支持发起更高的并发数请求。可以分布式发起并发请求。
- nGrinder: 是一个用于在多台机器上运行用 jython(在 JVM 上运行的 python)编写的测试脚本的应用程序。它的内部引擎是基于 Grinder。nGrinder 分别用 controler 和 agent 将 Grinder 的 controler 和 agent 包装起来,并扩展了支持多个并发测试的特性。nGrinder是一个压力测试的平台,使您可以同时执行脚本创建,测试执行,监视和结果报告生成器。提供了进行压力测试的简便方法。本人之前所在的公司就选择了nGrinder作为压测功能。
具体选择哪个作为压测的工具可以结合具体业务需求跟压测人员掌握的工具程度进行评估。
8. 性能测试流程
image.png关键步骤:
- 性能需求分析:性能测试需要跟运营、产品、开发、运维等相关人员进行沟通,进行项目分析,确认业务需求对应的测试目标,如是进行容量测试,还是稳定测试,还是尖峰测试,然后建立性能测试数据模型,并将其转化为可衡量的具体性能指标。
- 性能测试case设计:根据业务场景确定流量模型(流量模型要尽可能的接近生产,如我之前所在的电商公司,在大促的时候商品相关的系统各个域的流量占比,各个域的各个接口流量分布等均需要参考历史数据,结合运营规划等来决定),编写脚本,准备测试环境,监控工具,构造测试数据,环境调试等。
- 执行性能测试:包括执行测试用例模型,以及监控测试过程。
- 结果分析与调优: 对性能测试结果的各个性能指标进行分析并完成性能测试报告,测试报告一般都有一些模板这个可以参考网上的例子。
9. 小结
性能测试是一项工程,从中涉及到性能的需求分析,性能测试的理论基础,工具的使用,系统网络设备软硬件的分析,涉及的技术面宽广以及需要多方沟通协助,路漫漫其修远兮。
参考文章:
https://blog.csdn.net/zhanglong_4444/article/details/105613843
https://www.jianshu.com/p/8ba22102381d
https://zhuanlan.zhihu.com/p/94064601
网友评论