csv 中读取账号密码登录
压测登录接口,通常需要循环读取账号密码,使用 jmeter 处理该需求一般会采用 csv 文件设置来读取账号密码,信息文件(user_info.txt)示例如下:
信息文件中使用英文逗号分割账号、密码,并回车换行
接下来在 jmeter 的 http 请求下,添加配置元件 CSV 数据文件设置,添加完毕后,进行以下配置:
文件名:添加信息文件的路径
文件编码:UTF-8
变量名称:对配置信息文件中数据进行设置变量名,以英文逗号分隔
其他字段可以保持默认值,不进行修复,CSV 数据文件设置示例如下:
http 请求中调用:
使用 ${参数名称},调用配置的值
http 请求从上到下依次读取配置文件的账号信息,读取到最后一个账号后,下一个请求又从头开始读取,依此循环,从而实现登录账号循环调用,模拟多个账号并发登录
响应字段提取与使用
对于一些组合接口,上一个接口的响应数据,会成为下个接口的参数,对于这样的接口场景,需要对响应数据进行提取
响应数据
{
"server_time": 1633746337,
"data": {
"total": 100,
"list": [{
"id": 1,
"name": "xiaohua"
},
{
"id": 2,
"name": "xiaoming"
}
]
},
"success": true
}
提取第一层 server_name:$. server_time
提取第二层 total 值:$. data.total
提取第三层第一个 name 的值,list 是一个数组,第一个 name 在 list[0] 下,所以:$. data.list[0].name
提取 list 数组下所有 name 的值:$. data.list[*].name
详见:Jmeter参数提取——JSON提取器 - 水中雨 - 博客园
JSON 提取器示例:
下一个接口使用该参数:
文件上传
文件上传的接口,比普通的参数请求接口复杂些,需要进行以下配置
HTTP 信息头部管理器中需要对 Content-Type 配置,配置为 multipart/from-data,如图
根据接口实际情况分别添加请求参数和文件内容,请求参数:
文件内容:
文件名称传入本地文件地址,参数名称传入服务端接口规定的参数,MIME 类型根据服务端规定,设置对应的值,这里是 multipart/from-data
linux 命令行压测
在 linux 中使用 jmeter 进行压测,需要先后部署 JDK、Jmeter,并配置环境变量,此处不展开说明。配置完毕后,调用以下命令进行压测:
jmeter -n -t /tmp/perftest/scirpt/test.jmx -l /tmp/perftest/result.jtl -e -o /tmp/perftest/report/client
-n 代表使用非 GUI 方式,执行脚本
-t 代表要执行的脚本路径,需要提前上传到指定目录
-l 代表执行过程中生成的 jtl 文件路径
-e 在测试结束后生成 HTML 报告
-o 生成报告的目录
同样的道理,如果测试脚本中需要传递文件,例如 csv 数据文件、文件上传接口中的文件,都需要提前上传到 linux 服务器中,在 windows 或 macOS 电脑中, GUI 打开 Jmeter,编辑测试脚本,文件路径修改为 linux 服务器对应文件地址,然后保存 jmx 文件,并上传到 linux 服务器中,通过以上命令执行压测脚本
命令行执行压测脚本过程中,控制台中会定时刷新执行情况,如下所示:
默认情况下,每隔 30 秒刷新一次,如果希望刷新频率增高,修改文件
jmeter 目录/bin/jmeter.properties, 查找到字段 summariser.interval,去掉注释,并填写你期望的值,最小值为 6,即每隔 6 秒刷新一次控制台
分布式压测
采用单台机器对目标服务器产生的压力,因为受限于CPU、内存、网络、IO等因素的影响,通常只能模拟几十到几百用户的并发访问。分布式压测是利用多台机器同时向目标服务器产生压力,可以模拟几万到上亿级别用户的并发访问。
分布式压测,是通过一台控制主机,控制多台执行机,同时运行压测脚本,从而达到高并发压测的效果,见下图:
进行分布式测试,需要满足以下条件:
控制机和各执行机上使用相同版本的 JMeter 和 JDK
控制机和各执行机在同一局域网下,防火墙已关闭或已打开正确端口且端口未被占用,杀毒软件关闭
如果测试数据有用到 CSV 或者文件数据,需要将 data 在每台执行机上复制一份,且读取路径必须保持一致
控制机及执行机环境和压测脚本部署完毕后,接下来需要修改控制机及执行机配置文件,
执行机进入 Jmeter 安装目录/bin,修改配置文件 jmeter-properties,修改以下字段:
remote_hosts= 本机 IP
server_port=1099 #或其他自定义端口,确保正常可用不重复
server.rmi.ssl.disable=true
修改并保存完成后,windows 启动 jmeter-server.bat,macOS 或 linux 启动 jmeter-server
正确配置的话,控制台出现以下提示:
Created remote object: UnicastServerRef2 [liveRef: [endpoint:[192.168.2.246:19120](local),objID:[-34b17e9d:193717edda9:-7fff, 3788978414250560367]]]
控制机进入 Jmeter 安装目录/bin,修改配置文件 jmeter-properties,修改以下字段:
remote_hosts= 执行机 1 ip:1099,执行机 2 ip:1099,本机 ip:1099
server_port=1099 #或其他自定义端口,确保正常可用不重复
server.rmi.ssl.disable=true
修改后进行保存
以上配置中将控制机也作为其中一部压测机,如果不需要的话,可以不配置控制机 ip 和端口,有多个压测机逐个添加并以英文逗号分隔
接下来以 GUI 的方式启动控制机的 Jmeter,如果配置正确,能看到以下远程压测机器:
分别选择远程压测机器,执行脚本,查看结果树,取样器结果中提示该线程的执行机器信息:
远程机器控制台输出:
命令行压测执行脚本
全部压测机器都执行脚本
jmeter -n -t /tmp/perftest/scirpt/test.jmx -l /tmp/perftest/result.jtl -e -o /tmp/perftest/report/client -r
指定机器执行脚本
jmeter -n -t /tmp/perftest/scirpt/test.jmx -l /tmp/perftest/result.jtl -e -o /tmp/perftest/report/client
-r 192.168.2.246