目录

[翻译] 初探性能测试

什么是性能测试

https://www.guru99.com/images/why_performance_testing.jpg

性能测试是一种软件测试过程,用于测试特定工作负载下软件应用程序的速度、响应时间、稳定性、可靠性、可伸缩性和资源使用情况。性能测试的主要目的是识别和消除软件应用程序中的性能瓶颈。它是性能工程的一个子集,也被称为"Perf Testing"。

性能测试的重点是检查软件程序的以下几个性能:

  • 速度 ——确定应用程序是否快速响应
  • 可伸缩性——确定软件应用程序能够处理的最大用户负载
  • 稳定性 –确定应用程序在变化的负载下是否稳定

为什么要做性能测试

软件系统支持的特性和功能并不是唯一的关注点。软件应用程序的性能,如响应时间、可靠性、资源使用和可伸缩性都很重要。性能测试的目标不是发现 bug,而是消除性能瓶颈。

进行性能测试是为了向涉众提供有关其应用程序的速度、稳定性和可伸缩性方面的信息。更重要的是,性能测试揭示了在产品进入市场之前需要改进的地方。如果没有性能测试,软件很可能会遇到这样的问题:几个用户同时使用时运行缓慢,不同操作系统之间的不一致性以及易用性差。

性能测试将确定他们的软件在预期的工作负载下是否满足速度、可伸缩性和稳定性要求。由于不存在或糟糕的性能测试而将性能指标较差的应用程序发送到市场上,可能会获得坏名声,无法达到预期的销售目标等。

此外,诸如太空发射计划或救生医疗设备等关键任务应用程序应进行性能测试,以确保它们能够长期运行而无偏差。

据 Dunn & Bradstreet 公司统计,59%的财富 500 强公司每周的停机时间估计为 1.6 小时。考虑到拥有至少 1 万名员工的《财富》500 强公司的平均工资是每小时 56 美元,这样的组织的停工部分的劳动成本将是每周 89.6 万美元,换算成每年超过 4600 万美元。

据估计,Google.com(8 月 19 日至 13 日)仅 5 分钟的停机时间就会给这家搜索巨头带来 54.5 万美元的损失。

另外,由于最近一次亚马逊网络服务中断,公司每秒损失了价值 1100 美元的销售额。

鉴于此,性能测试在保障服务可用性等方面真的很重要。

性能测试的类型

负载测试 ——检查应用程序在预期用户负载下的执行能力。目标是在软件应用程序运行之前识别性能瓶颈。

压力测试 ——包括在极端工作负载下测试应用程序,以了解它如何处理高流量或数据处理。目标是识别应用程序的极限。

耐久性测 ——是为了确保软件能够在很长一段时间内处理预期的负载。

峰值测试 ——测试软件对用户产生的突然的负载峰值的反应。

体积测试 ——在大量测试数据被填充到数据库下,监测整个软件系统的行为。目标是检查软件应用程序在不同数据库容量下的性能。

可伸缩性测试——可伸缩性测试的目标是确定软件应用程序在“扩展”以支持用户负载增加方面的有效性。它有助于规划软件系统的容量。

常见的性能问题

大多数性能问题都与速度、响应时间、加载时间和较差的可伸缩性有关。速度通常是应用程序最重要的属性之一。运行缓慢的应用程序将失去潜在的用户。性能测试是为了确保应用运行速度足以吸引用户的注意和兴趣。看看下面的常见性能问题列表,并注意到速度是其中的一个常见因素:

  • 加载时间长——加载时间通常是应用程序启动的初始时间。这通常应该保持在最低限度。虽然有些应用程序不可能在一分钟内完成加载,但加载时间应该尽可能保持在几秒钟以内。

  • 响应时间短——响应时间是从用户向应用程序输入数据到应用程序输出对该输入的响应所花费的时间。一般来说,这应该很快。如果用户等待的时间过长,他们就会失去兴趣。

  • 可伸缩性差——当软件产品不能处理预期的用户数量或不能容纳足够大的用户范围时,它就会受到可伸缩性差的困扰。应该进行负载测试,以确定应用程序能够处理预期的用户数量。

  • 瓶颈-瓶颈是系统中会降低整体系统性能的障碍。瓶颈是编码错误或硬件问题导致在特定负载下吞吐量下降。瓶颈通常是由一个错误的代码部分引起的。修复瓶颈问题的关键是找到导致放缓的代码部分,并尝试修复它。瓶颈通常可以通过修复运行不良的进程或添加额外的硬件来解决。一些常见的性能瓶颈是:

    • CPU 利用率
    • 内存利用率
    • 网络利用率
    • 操作系统限制
    • 磁盘使用情况

性能测试过程

为性能测试所采用的方法可能有很大的不同,但是性能测试的目标是相同的。它可以帮助证明您的软件系统满足某些预先定义的性能标准。或者它可以帮助比较两个软件系统的性能。它还可以帮助识别降低软件系统性能的部分。

下面是关于如何执行性能测试的一般流程:

https://www.guru99.com/images/performance_testing_process.png

  1. 确定您的测试环境 —— 了解您的物理测试环境、生产环境以及可用的测试工具。在开始测试过程之前,请了解测试过程中使用的硬件、软件和网络配置的详细信息。它将帮助测试人员创建更有效的测试。它还将帮助识别测试人员在性能测试过程中可能遇到的挑战。

  2. 确定性能验收标准 —— 这包括吞吐量、响应时间和资源分配的目标和约束。在这些目标和约束之外确定项目成功的标准也是必要的。测试人员应该被授权设置性能标准和目标,因为项目规范通常不会包括足够广泛的性能基准。有时可能根本没有。如果可能,找到一个类似的应用程序进行比较是设置性能目标的好方法。

  3. 计划和设计性能测试 —— 确定最终用户的使用可能如何变化,并确定测试所有可能用例的关键场景。模拟各种终端用户、计划性能测试数据并概述将要收集的度量标准是必要的。

  4. 配置测试环境—— 执行前准备测试环境。同时,安排工具和其他资源。

  5. 执行测试设计 —— 根据测试设计创建性能测试。

  6. 运行测试 – 执行和监视测试。

  7. 分析,调整和重新测试-合并,分析和共享测试结果。然后进行微调并再次测试,看看性能是否有改善或下降。由于每次重新测试的改进通常都会变小,所以当瓶颈是由 CPU 引起时就停止。然后,您可以考虑增加 CPU 功率。

性能测试指标:参数监测

https://www.guru99.com/images/performancetestingparameters.png

在性能测试期间监视的基本参数包括:

  • 处理器使用 (Processor Usage)——处理器执行非空闲线程所花费的时间。
  • 内存使用 (Memory use)——计算机上进程可用的物理内存总量。
  • 磁盘时间 (Disk time)——磁盘忙于执行读或写请求的时间。
  • 带宽 (Bandwidth)——显示一个网络接口每秒使用的比特数。
  • 私有字节数 (Private bytes)——一个进程分配的不能被其他进程共享的字节数。它们用于测量内存泄漏和使用情况。
  • 已提交内存量 (Committed memory)——使用的虚拟内存量。
  • 内存页数/秒 (Memory pages/second)–写入磁盘或从磁盘读取以解决硬页错误的页数。 硬页错误是指从其他位置调用不是来自当前工作集的代码并从磁盘中检索到的代码。
  • 页面故障数/秒 (Page faults/second)—–处理器处理故障页面的总速率。 当流程需要来自其工作集之外的代码时,会再次发生这种情况。
  • CPU 每秒中断数 (CPU interrupts per second)———是一个处理器每秒接收和处理的硬件中断数的平均值。
  • 磁盘队列长度 (Disk queue length)–为平均长度。在采样间隔内对选定磁盘排队的读和写请求的值。
  • 网络输出队列长度 (Network output queue length)——报文输出队列的长度。如果超过两个,就意味着需要停止延误和瓶颈。
  • 网络字节每秒总数 (Network bytes total per second)——在接口上发送和接收的字节的速率,包括分帧字符。
  • 响应时间 (Response time)——从用户输入请求到收到响应的第一个字符的时间。
  • 吞吐量 (Throughput)–计算机或网络每秒接收请求的速率。
  • 连接池的数量 (Amount of connection pooling)–池连接所满足的用户请求的数量。池中的连接满足的请求越多,性能就越好。
  • 最大激活会话数 (Maximum active sessions)–次可以激活的最大会话数。
  • 命中率 (Hit ratios)——这与缓存数据处理 SQL 语句的数量有关,而不是昂贵的 I/O 操作。这是解决瓶颈问题的好起点。
  • 每秒点击次数 (Hits per second)–在负载测试中,每秒钟在 web 服务器上的点击量。
  • 回滚段 (Rollback segment)——在任何时间点都可以回滚的数据量。
  • 数据库锁定 (Database locks)——表和数据库的锁定需要被监视和仔细调优。
  • 顶级等待 (Top waits)——监视以确定在处理从内存检索数据的速度时可以减少哪些等待时间
  • 线程计数 (Thread counts)——应用程序运行状况可以通过编号进行度量。正在运行且当前处于活动状态的线程。
  • 垃圾回收 (Garbage collectio)——它与将未使用的内存返回给系统有关。需要监控垃圾收集的效率。

性能测试案例

  • 当 1000 个用户同时访问网站时,验证响应时间不超过 4 秒。
  • 当网络连接较慢时,验证负载下应用程序的响应时间在可接受的范围内
  • 检查应用程序在崩溃前可以处理的最大用户数。
  • 当同时读写 500 条记录时,请检查数据库执行时间。
  • 检查高峰负载条件下应用程序和数据库服务器的 CPU 和内存使用情况
  • 验证应用程序在低、正常、中等和高负载条件下的响应时间。

在实际的性能测试执行过程中,模糊的术语如可接受范围、重载等被具体的数字所取代。性能工程师根据业务需求和应用程序的技术前景来设置这些数字。

性能测试工具

市场上有各种各样的性能测试工具。您选择的测试工具将取决于许多因素,如支持的协议类型、许可证成本、硬件要求、平台支持等。下面是一些常用的测试工具。

  • LoadNinja 是一个革命性的加载测试的方式的工具。这个基于云的负载测试工具使团队能够记录和即时回放全面的负载测试,无需复杂的动态关联,并在真实的浏览器中大规模运行这些负载测试。团队能够增加测试覆盖率。将负载测试时间减少 60%以上。
  • HP LoadRunner -是当今市场上最流行的性能测试工具。该工具能够模拟成千上万的用户,将应用程序置于真实的负载下,以确定它们在预期负载下的行为。Loadrunner 有一个虚拟用户生成器,可以模拟真人用户的动作。
  • Jmeter ——用于 web 和应用服务器负载测试的主要工具之一。

FAQ

我们应该对哪些应用程序进行性能测试?

性能测试总是只针对基于客户机-服务器的系统。这意味着,任何不是基于客户机-服务器架构的应用程序都不需要性能测试。 例如,微软计算器既不是基于客户机-服务器,也不是运行多个用户;因此,它不是性能测试的候选对象。 https://www.guru99.com/images/blog/Loadrunner_architecture_8.png

性能测试和性能工程的区别是什么

理解性能测试与性能工程的区别具有重要意义。达成以下共识:

  • 性能测试是一门与测试和报告软件应用程序在各种参数下的当前性能有关的学科。
  • 性能工程是为了实现所需的性能而对软件进行测试和调优的过程。这个过程旨在优化最重要的应用性能特征,即用户体验。
  • 从历史上看,测试和调优一直是截然分开的、经常相互竞争的领域。然而,在过去的几年里,一些测试人员和开发人员已经独立合作创建了调优团队。由于这些团队已经取得了巨大的成功,将性能测试与性能调优相结合的概念已经流行起来,现在我们称之为性能工程。

结论

在软件工程中,在任何软件产品上市之前,性能测试都是必要的。它确保了客户的满意度,保护投资者的投资不受产品失败的影响。性能测试的成本通常可以通过提高客户满意度、忠诚度和保留度来弥补。

Refs

Disclaimer

本文仅代表个人观点,与 Thoughtworks 公司无任何关系。


https://cdn.staticaly.com/gh/guzhongren/data-hosting@master/20210819/wechat.ae9zxgscqcg.png