性能测试七种常用方法,以及四大应用领域

常用的七种性能测试方法

根据实际项目经验可以分为以下七种,接着我们来详述每一种。

后端性能测试

其实我们平时听到的性能测试大多指后端性能测试,也就是服务器性能测试。是通过性能测试工具模拟大量的并发用户请求,然后获取系统性能的各项指标,并且验证各项指标是否符合预期的性能需求的测试手段。

这里的性能指标,除了包括并发用户数、响应时间和系统吞吐量外,还应该包括各类资源的使用率,比如系统级别的 CPU 占用率、内存使用率、磁盘 I/O 和网络 I/O 等,再比如应用级别以及 JVM 级别的各类资源使用率指标等。

由于需要模拟的并发用户数,通常在“几百”到“几百万”的数量级,所以性能测试工具,一定不是基于 GUI 的,而是要采用基于协议的模拟方式,也就是去模拟用户在 GUI 操作的过程中实际向后端服务发起的请求。这样才能模拟很高的并发用户数,尽可能地模拟出真实的使用场景,这也是现在所有后端性能测试工具所采用的方法。

根据应用领域的不同,后端性能测试的场景设计主要包括以下两种方式:

  • 基于性能需求目标的测试验证
  • 探索系统的容量,并验证系统容量的可扩展性
前端性能测试

前端的性能测试并美哟一个严格的定义和标准,通常前端性能关注的是浏览器端的页面渲染时间、资源加载顺序、请求数量、前端缓存使用情况、资源压缩等内容,希望借此找到页面加载过程中比较耗时的操作和资源,然后进行有针对性的优化,最终达到优化终端用户在浏览器端使用体验的目的。

可以采用雅虎(Yahoo)前端团队总结的 7 大类 35 条前端优化规则,这里列出了其中几个最典型也是最重要的规则。

  • 减少 HTTP 请求次数: http 请求数量越多,执行过程耗时就越长,所以可以采用合并多个图片到一个图片文件的方法来减少 http 请求次数,也可以采用将多个脚本文件合并成单一文件的方式减少 http 请求次数;
  • 减少 DNS 查询次数: DNS 的作用是将 URL 转化为实际服务器主机 IP 地址,实现原理是分级查找,查找过程需要花费 20-100 ms 的时间,所以一方卖弄要加快单次查找时间,另一方面也要减少一个页面中资源使用了多个不同域的情况;
  • 避免页面跳转: 页面跳转相当于又打卡一个新页面,耗费的时间就会比较长,所以要尽量避免使用页面跳转;
  • 使用内容分发网络(CDN): 使用 CDN 相当于对静态内容做了缓存,并把缓存内容放在网络供应商(ISP)的机房,用户根据就近原则到 ISP 机房获取这些被缓存了的静态资源,可以提高性能。
  • Gzip 压缩传输文件: 压缩可以帮助减少传输文件的大小,进而可以从网络传输时间的曾main来减少响应时间;
代码级性能测试

指在单元测试阶段就对代码的时间性能和空间性能进行必要的测试和评估,以防止底层代码的效率问题在项目后期才被发现的尴尬。

比如这个场景:系统级别的性能测试发现一个操作的响应时间很长,然后你要花费很多时间去逐级排查,最后却发现罪魁祸首是代码中某个实现低效的底层算法。这种自上而下的逐级排查定位的方法,效率通常都很低,代价也很高。

所以,我们就需要在项目早期,对一些关键算法进行代码级别的性能测试,以防止此类在代码层面就可以被发现的性能问题,遗留到最后的系统性能测试阶段才被发现。

但是,从实际执行的层面来讲,代码级性能测试并不存在严格意义上的测试工具,通常的做法是:改造现有的单元测试框架。最常使用的改造方法是:

  • 将原本只会执行一次的单元测试用例连续执行 n 次,这个 n 的取值范围通常 2000~5000;
  • 统计执行 n 次的平均时间。如果这个平均时间比较长(也就是单次函数调用时间比较长)的话,比如已经达到了秒级,那么通常情况下这个被测函数的实现逻辑一定需要优化。
    这里之所以采用执行 n 次的方式,是因为函数执行时间往往是毫秒级的,单次执行的误差会比较大,所以采用多次执行取平均值的做法。
压力测试

通常指的是后端压力测试,一般采用后端性能测试的方法,不断对系统施加压力,并验证系统化处于或长期处于临界饱和阶段的稳定性以及性能指标,并试图找到系统处于临界状态时的主要瓶颈点。所以,压力测试往往被用于系统容量规划的测试。

还有些情况,在执行压力测试时,我们还会故意在临界饱和状态的基础上继续施加压力,直至系统完全瘫痪,观察这个期间系统的行为;然后,逐渐减小压力,观察瘫痪的系统是否可以自愈。

配置测试

配置测试,主要用于观察系统在不同配置下的性能表现,通常使用后端性能测试的方法:

  • 通过性能基准测试(Performance Benchmark)建立性能基线(Performance Baseline);
  • 在此基础上,调整配置;
  • 基于同样的性能基准测试,观察不同配置条件下系统性能的差异,根本目的是要找到特定压力模式下的最佳配置。

另外,配置”是一个广义配置的概念,包含了以下多个层面的配置:宿主操作系统的配置;应用服务器的配置;数据库的配置;JVM 的配置;网络环境的配置 等。

并发测试

同一时间,同时调用后端服务,期间观察被调用服务在并发情况下的行为表现,旨在发现诸如资源竞争、资源死锁之类的问题。

说到并发测试就需要聊聊源于 HP 的 LoadRunner 的”集合点并发“的概念了。它是什么呢?

假设我们希望后端调用的并发数是 100,如果直接设定 100 个并发用户是无法达到这个目标的,因为这 100 个并发用户会各自执行各自的操作,你无法控制某一个确定的时间点上后端服务的并发数量。

为了达到准确控制后端服务并发数的目的,我们需要让某些并发用户到达该集合点时,先处于等待状态,直到参与该集合的全部并发用户都到达时,再一起向后端服务发起请求。简单地说,就是先到的并发用户要等着,等所有并发用户都到了以后,再集中向后端服务发起请求。

比如,当要求的集合点并发数是 100 时,那么前 99 个到达的用户都会等在那里,直到第 100 个用户到了,才集中向后端服务发起请求。当然,实际达到服务器的并发请求数,还会因为网络延迟等原因小于 100。

所以,在实际项目中,可以在要求的并发数上进行适当放大,比如要求的并发数是 100,那我们集合点并发数可以设置为 120。

可靠性测试

是验证系统在常规负载模式下长期运行的稳定性。可能不同公司的叫法不同,但其本质就是通过长时间模拟真实的系统负载来发现系统潜在的内存泄漏、链接池回收等问题。

由于真实环境下的实际负载,会有高峰和低谷的交替变化(比如,对于企业级应用,白天通常是高峰时段,而晚上则是低峰时段),所以为了尽可能地模拟出真实的负载情况,我们会每 12 小时模拟一个高峰负载,两个高峰负载中间会模拟一个低峰负载,依次循环 3-7 天,形成一个类似于“波浪形”的系统测试负载曲线。

然后,用这个“波浪形”的测试负载模拟真实的系统负载,完成可靠性测试。同样地,可靠性测试也会持续 3-7 天。

聊完了常用性能测试方法的种类后,我们再来简单看一下性能测试的四大应用领域,以及每个应用领域都会使用哪些性能测试方法。

性能测试的四大应用领域

不同的性能测试方法适用于不同的应用领域去解决不同的问题,这里“不同的应用领域”主要包括能力验证、能力规划、性能调优、缺陷发现这四大方面。每个应用领域可以根据自身特点,选择合适的测试方法。

能力验证

能力验证是最常用,也是最容易理解的性能测试的应用领域,主要是验证“某系统能否在 A 条件下具有 B 能力”,通常要求在明确的软硬件环境下,根据明确的系统性能需求设计测试方案和用例。

能力验证这个领域最常使用的测试方法,包括后端性能测试、压力测试和可靠性测试。

能力规划

能力规划关注的是,如何才能使系统达到要求的性能和容量。通常情况下,会采用探索性测试的方式来了解系统的能力。

能力规划解决的问题,主要包括以下几个方面:

  • 能否支持未来一段时间内的用户增长;
  • 应该如何调整系统配置,使系统能够满足不断增长的用户数需求;
  • 应用集群的可扩展性验证,以及寻找集群扩展的瓶颈点;
  • 数据库集群的可扩展性验证;
  • 缓存集群的可扩展性验证;
    能力规划最常使用的测试方法,主要有后端性能测试、压力测试、配置测试和可靠性测试。
性能调优

其实是性能测试的延伸。性能调优主要解决性能测试过程中发现的性能瓶颈的问题,通常会涉及多个层面的调整,包括硬件设备选型、操作系统配置、应用系统配置、数据库配置和应用代码实现的优化等等。

这个领域最常用的测试方法,涵盖了上面介绍的七大类测试方法,即后端性能测试、前端性能测试、代码级性能测试、压力测试、配置测试、并发测试和可靠性测试。

缺陷发现

是一个比较直接的应用领域,通过性能测试的各种方法来发现诸如内存泄露、资源竞争、不合理的线程锁和死锁等问题。

缺陷发现,最常用的测试方法主要有并发测试、压力测试、后端性能测试和代码级性能测试。

小结

性能测试七种常用方法,以及四大应用领域