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分别返回当前时间的毫秒数和秒数

扩展阅读