一.性能测试
1.什么是性能测试?
性能测试是一种软件测试类型,主要用于评估软件系统在特定工作负载下的性能表现。它通过模拟实际使用场景,帮助开发团队了解系统在不同条件下的响应时间、吞吐量、资源利用率等关键指标,从而发现性能瓶颈、优化系统性能,并确保软件能够满足用户的需求。
2.性能指标
a.响应时间(Response Time)
-
含义:从用户发起请求到系统返回结果所花费的时间。通常以毫秒(ms)或秒(s)为单位。
-
重要性:响应时间直接影响用户体验。过长的响应时间会导致用户流失,尤其是在对实时性要求较高的场景(如电商交易、在线游戏等)。
-
分类:
-
平均响应时间(Average Response Time):所有请求响应时间的平均值。
-
最大响应时间(Max Response Time):在测试期间记录到的最长响应时间。
-
最小响应时间(Min Response Time):在测试期间记录到的最短响应时间。
-
90%响应时间(90th Percentile Response Time):90%的请求响应时间不超过该值,用于排除极端值的影响。
-
-
影响因素:网络延迟、服务器处理能力、代码效率、数据库查询速度等。
b. 吞吐量(Throughput)
-
含义:系统在单位时间内能够处理的事务数量,通常以每秒事务数(TPS)或每秒页面数(PPS)表示。
-
重要性:吞吐量反映了系统的处理能力。高吞吐量意味着系统能够同时处理更多的用户请求,适合高并发场景。
-
影响因素:服务器性能、网络带宽、数据库性能、代码优化等。
-
应用场景:电商网站、在线支付系统等需要处理大量并发请求的系统。
c. 资源利用率(Resource Utilization)
-
含义:系统运行时对硬件资源的使用情况,包括CPU、内存、磁盘I/O、网络带宽等。
-
重要性:资源利用率直接影响系统的性能和稳定性。过高的资源利用率可能导致系统性能下降甚至崩溃。
-
常见指标:
-
CPU利用率:CPU的繁忙程度,通常以百分比表示(0%~100%)。过高的CPU利用率可能意味着代码效率低下或存在瓶颈。
-
内存利用率:系统占用的内存比例。内存不足可能导致频繁的垃圾回收或系统崩溃。
-
磁盘I/O利用率:磁盘的读写速度和等待时间。高I/O利用率可能表明磁盘性能不足。
-
网络带宽利用率:网络流量的使用情况。带宽不足可能导致响应时间增加。
-
-
优化建议:通过代码优化、增加硬件资源或调整系统配置来降低资源利用率。
d. 并发用户数(Concurrent Users)
-
含义:系统在同一时刻能够支持的用户数量。
-
重要性:并发用户数反映了系统的承载能力。对于高流量的网站或应用,支持高并发是关键需求。
-
影响因素:服务器性能、数据库连接池大小、线程池配置等。
-
测试方法:通过模拟大量用户同时访问系统,观察系统的性能变化。
e. 错误率(Error Rate)
-
含义:在测试期间系统返回错误的比例,通常以百分比表示。
-
重要性:错误率反映了系统的稳定性和可靠性。高错误率可能表明系统存在缺陷或性能瓶颈。
-
常见错误类型:
-
HTTP错误:如404(页面未找到)、500(服务器内部错误)等。
-
事务失败:如数据库事务回滚、超时等。
-
-
优化建议:修复代码中的错误、优化异常处理机制、增加容错能力。
f. 吞吐量饱和点(Throughput Saturation Point)
-
含义:系统吞吐量达到最大值时的负载点。在此点之后,吞吐量不再增加,甚至可能下降。
-
重要性:用于确定系统的最大处理能力。超过饱和点可能导致系统性能急剧下降。
-
测试方法:通过逐步增加负载,观察吞吐量的变化曲线。
g. 资源饱和点(Resource Saturation Point)
-
含义:系统资源(如CPU、内存、磁盘I/O等)达到最大利用率时的负载点。
-
重要性:用于评估系统的资源瓶颈。超过饱和点可能导致系统性能下降甚至崩溃。
-
测试方法:通过监控资源利用率,结合负载测试,确定资源饱和点。
h. 系统恢复时间(Recovery Time)
-
含义:系统在发生故障后恢复正常运行所需的时间。
-
重要性:反映了系统的容错能力和恢复能力。对于关键业务系统,快速恢复是至关重要的。
-
测试方法:通过压力测试或故障注入测试,观察系统从故障中恢复的时间。
i. 事务成功率(Transaction Success Rate)
-
含义:成功完成的事务数量与总事务数量的比例,通常以百分比表示。
-
重要性:反映了系统的可靠性和稳定性。低成功率可能表明系统存在性能问题或逻辑错误。
-
优化建议:优化事务处理逻辑、增加超时设置、优化数据库性能。
j. 页面加载时间(Page Load Time)
-
含义:从用户请求页面到页面完全加载完成的时间。通常以毫秒或秒为单位。
-
重要性:对于Web应用和移动应用,页面加载时间直接影响用户体验。过长的加载时间可能导致用户流失。
-
优化建议:优化前端代码、减少资源文件大小、使用缓存技术等。
二.压测工具JMeter
1.什么是JMeter?
ApacheJMeter ,是一个100%纯Java的开源软件,旨在加载测试功能行为和测量性能。它最初设计用于测试Web应用程序,但后来扩展到其他测试功能。相较于世面上一些其他性能测试工具,Jmeter是为数不多的既好用又开源免费的测试工具。
2.JMeter主要元件
- 测试计划:是使用 JMeter 进行测试的起点,它是其他 JMeter 测试元件的容器。
- 线程组:代表一定数量的用户,它可以用来模拟用户并发发送请求。实际的请求内容在 Sampler 中定义,它被线程组包含。
- 配置元件:维护 Sampler 需要的配置信息,并根据实际的需要修改请求的内容。
- 前置处理器:负责在请求之前工作,常用来修改请求的设置。
- 定时器:负责定义请求之间的延迟间隔。
- 取样器(Sampler):是性能测试中向服务器发送请求,记录响应信息、响应时间的最小单元,如 HTTP Request Sampler、FTP Request Sampler、TCP Request Sampler、JDBC Request Sampler 等,每一种不同类型的 Sampler 可以根据设置的参数向服务器发出不同类型的请求。
- 后置处理器:负责在请求之后工作,常用获取返回的值。
- 断言:用来判断请求响应的结果是否如用户所期望的。
- 监听器:负责收集测试结果,同时确定结果显示的方式。
- 逻辑控制器:可以自定义 JMeter 发送请求的行为逻辑,它与 Sampler 结合使用可以模拟复杂的请求序列。
3.下载安装
修改语言【Options->Choose Language->Chinese(Simplified)】
4.打开
下载后找到 jmeter->bin->jmeter.bat
三.使用|测试案例
1.新建线程组【Test Plan->右键->添加->线程(用户)-线程组】
这里可以配置线程组名称,线程数,准备时长(Ramp-Up Period(in seconds))循环次数,调度器等参数:
1. 线程数:虚拟用户数。一个虚拟用户占用一个进程或线程。设置多少虚拟用户数在这里也就是设置多少个线程数。
2. Ramp-Up Period(in seconds)准备时长:设置的虚拟用户数需要多长时间全部启动。如果线程数为10,准备时长为2,那么需要2秒钟启动10个线程,也就是每秒钟启动5个线程。
3. 循环次数:每个线程发送请求的次数。如果线程数为10,循环次数为100,那么每个线程发送100次请求。总请求数为10*100=1000 。如果勾选了“永远”,那么所有线程会一直发送请求,一到选择停止运行脚本。
4. Delay Thread creation until needed:直到需要时延迟线程的创建。
5. 调度器:设置线程组启动的开始时间和结束时间(配置调度器时,需要勾选循环次数为永远)
持续时间(秒):测试持续时间,会覆盖结束时间
启动延迟(秒):测试延迟启动时间,会覆盖启动时间
启动时间:测试启动时间,启动延迟会覆盖它。当启动时间已过,手动只需测试时当前时间也会覆盖它。
结束时间:测试结束时间,持续时间会覆盖它。
2.新建HTTP请求【线程组->右键->添加->取样器-HTTP请求】
3.添加HTTP请求头【HTTP请求->右键->添加->配置元件->HTTP信息头管理器】
在大多数web系统里,往往都对api接口做了权限认证,而这次测试的系统也不例外,是典型的token机制,如果不在请求头里加上合法的token,那么这个测试是会被拦截的,也就没办法对业务接口进行测试。所以这里需要把请求头中token复制过来(不同系统权限设计不同,我这里是X-Access-Token)。
当然如果是使用cookie机制来实现的权限认证,则需新建一个Cookie管理器,这里就不多赘述了。