JMeter
📌 使用JMeter进行压力测试
- 用户定义的变量,内容包括线程数8、ramp_up_time启动所有线程所需时间、循环次数-永远、持续时间300s、启动延迟时间。
- 登录请求线程组,搭配正则表达式提取器、BeanShell PostProcessor将token设置为全局变量。
- Http请求默认值,包括协议、ip、端口、编码。
- Http信息头管理器,包括报文类型、token等信息。
- 被测请求线程组,包括事务控制器、csv数据文件(参数化)、请求、提取器、响应断言、断言结果、汇总报告。
- 总体的结果树、报告、事务响应时间图
- 生成html报告,平均响应时间200ms-1200ms
步骤参考: 202409.jmx
执行参考: run.sh
参考资料: JMeter压力测试完整流程
#!/bin/bash
current_datetime=$(date +%Y%m%d%H%M%S)
mkdir -p "${current_datetime}"
# touch "${current_datetime}/output.jtl" # 无需先手动创建
mkdir -p "${current_datetime}/results"
jmeter -n -t 202409.jmx -l "${current_datetime}/output.jtl" -e -o "${current_datetime}/results"
🚁 仅一次控制器
控制仅使用一次的请求
🚁 吞吐量控制器
限制流量,吞吐量控制器-吞吐量设置为10.0,表示限流为10%。
🚁 事务控制器
当需要将多个请求一起统计时使用。
🚁 后置处理器
- 边界提取器,输入左边界/右边界,提取边界里的数据。
- 其他的还有json提取器、正则提取器、xpath提取器等。
🚁 并发
同步定时器,等待线程数到预设数量后触发事务,达到集合点的作用。
参考资料: 同步定时器
🚁 断言
- 响应断言,可以配置匹配响应文本、请求头、响应头等,或者设置包括、相等等规则
- 数据包字节大小断言
- 持续时间断言,判断是否在指定时间内返回响应结果
- beanshell断言
📌 造仿真数据
- 右击线程组->添加取样器->OS进程取样器,并进行配置
- 添加后置处理器->JSON提取器,并进行配置
- 在请求报文中使用提取出来的变量,格式为
${变量名}
import json
from faker import Faker
from faker.providers import BaseProvider
# 自定义数据
class CustomFaker(BaseProvider):
def prodid(self):
# 假设是从库表或接口获取到的订购产品id
prod_list = ["prodid1", "prodid2", "prodid3"]
return self.random_element(prod_list)
faker = Faker(locale='zh_CN')
faker.add_provider(CustomFaker)
result = {
"id_num": faker.ssn(),
"name": faker.name(),
"phone": faker.phone_number(),
"email": faker.email(),
"address": faker.address(),
"birthday": faker.date_of_birth().strftime("%Y-%m-%d"),
"prodid": faker.prodid()
}
# print(json.dumps(result,ensure_ascii=False)) # JMeter中执行python反而这一行结果乱码
print(json.dumps(result))
{
"name":"${name}",
"id_num":"${id_num}",
"phone":"${phone}"
}
📌 响应报文的汉字乱码
解决方案:
- 打开JMeter目录的
bin/jmeter.properties
文件 - 搜索关键字:
sampleresult.default.encoding
- 去掉注释符,修改编码为UTF-8,即
sampleresult.default.encoding=UTF-8
- 重启JMeter
JMeter 5.6.1 之后的版本默认UTF-8编码,无需修改。
其他解决方案参考: 解决Jmeter响应报文中文乱码的问题-3种解决办法
📌 使用插件
- 下载插件: https://jmeter-plugins.org/downloads/old/
- 解压后把
lib
文件夹扔到JMeter目录,重启JMeter。之后便可使用阶梯加压线程组、响应时间折线图、TPS折线图等组件。
📌 使用代理服务器录制脚本
参考资料: jmeter代理服务器录制脚本教程(入门篇)
📌 使用自带函数
工具->函数助手对话框,找需要用的函数。
{
"id":"${__Random(100,105)}", // 从100至105的序列中随机取数
"phone":"${__chooseRandom(1.0.1,1.0.2,1.0.3)}" // 从该列表中随机取数
}
📌 调外部jar包方法
- jar包需要放JMeter目录的
lib\ext
目录下 - jar包里调用的第三方jar包也要放到
lib
和lib/ext
里 - 记得重启JMeter,添加前置处理器: BeanShell PreProcessor,然后写脚本
import xx.Util;
String sp = "18" + Integer.toString(${__Random(000000000,999999999,)});
log.info("phonenum is" + sp);
vars.put("phone",sp);
String code = Util.encrypt(sp);
// 存入变量,在脚本文本中通过${phone}引用,不能跨线程
vars.put("phone",code);
// 记录日志
log.info("phonenum is" + vars.get("phone"));
// props能跨线程,是hashtable对象
props.put("phone",code); // 在脚本文本中通过${__P(phone)}引用
参考资料: jmeter引用jar包的3种方式
📌 报告分析
参考资料:
https://blog.csdn.net/m0_61066945/article/details/136062323
https://blog.csdn.net/qq_24394093/article/details/90732577
📌 分布式集群压测
单台压力机,资源不足以触发足够多的并发时,采用分布式压测。
1.配置控制机的jmeter/bin/jmeter.properties
- 搜索:
server.rmi.ssl.disable
,设置为true,不使用加密认证传输。 - 搜索:
remote_hosts
,设置压力机的ip及端口,逗号分隔。 - 搜索:
mode=Standard
,去掉注释,用于图形界面看结果。
2.打包jmeter目录及jmx脚本,上传到压力机,确保版本、配置、脚本等一致。
3.配置压力机的jmeter/bin/jmeter.properties
- 搜索:
remote_hosts
,设置为127.0.0.1
。 - 搜索:
server_prot
,设置控制机的端口。 - 关闭防火墙:
systemctl stop firewalld.service
- 设置可执行权限:
chmod 777 jmeter/bin
- 启动压力机服务:
jmter-server -Djava.rmi.server.hostname={ip}
前提: 执行机已安装JDK
4.控制机图形化界面远程启动
运行->远程启动->选择压力机
或者通过命令启动: jmeter -n -t 202409.jmx -l "${current_datetime}/output.jtl" -e -o "${current_datetime}/results" -r