什么是 JMeter
Apache JMeter是Apache组织开发的基于Java的压力测试工具。用于对软件做压力测试,它最初被设计用于Web应用测 试但后来扩展到其他测试领域。 它可以用于测试静态和动态资源例如静态文件、Java 小服务程序、CGI 脚本、Java 对象、 数据库, FTP 服务器, 等等。JMeter 可以用于对服务器、网络或对象模拟巨大的负载,来在不同压力类别下测试它们的 强度和分析整体性能。另外,JMeter能够对应用程序做功能/回归测试,通过创建带有断言的脚本来验证你的程序返回了你期望的结果。
搭建环境
因为 JMeter 是基于 Java 开发的,所以首先要用 Java 环境。Java 的环境配置这里就不展开了。
下载 JMeter 5.0 (Requires Java 8 or 9.) / Binaries /
apache-jmeter-5.0.tgz
下载完成后解压,进入 bin 目录,运行命令 sh jmeter
即可打开图形页面。
顺便提一下,从上面的命令可以看出,jmeter 文件本质上是一个 shell 脚本,我们使用文本编辑器打开可以看到,其最后执行了 "$JAVA_HOME/bin/java" $ARGS $JVM_ARGS $JMETER_OPTS -jar "$PRGDIR/ApacheJMeter.jar" "$@"
,所以该脚本的作用只是一个预置的配置文件,真正打开的是 ApacheJMeter.jar 这个 jar 包。
接下来通过一个简单的测试项目来进一步了解一下 JMeter。
首先不深入到具体的细节,先宏观了解一下 JMeter 里定义任务的结构。
目录结构
TestPlan
最外层的 Test Plan(测试计划),右键可以看到可添加的配置:
可以看到 TestPlan 里包含了 ThreadGroup(线程组)、Config(用户自定义的配置)。
另外还可以添加例如 Listener(测试结果报告等),以及我还没接触过的,但是从名字上看可能是轮询/计时器、以及对测试任务的前置后置处理等等,这些也是其他几种目录都可以添加的功能。
ThreadGroup
线程组里可以添加 Sampler(我将其理解为具体的测试用例,比如下面会介绍到的 HTTP 测试,就是添加 HTTP request Sampler)。一个线程组可以包含多个测试用例,并且可以自定义(同时运行的)线程数量、运行间隔等,这些配置也是压力/疲劳测试必不可少的组成部分。
Sampler
具体的用例里则可以添加断言,来获取期望测试结果等。
接下来在具体的业务中上手试一下 JMeter 吧~
HTTP 接口测试
线程组配置
-
添加一个线程组
右键 TestPlan,如下添加线程组简单解释一下各个参数:
- Number of Thread
线程(用户)的数量 - ramp-up period(in second)
使用多长的时间启动所有线程(比如 10 个线程,这里填了 10 秒,即每秒启动一个线程),默认为 0,即立即启动所以线程 - Loop count
循环次数(勾选 Forever 即为无限循环)
- Number of Thread
-
在线程组中添加一个用例(http 请求)
配置 http 接口
-
添加结果报告
Result Tree
中可以看到每次运行的请求、响应的数据等。
Summary Report
可以查看运行结果报告,包括平均响应时间(Avarage)、最快响应时间(Min)、最大响应时间(Max)、错误率、吞吐量(Throughput)等等
以上配置后,点击工具栏的绿色运行按钮,可以在结果报告中看到用例的执行结果了。
以上的配置,请求中携带的参数是我们预先配置好的,但是一般登录接口中携带的参数,例如用户名、密码等不可能是固定的。那么如何配置多个用户的参数,然后在运行测试时自动填入呢?
多用户配置
首先创建一个用户列表的文本,内容如:
15659828000,123456
15654545454,123456
每行都代表了一位用户,用户名、密码以英文逗号分隔。然后在 JMeter 中生成函数读取该文本的内容。点击如下图圈中的图标打开函数助手:
Choose a function
选择 --CSVRead,第一行 CSV file to get values from | *alias
后面填入用户账号列表的文件地址,第二行 Column number of CSV file | next | *alias
后面先填 0(即获取每行的第一个参数,即用户名),然后点击下方的按钮 Generate & copy to clipboard
,就会看到按钮左侧生成了一串形如 ${__CSVRead(/Users/zengyazhi/Downloads/apache-jmeter-5.0/backups/users.txt,0)}
的函数(并且已自动复制到剪贴板),下方也显示出了该函数所取到的值。接下来只要在 http 接口配置的地方填入该函数即可。
需要注意的是:该函数看起来很好理解,无非就是去读取某个文件里的第几个值,我在测试的时候只生成了一次,后续密码的那栏我直接将 0 改成 1,结果却读不到对应的值。所以记得有几个值就要使用函数助手生成几次。
另外还有人提到了使用 badboy
来配置多用户。
使用 badboy 录制 Jmeter 脚本,badboy 录制的脚本比 Jmeter 自己运行的 Http 请求要有更多的参数,比如图形验证码、服务器名称或 IP 会自动加载,无需手写。另外自动加载 Http Cookie 管理器、用户定义的变量、HTTP信息头管理器,以及 Http 请求。
除此之外,Badboy 还可以模拟浏览器操作,记录操作脚本,再配合 JMeter 做压测等等,这里就不展开了。
更多介绍见官网文档 Badboy software
全局变量配置
Http 接口一般都存在环境的区别,例如线下环境、生产环境等,如果直接把对应的 host 直接填在上述的 http 配置中,当需要切换环境时岂不是要改到怀疑人生?所以配置全局变量是必不可少的。
也很简单,添加对应的 key-value 即可。例如定义了 host = "dev.test.cn",在配置 http 接口时,域名一栏填入 ${host} 就可以了。
以上只是简单上手试用下 JMeter,更多功能可能要在对应的业务中才会接触到。
差不多就是这样啦。nana 你在看吗? ღ( ´・ᴗ・` )比心~