性能测试工具——Jmeter使用小结(一)
Apache Jmeter是针对Java的一款性能测试工具,利用该工具可以实现自动化的批量测试和结果聚合,适合做接口压测。今天就来捋一捋软件安装的一些小细节和使用。
一、安装
Jmeter基于JDK,安装之前确保Java环境变量配置无误。在官网下载最新版本解压后,配置环境变量 JMETER_HOME 为安装目录并将 %JMETER_HOME%\bin 添加到Path中。启动安装目录下/bin/jmeter.bat,稍作等待弹出GUI窗口表明安装成功。需要注意命令行窗口和图形界面关闭任意一个另一个都会关闭。
在命令行窗口中会有一段提示:
====================================================================================================== Don't use GUI mode for load testing !, only for Test creation and Test debugging. For load testing, use NON GUI Mode: jmeter -n -t [jmx file] -l [results file] -e -o [Path to web report folder] & increase Java Heap to meet your test requirements: Modify current env variable HEAP="-Xms1g -Xmx1g -XX:MaxMetaspaceSize=256m" in the jmeter batch file Check : https://jmeter.apache.org/usermanual/best-practices.html ======================================================================================================
这一段指的是仅建议用GUI界面进行脚本的创建和测试,如果要运行实际测试,使用命令行执行测试脚本,或编辑jmeter.bat,修改java堆大小相关的参数来满足测试需求。
默认的jmeter GUI使用英语,修改jmeter.properties中 language=zh-CN 可以默认以简体中文启动。
为了方便测试,右键点击jmeter.bat-->发送到桌面快捷方式-->右键快捷方式选择属性-->将目标设置为安装目录\bin\ApacheJMeter.jar,起始位置安装目录\bin,即可建立GUI快捷方式。
二、测试
这里我主要是对接口做压力测试,记录一下过程中遇到的坑和结果分析。
首先建立自己的测试计划。默认的测试计划颜色可能是灰色,此时为禁用状态,右键单击启用否则测试时报错 Error processing org.apache.jmeter.gui.action.Start 。启用后添加线程组,可以配置需要的线程数以及单个线程的循环执行次数,以及线程启动时间Ramp-Up时间。这个时间表示启动全部线程所用时间,为0时表示线程并发,否则线程将以T/N的时间间隔(T为改时间,N为总个数)启动。
接下来是添加具体的任务。这里我添加HTTP请求,填写请求协议、IP、端口号等信息,添加需要的参数值。为了模拟真实情况,请求的参数一般不完全相同,配置方法一般有三种。
- 用户配置变量:右键HTTP请求——添加——配置元件——用户定义的变量,在参数调用处使用${变量名}调用参数。
- 函数生成器:选项中的函数助手对话框(或Ctrl+Shift+F1)可以调用Jmeter提供的函数,常用函数之一是_Random,可以生成范围内随机整数。单纯需要随机变量可以添加——配置原件——随机变量,可以对输出格式和随机数种子进行设置。
- 文件读取:添加——配置元件——CSV数据文件设置,可以将变量存储在CSV表格中,每个变量储存为一列,从文件中按行读取变量并且可以设置循环读取文件直至满足任务需求。
完成任务配置后,添加结果监听器。查看结果树可以对每个线程单词调用结果进行查看,包括请求内容和返回结果,适合进行测试计划的验证;对于压力测试等更多考虑统计性指标的测试,添加聚合报告来查看性能指标。
上图中Label表示请求名,#Samples表示请求次数(线程数*循环次数),Average为平均响应时间,Median、90%Line、95%Line、99%Line分别为对应比例的样本的最长响应时间,Min/Max为总体最小值/最大值,Error%为错误率,Throughput为吞吐量,这里表示为每秒完成的请求数量;Received KB/sec和Sent KB/sec分别表示接收量和发送量的每秒千字节表示。
本次测试的是业务在高并发场景下的运行性能,更侧重于承受上限和平均响应时长,因此没有用到断言。如果有必要,可以添加断言来判断是否获取了期望结果,具体用法等下次实际使用后再做总结。