前言
作为一个服务端开发,个人认为掌握各种测试方法和软件是一项必备的技能。小到单元测试,mock测试,大到集成测试,性能测试,压力测试等等。当然这项能力也是不断在工作当中积累经验才能娴熟驾驭的。关于mock测试之前也写了一篇文章,最近因为工作项目上面刚好碰到了压力测试的相关场景,所以也稍微记录一下。
JMeter
(关于介绍还是可以看看,了解它是什么,解决什么问题)Apache JMeter是Apache组织开发的基于Java的压力测试工具。用于对软件做压力测试,它最初被设计用于Web应用测试,但后来扩展到其他测试领域。 它可以用于测试静态和动态资源,例如静态文件、Java 小服务程序、CGI 脚本、Java 对象、数据库、FTP 服务器, 等等。JMeter 可以用于对服务器、网络或对象模拟巨大的负载,来自不同压力类别下测试它们的强度和分析整体性能。另外,JMeter能够对应用程序做功能/回归测试,通过创建带有断言的脚本来验证你的程序返回了你期望的结果。为了最大限度的灵活性,JMeter允许使用正则表达式创建断言。
简单来说,JMeter就是用java写的一个客户端程序,用它可以在java环境中使用线程来模拟用户,构造各种协议请求,在较小的资源消耗的情况下,伪造大量请求从而对目标服务器发起攻击,形成压力测试的场景。常用测试指标包括qps(每秒钟处理完请求的次数)、tps(每秒钟处理完的事务次数)、rt(响应时间,处理一次请求所需要的平均处理时间)、并发数(系统同时处理的request/事务数)、吞吐量(每秒钟最大能接受的用户访问量,或者每秒钟最大能处理的请求数)等等。
实践
以压测web接口为例,我们使用Jmeter创建一个测试计划,这个类似于工程。JMeter也给我们提供了常用的测试模板,覆盖了大量的测试场景。我们选择Web Test Plan,JMeter会自动为我们创建好HTTP协议模板,包括基本设置(请求地址,端口等等),Cookie管理器,请求头管理器,请求消息体设置,还有返回结果过滤器等等,另外还包括统计数据管理器。
接下来,我们根据接口的定义,在对应的管理器中设置好值,针对具体的url可以自定义请求体,用于在同一基础路径下测试不同的api接口。
关于结果过滤,JMeter也提供了基于正则的匹配过滤机制,支持JSON断言,可以通过简单的配置过滤出想要的返回结果。
设置好这些后,我们可以在线程组中设置我们需要模拟的用户数量。以线程的形式来模拟用户,可以设置用户的数量(统一发起请求),间隔时间,以及循环执行次数等等。
为了调试方便,我们可以先使用一个用户来模拟请求,待所有的参数都设置好,请求可以走通的时候我们在放开用户限制,开启压测。在结果统计报表中,我们可以看到常用的统计数据,包括:并发数,平均响应时间,最大响应时间,最小响应时间,错误率,吞吐量,数据发送速率等等。
接下来,就是不断调整用户数,还有时间间隔等等参数来模拟真实的应用场景,找到系统的最大性能支撑数据。当然是一个参考数据,因为我们很少在真实生产环境来压测,但是以测试环境来估计也是一个较稳妥的办法。
后记
这里只是对JMeter的简单实用做一个总结,关于它的高阶使用还在进一步的探索当中,但是当前也是能解决大部分的应用场景了,以后如果有新的认识在做进一步的总结。