JMeter基础笔记
JMeter的使用不能说最频繁,但是性能测试之前多次使用过,每次都有些时间间隔。
汇总下之前零散的笔记供参考.
基础组件
原理
为每个虚拟用户启动一个线程,每个线程从上到下执行样本。当没有更多样本sampler或没有循环loop可执行时关闭。
ThreadGroup/线程组
- 所有的 Thread Groups默认并行运行 (可勾选”独立运行每个线程组”或函数测试模式)
- Ramp-Up时间指启动所有线程的等待时间, 对于大的压力需要足够长时间.
- Ultimate Thread Group : 提供增强的线程组启动模式
Listeners/监听器
通常用来保存结果。常用的有:
- View Results Tree: 方便本地调试,RegExp Tester或Debug Sampler调试
- Aggregate Report: 汇总报告
- Generate Summary Results: 在控制台或日志定期输出汇总结果
- Backend Listener: 通常与InfluxDB等相结合
取样器/Sampler
- Java Request Sampler : 可使用变量,性能最好 (一个class指定一个测试)
- JSR 223
- JUnit Sampler: 可以在一个class指定多个测试类型 (不能提供变量)
- BeanShell Sampler : 最快速的实现,适用于一次性调用 (功能有限且不灵活)
Java Sampler
部署: 打包成jar, 然后放在 lib/ext目录.
JSR233
支持Groove等脚本,可用于调试。
def topic = vars.get("topic")
log.info("Topic from the response is ${topic}")
Post Processors/后置处理器
处理输出等
Extractor
- Regular Extractor: 使用正则表达式匹配,方便在response调试。模板通常为$1$
- Boundary Extractor: 需提供匹配值的左右边界字符串,基于indexOf方法实现。简单匹配比正则快。
Assertion/断言
通常用来判断输出是否符合预期
常用组件
逻辑控制器
- While : 只判断true或false
- If Controller配合Flow Control Action使用
- Stop Now意味着立即停止不管是否执行成功
- 偶尔可以用BeanShell的方式:SampleResult.setStopTestNow(true);
Timers/定时器
Timer 被添加为子节点。注:timer先于sampler执行,如果存在多个timer,会被先于sampler顺序执行
- Synchronizing Timer: 在生成指定数量线程后同时释放
- Constant Throughput Timer:保持确定的RPS
- 高斯定时器:等价于 Math.abs((this.random.nextGaussian() * 300) + 100),偏差100,固定延迟偏移300
- Synchronizing Timer: 使用集合点(rendezvous point)作用是:阻塞线程,直到指定的线程数量到达后,再一起释放,可以瞬间产生很大的压力
Config Element/配置元件
- Counter
- CSV Data Set Config: 读取外部数据,每个线程读取一行记录。
- Sharing Mode: 代表每个线程组一个文件还是每个线程读取一个文件,通过文件别名来实现。如果不是多个线程组共享同一文件,默认值即可。
设置变量和默认值:
- HTTP Header Manager
- HTTP Request Defaults
- User Defined Variables
读写文件:
f = new FileOutputStream("Results.csv", true);
p = new PrintStream(f);
变量
# 读取变量
vars.get()
# 设置变量
vars.put()
# 使用变量
${var1}
多个线程组间共享变量:
BeanShell Assertion
${__setProperty(first_url, ${first_url})};
${__property(first_url)}
# BeanShell PreProcessor 操作字符串
props.get("name_of_variable")
内置变量
${__threadNum}
函数
[工具]-[函数助手对话框]
- 随机数: ${__Random(1,100,rand_id)}
- 时间: ${__time(,)}和${__time(,)} / 1000分别返回当前时间的毫秒数和秒数