应用程序的性能测试系列之性能测试简介
我们经常被问到是否有可能对应用程序运行性能测试,以证明它满足其非功能性需求。
在本博客系列中,我们将回答这个问题,向您介绍性能测试,并帮助您开始使用该过程。
第一篇博客文章简要介绍了性能测试,更准确的地说,是压力测试。在后续文章中,我们将介绍为应用程序创建测试所需的技术细节,以及从压力测试的角度来看,哪些内部是相关的。最后,我们讨论了各种压力测试工具,这些工具可帮助您创建和执行测试脚本,并提供了使用JMeter和Gatling这两个广泛使用的开源工具的说明。
在本系列结束时,您应该能够自行执行应用程序的性能测试。
什么是性能测试?
让我们从性能测试的正式定义开始:它是一种非功能测试类型,旨在识别(并在可能的情况下消除)软件中的稳定性、可用性和可伸缩性问题。
性能测试是一个总括性术语,包括可伸缩性、负载、耐久性和压力测试。总之,它们具有验证软件的所有非功能性需求的共同目标。例如,容量测试用于执行容量估计,其中包括评估平稳运行所需的内存 (RAM) 以及部署新应用程序的服务器数量。除其他方法外,通常采用压力测试来估计最低要求。
可伸缩性与压力测试
术语“可伸缩性测试”和“压力测试”通常可以互换使用,因为使用的方法和工具通常是相同的,但每种类型的目的却大不相同。执行可伸缩性测试以确保系统响应时间保持不变,或者随着用户数量的增加而仅略微增加。目标是确定系统的增长(扩展)能力。另一方面,压力测试用于验证系统是否可以支持预期的(低,平均和峰值)压力。这两项测试的结果是有益的,并且可以深入了解系统的容量。
什么是压力测试?
压力测试模拟数百或数千个并发用户来测试系统的性能。它调查指标,例如延迟、CPU 利用率、吞吐量和内存利用率。为了获得有意义的结果,在进行测试之前建立性能参数至关重要。例如,如果您正在研究响应时间,则应首先定义衡量系统实际性能的可接受时间。
为了确保结果既有效又可行,需要测试系统中最关键路径。例如:检查“联系我们”页面的加载和响应时间,不如验证转账操作在不同压力下是否一致地运行在线银行应用程序重要。检查非关键路径不会增加太多价值。
理想情况下,您的测试应基于真实的用户交互或非常了解系统的人的见解。
如何模拟压力
有不同的方法来模拟压力。最简单的方法是分配一组测试人员在 UI 中同时手动测试应用程序。在此方案中,依赖于在通信协议级别重播捕获的用户与系统的交互。
另一种方法是使用市场上可用的众多压力测试工具之一。一些最着名的是LoadRunner、JMeter和Gatling。后两者都有免费版本,两者都包括一个模拟行为记录器工具,该工具通过在浏览器中记录用户与应用程序交互来创建测试脚本。然后执行此脚本以在不同条件下模拟和测试系统上的压力。
虽然压力测试工具通常提供有关响应时间(如最小值、最大值和平均值)的统计报告,以便在测试运行期间准确测量服务器上的资源利用率,但您需要一个探查器。JProfiler是一种流行的选择,可以轻松测量资源利用率。
压力测试过程
通常,压力测试过程涉及以下步骤:
- 确定测试的目的和范围。
- 记录测试脚本。
- 配置录制的测试脚本。
- 设置测试环境。
- 对环境运行测试脚本并收集结果。
- 分析结果
在本博客文章系列中,主要关注步骤 2、3 和 5。
当在测试的应用程序中发现与性能相关的问题时,应对应用程序执行必要的修复(基于测试结果,可能还会进行性能分析),然后再次迭代整个过程。