性能测试教程
什么是性能测试?
性能测试是一种软件测试过程,用于测试软件应用程序在特定工作负载下的速度、响应时间、稳定性、可靠性、可扩展性和资源使用情况。性能测试的主要目的是识别和消除软件应用程序中的性能瓶颈。它是性能工程的一个子集,也被称为“性能测试”。
性能测试的重点是检查软件程序的
- 速度 – 确定应用程序是否快速响应
- 可扩展性 – 确定软件应用程序可以处理的最大用户负载。
- 稳定性 – 确定应用程序在不同负载下是否稳定
为什么要做性能测试?
软件系统支持的功能和特性并非唯一关注点。软件应用程序的性能,如其响应时间、可靠性、资源使用和可扩展性,都非常重要。性能测试的目标不是发现错误,而是消除性能瓶颈。
进行性能测试是为了向利益相关者提供有关其应用程序在速度、稳定性和可扩展性方面的信息。更重要的是,性能测试可以发现产品上市前需要改进的地方。如果没有性能测试,软件可能会出现诸如:多个用户同时使用时运行缓慢、不同操作系统之间不一致以及可用性差等问题。
性能测试将确定其软件在预期工作负载下是否满足速度、可扩展性和稳定性要求。由于不存在或性能测试不佳而导致性能指标差的应用程序推向市场,可能会声誉不佳,并且无法达到预期的销售目标。
此外,任务关键型应用程序,如太空发射程序或救生医疗设备,应该进行性能测试,以确保它们在长时间运行而没有偏差。
根据邓白氏的数据,59% 的财富 500 强公司每周会经历约 1.6 小时的停机时间。考虑到财富 500 强公司平均拥有至少 10,000 名员工,每小时支付 56 美元,那么此类组织的停机时间劳务成本每周将达到 896,000 美元,每年超过 4600 万美元。
Google.com(2013 年 8 月 19 日)仅 5 分钟的停机时间,估计给这家搜索巨头造成了高达 545,000 美元的损失。
据估计,由于最近的亚马逊网络服务中断,公司每秒损失了价值 1100 美元的销售额。
因此,性能测试很重要。为了帮助您完成此过程,请查看此性能测试工具列表。
性能测试的类型
软件测试中主要有六种性能测试类型,如下所述。
- 负载测试 – 检查应用程序在预期用户负载下的执行能力。目标是在软件应用程序上线前识别性能瓶颈。
- 压力测试 – 涉及在极端工作负载下测试应用程序,以查看其如何处理高流量或数据处理。目标是识别应用程序的临界点。
- 耐久性测试 – 旨在确保软件能够长时间处理预期负载。
- 尖峰测试 – 测试软件对用户产生的突然大量负载尖峰的反应。
- 容量测试 – 在容量测试中,大量数据被填充到数据库中,并监控整个软件系统的行为。目标是检查软件应用程序在不同数据库容量下的性能。
- 可伸缩性测试 – 可伸缩性测试的目标是确定软件应用程序在“扩展”以支持用户负载增加方面的有效性。它有助于规划软件系统的容量增加。
常见的性能问题
大多数性能问题都围绕着速度、响应时间、加载时间和糟糕的可扩展性。速度通常是应用程序最重要的属性之一。运行缓慢的应用程序会失去潜在用户。性能测试确保应用程序运行速度足够快,以保持用户的注意力和兴趣。查看以下常见性能问题列表,并注意速度是其中许多问题的常见因素
- 长加载时间 – 加载时间通常是应用程序启动所需的初始时间。这通常应保持在最短。虽然有些应用程序无法在不到一分钟内加载,但如果可能,加载时间应保持在几秒钟以内。
- 响应时间差 – 响应时间是指用户将数据输入应用程序到应用程序对该输入输出响应之间的时间。通常,这应该非常快。同样,如果用户等待太久,他们就会失去兴趣。
- 可伸缩性差 – 当软件产品无法处理预期的用户数量或无法适应足够广泛的用户范围时,它就会出现可伸缩性差的问题。负载测试应该进行,以确保应用程序能够处理预期的用户数量。
- 瓶颈 – 瓶颈是系统中会降低整体系统性能的障碍。瓶颈是指编码错误或硬件问题导致在特定负载下吞吐量下降。瓶颈通常由代码的某个故障部分引起。解决瓶颈问题的关键是找到导致速度变慢的代码部分并尝试在那里修复它。瓶颈通常通过修复运行不佳的进程或添加额外的硬件来解决。一些常见的性能瓶颈是
- CPU 利用率
- 内存利用率
- 网络利用率
- 操作系统限制
- 磁盘使用情况
如何进行性能测试
性能测试所采用的方法可能差异很大,但性能测试的目标保持不变。它可以帮助证明您的软件系统符合某些预定义的性能标准。或者它可以帮助比较两个软件系统的性能。它还可以帮助识别您的软件系统中降低其性能的部分。
以下是如何执行性能测试的一般过程
步骤 1) 确定您的测试环境
了解您的物理测试环境、生产环境以及可用的测试工具。在开始测试过程之前,了解测试中使用的硬件、软件和网络配置的详细信息。这将有助于测试人员创建更有效的测试。它还将有助于识别测试人员在性能测试过程中可能遇到的潜在挑战。
步骤 2) 确定性能验收标准
这包括吞吐量、响应时间和资源分配的目标和限制。还需要识别这些目标和限制之外的项目成功标准。测试人员应该有权设置性能标准和目标,因为项目规范通常不包含足够广泛的性能基准。有时甚至根本没有。如果可能,寻找一个类似的应用程序进行比较是设置性能目标的好方法。
步骤 3) 规划和设计性能测试
确定最终用户之间的使用情况可能如何变化,并识别所有可能用例的关键测试场景。有必要模拟各种最终用户,规划性能测试数据并概述将收集哪些指标。
步骤 4) 配置测试环境
执行前准备测试环境。此外,安排工具和其他资源。
步骤 5) 实施测试设计
根据您的测试设计创建性能测试。
步骤 6) 运行测试
执行并监控测试。
步骤 7) 分析、调整和重新测试
整合、分析并分享测试结果。然后进行微调并再次测试,以查看性能是否有改进或下降。由于每次重新测试的改进通常会越来越小,因此当瓶颈由 CPU 引起时停止。然后您可以考虑增加 CPU 功率的选项。
性能测试指标:监控的参数
性能测试期间监控的基本参数包括
- 处理器使用率 – 处理器执行非空闲线程的时间量。
- 内存使用 – 计算机上可用于进程的物理内存量。
- 磁盘时间 – 磁盘执行读写请求的时间量。
- 带宽 – 显示网络接口每秒使用的比特数。
- 私有字节 – 进程已分配的不能与其他进程共享的字节数。这些用于测量内存泄漏和使用情况。
- 已提交内存 – 已使用的虚拟内存量。
- 内存页/秒 – 为解决硬页错误而写入或从磁盘读取的页数。硬页错误是指从其他地方调用当前工作集之外的代码并从磁盘检索。
- 页错误/秒 – 处理器处理错误页面的总体速率。当进程需要其工作集之外的代码时,再次发生这种情况。
- 每秒 CPU 中断数 – 是处理器每秒接收和处理的平均硬件中断数。
- 磁盘队列长度 – 是在采样间隔内选定磁盘的平均读写请求队列数。
- 网络输出队列长度 – 输出数据包队列的长度(以数据包为单位)。任何超过两个的情况都意味着延迟,需要停止瓶颈。
- 每秒网络总字节数 – 接口上发送和接收字节的速率,包括帧字符。
- 响应时间 – 从用户输入请求到接收到响应的第一个字符的时间。
- 吞吐量 – 计算机或网络每秒接收请求的速率。
- 连接池数量 – 通过连接池满足的用户请求数量。池中连接满足的请求越多,性能越好。
- 最大活动会话数 – 可以同时活动的最大会话数。
- 命中率 – 这与通过缓存数据而不是昂贵的 I/O 操作处理的 SQL 语句数量有关。这是解决瓶颈问题的一个很好的起点。
- 每秒命中数 – 在负载测试的每一秒内,Web 服务器上的命中数。
- 回滚段 – 任何时候可以回滚的数据量。
- 数据库锁 – 需要监控和仔细调整表和数据库的锁定。
- 顶部等待 – 监控这些等待时间以确定在处理从内存中检索数据的速度时可以缩短哪些等待时间
- 线程计数 – 应用程序的健康状况可以通过正在运行和当前活动的线程数来衡量。
- 垃圾回收 – 它与将未使用的内存返回给系统有关。需要监控垃圾回收的效率。
性能测试用例示例
- 测试用例 01:验证当 1000 个用户同时访问网站时,响应时间不超过 4 秒。
- 测试用例 02: 验证在网络连接缓慢的情况下,应用程序在负载下的响应时间是否在可接受范围内
- 测试用例 03: 检查应用程序在崩溃前可以处理的最大用户数量。
- 测试用例 04: 检查同时读/写 500 条记录时数据库的执行时间。
- 测试用例 05: 检查应用程序和数据库服务器在峰值负载条件下的 CPU 和内存使用情况
- 测试用例 06: 验证应用程序在低、正常、中等和重负载条件下的响应时间。
在实际性能测试执行期间,诸如“可接受范围”、“重负载”等模糊术语将替换为具体数字。性能工程师根据业务需求和应用程序的技术格局设置这些数字。
性能测试工具
市场上有各种各样的性能测试工具。您选择的测试工具将取决于许多因素,例如支持的协议类型、许可成本、硬件要求、平台支持等。以下是常用测试工具的列表。
- HP LoadRunner – 是当今市场上最流行的性能测试工具。该工具能够模拟数十万用户,将应用程序置于真实负载下,以确定其在预期负载下的行为。Loadrunner 具有一个虚拟用户生成器,可模拟真实人类用户的操作。
- Jmeter – 用于 Web 和应用服务器负载测试的主要工具之一。
常见问题
结论
在软件工程中,在任何软件产品上市前,性能测试都是必要的。它能确保客户满意度,并保护投资者的投资免受产品失败的影响。性能测试的成本通常可以通过提高客户满意度、忠诚度和保留率来弥补。