一、功能测试与非功能测试
测试不仅仅关乎你的应用「是否能用」,更关乎它在真实条件下「是否好用」。本模块(与 Provar 合作制作)讲解功能测试与非功能测试的区别,理解负载测试(能否承受正常流量?)、压力测试(在哪里崩溃?),以及尖峰测试、可扩展性测试等专门类型。这些是交付规模化可靠应用的关键概念。
两类测试:都必不可少
对应用测试进行分类的一种方式,是分为功能测试(functional testing)与非功能测试(non-functional testing)。简单来说:功能测试检查应用是否做了它该做的事,非功能测试检查它做得好不好。
功能测试验证应用是否满足业务需求、按预期工作。单元测试、集成测试、系统测试都属于看应用功能如何按需求运作的测试类型。
相比之下,非功能测试评估那些与功能不直接相关、但对用户体验至关重要的方面,例如可用性测试与安全测试。
性能测试(Performance Testing)是非功能测试的一种形式。团队进行性能测试,是为了评估应用在各种条件下的行为,最终衡量其效率。
举个例子:一个售票网站需要座位选择、购物车和支付处理正常工作——这些都在功能测试里验证。但网站还需要能同时处理一定数量的用户,并且能在合理的时间内完成必要的操作——这些就通过性能测试来检查。性能测试让团队洞察应用的三个关键方面:
- 可扩展性(Scalability):能否在不牺牲质量的前提下处理额外的工作负载?
- 速度(Speed):响应有多快?
- 稳定性(Stability):在各种工作负载下是否可靠?
软件开发中的性能测试:在敏捷测试象限(Agile Testing Quadrants)中,性能测试属于第四象限——即「面向技术、批判产品的测试」。团队投入精力收集这些信息有以下几个原因:
- 风险缓解:主动的性能测试能在问题暴露给终端用户之前就识别出来。通常问题发现得越早,修复越容易。
- 用户体验:「能用的应用」与「好用的应用」对终端用户而言天差地别。优秀的用户体验能成为公司的竞争优势。
- 品牌声誉:网站性能糟糕的组织会惹恼用户、损害品牌声誉。网站或应用的优异性能则让品牌受益。
- 收入:糟糕的用户体验甚至会导致收入流失——如果网站加载不快、或无法处理一定数量的并发用户,这些用户可能转投竞争对手。
- 可扩展性规划:了解当前容量有助于规划未来容量。今天就了解你的性能,才能在将来成功扩展。
一个功能完美、却在负载下崩溃的应用,仍然是一个坏掉的应用。功能测试通过只说明「功能可用」,非功能测试通过才说明「功能在负载下可用」——两者都必须通过,应用才算生产就绪。
二、性能测试的类型
性能测试是一个总括术语。本单元探讨它的主要类型:负载测试(正常条件)、压力测试(崩溃点)、尖峰测试(突发的流量激增),以及可扩展性测试(未来增长规划)。
负载、压力、尖峰与可扩展性测试
性能测试是一个总称,涵盖两大主要类型:负载测试(load testing)和压力测试(stress testing)。这两类又各有更多子类型。
负载测试(Load Testing):对应用施加预期负载,衡量加入该负载带来的影响。目标是验证应用能在正常工作负载下维持高性能运行,这对应应用的日常使用。对于售票网站,负载测试会检查它在消费者正常流量(为不同演出购买座位)下是否仍正常工作。一个连标准负载测试都通不过的应用,还没有准备好发布给终端用户。
冒烟测试(Smoke Testing)是负载测试的一种常见形式——它施加最小负载,确保在进行更高级测试之前满足基线预期。如果冒烟测试失败,就说明存在必须先解决的基础性问题,然后才能去测试更细微的性能领域。
压力测试(Stress Testing):与负载测试类似,区别在于它施加的不是正常负载,而是超出预期负载,把系统推向上限。目标是通过给应用施加极端工作负载来识别崩溃点(breaking points)。例如,压力测试可以揭示应用崩溃前能处理的最大用户数。在售票网站上,这可能是它崩溃、无法再售票之前能处理的用户数。负载测试也许能处理 100 个用户,而压力测试可能发现应用在 1000 个用户时崩溃——如果预期有 2000 个用户,那么这个网站就没准备好应对该工作负载。
尖峰测试(Spike Testing)是压力测试的一种特定类型,它在短时间内制造急剧增加的负载。这与标准压力测试(逐步增加需求以识别最大点)不同。团队进行尖峰测试,是为了判断应用如何处理大量用户同时登录网站的情况——比如热门演唱会的门票开售的那一刻。
其他性能测试类型:负载和压力测试是性能测试的两大主要类型,但还有别的。可扩展性测试(Scalability Testing)用于了解应用未来的成长能力,团队用它衡量应用的未来容量。浸泡测试(Soak Testing),也叫耐久性测试(endurance testing),在较长时间内以正常工作负载检查系统的稳定性,从而监控内存使用、检测可能影响性能的内存泄漏。
下表总结各性能测试类型及它们要回答的关键问题:
| 测试类型 | 要回答的问题 |
|---|---|
| Load(负载) | 应用能处理正常工作负载吗? |
| Smoke(冒烟) | 应用能处理最小工作负载吗? |
| Stress(压力) | 应用的极限在哪里? |
| Spike(尖峰) | 应用如何处理工作负载的急剧增加? |
| Scalability(可扩展性) | 应用未来能扩展吗? |
| Soak(浸泡) | 应用如何处理持续的工作负载? |
选择合适的测试:性能测试不是「一个」测试,而是一套测试套件,每种类型回答关于应用的不同问题——发布前用负载测试(基线)+ 压力测试(极限);基于事件的应用用尖峰测试(激增处理);增长规划用可扩展性测试(未来容量);每次部署都用冒烟测试(最低可用性)。冒烟测试是你最低的门槛——如果它失败,其他都不重要,先解决基础性问题,再逐步测试更苛刻的场景。这种分层方法确保你在正确的层面捕获问题,不会浪费时间对连冒烟测试都通不过的应用做压力测试。
小结:下次你买活动门票时,想想自己在网站上的体验——你可能完成了购买,但网站对你的请求响应合理吗?它能同时处理大量请求吗?如果遇到性能问题,哪些测试可能揭示有用的信息?总而言之,团队需要同时测试应用的功能与非功能方面。审视非功能测试时,探索性能测试,看看应用对终端用户而言到底好不好用;具体选择哪种性能测试,取决于对应用工作负载与条件的预期。



