三、压力测试
1. 性能测试 vs 压力测试
性能测试(Performance Test)主要测试系统是否满足性能要求,同时可能为了保留系统的扩展空间而进行的一些稍稍超过“正常”范围的测试,比如:当前系统使用用户100人,可能未来人数会增多到300人,所以要让系统能够在300人情况下正常运行。
压力测试(Stress Test)是测试在一定的负载下系统长时间运行的稳定性。压力测试尤其关注大业务量情况下长时间运行的系统性能变化,如:是否反应变慢、是否会内存泄漏导致系统逐渐崩溃、是否能恢复。
通俗地讲,压力测试是性能测试的一部分,但它们有所区别:
- 性能测试是验证应用系统满足性能需求;
- 压力测试更加“暴力”,它是为了发现在什么条件下应用系统的性能变得不可接受,是找到极限值。
2. 压力测试的步骤
2.1 明确测试目标
- 确定存量数据的规模:一般会要求制造出3~5年的存量数据;
- 确定需要进行压力测试的业务:一般是用户使用最频繁,或者业务操作复杂的业务;
- 确定操作用户的的数量、各类操作用户的比例;
- 确定峰值业务量的要求:一般是1个小时内最多要处理的笔数;
- 确定对交易类业务响应时间的要求:如在峰值情况下,单笔业务的处理时间小于2秒;
- 确定对于批量类业务响应时间的要求:如进行日终、月终、年终的处理时间,与外系统间批量数据传输的时间。
2.2 构建压力测试场景
为了进行压力测试的技术准备,需要阅读如下资料:
- 系统概要设计:了解系统技术架构,确定测试方法;
- 操作手册:了解系统使用过程;
- 程序/接口设计文档:如果是自己团队开发的;
- 分析http交互过程:如果是别人家的程序。
为了开发压力测试脚本需要:
- 准备测试环境,压力测试一般要求环境配置较高,最好与生产环境一致或者接近;
- 参数化脚本;
- 脚本回放,验证脚本是否可以成功的执行。
2.3 执行压力测试:
- 单用户运行压力测试场景;
- 多用户运行测试场景,查看系统资源消耗等
- 阅读压力测试报告,开始调优工作。
3. 压力测试关键指标
压力测试结束后会产生一个测试报告,报告中应该至少包含如下的指标:
- 样本(Samples):表示测试中一共发出了多少个请求,如果模拟10个用户,每个用户迭代10次,那么样本总数就是100;
- 平均值(Average):平均响应时间;
- 中位数(Median):50%用户的响应时间;
- 90%百分位(90% Line):90%用户的响应时间;
- 95%百分位(95% Line):95%用户的响应时间;
- 99%百分位(99% Line):99%用户的响应时间;
- 最小值(Min):最小响应时间;
- 最大值(Max):最大响应时间;
- 异常 %(Error %):本次测试中出现请求错误的数量/请求的总数;
- 吞吐量(Throughput):默认情况下表示每秒完成的请求数;
- 接收(Received) KB/sec:每秒从接收到的数据量;
- 发送(Sent) KB/sec:每秒发送给服务器端的数据量。
明白如上测试指标的含义,可以帮助我们读懂测试报告,分析性能瓶颈,进而提供优化方向。
4. 压力测试工具JMeter
Apache JMeter是Apache组织开发的基于Java的压力测试工具。其实有很多压力测试工具,选择jmeter的主要原因是开源、免费,而且易用、足够用。
下载及安装方法:
- 注意:jmeter依赖java运行,因此要先安装jdk。
- 打开浏览器,输入网址“https://jmeter.apache.org/”;
- 在页面的左侧菜单中,点击“Download Releases”链接;
- 在下载页面,找到类似“apcahe-jmeer-5.x.x.zip”的链接,然后点击开始下载;
- 下载完成后,把文件解压到某个盘符下的“apcahe-jmeer-5.x.x”目录中;
- 进入子目录“bin”,双击“jmeter.bat”即可运行程序。
5. 压力测试实战
我用“携程网站查询航班”的功能为例,给大家演示如何使用“浏览器调试+jmeter”进行压力测试。
6. 压力测试小结
如果是对我们自己开发的应用程序进行测试,那么在构建好测试参数后,可以逐步增加测试并发量,进行多轮次的压力测试,直到关键测试指标值达到不可接受的程度,那么就得到了应用系统的性能上限。
本章节只是对使用jmeter进行压力测试的入门,jmeter本身还提供了更多的功能,详情可参考官方的用户手册。