Jmeter安装目录说明

文件夹

作用

bin

包含启动、配置等相关命令自己写的脚本默认另存为该目录下

docs

官方接口文档,二次开发需要了解的一些接口

extras

辅助库,持续集成会用到(后面讲)

lib

存放各种 Jmeter 核心库的源码 jar 包存放自己二次开发的 jar包

lib\ext

官方提供的第三方插件

license

包含 non-ASF 软件的许可证

printable_docs

离线的帮助文档,可以查看函数等内容

LICENSE

JMeter 许可说明

NOTICE

JMeter 简单信息说明

README.md

JMeter 官方基本介绍

一、 bin 目录

文件

作用

examples:

目录中有CSV样例

jmeter.properties

JMeter 核心配置文件,各种配置基本在这完成

log4j.conf

JMeter 日志配置管理

jmeter.log

JMeter 运行日志记录,什么输出信息、警告、报错都在这里进行了记录

jmeter.bat

windows 下 jmeter 的启动文件,cmd窗口

jmeterw.cmd

windows 下 jmeter 的启动文件,不带cmd窗口

shutdown.cmd

windows 下 jmeter 的关闭文件

stoptest.cmd

windows 下 jmeter 停止测试的文件

jmeter-server.bat

windows 下 jmeter 服务器模式的启动文件

jmeter-server

mac 或者 Liunx 分布式压测使用的启动文件

其中系统配置文件中的SSL设置重点关注如下几个:

# 指定HTTPS协议层

https.default.protocol=TLS

# 指定SSL版本

https.default.protocol=SSLv3

# 设置启动的协议

https.socket.protocols=SSLv2Hello SSLv3 TLSv1

# 缓存控制,控制SSL是否可以在多个迭代中重用

https.use.cached.ssl.context=true

二、 docs 目录

接口文档目录。例C:\apache-jmeter-3.0\docs\api下的index.html

三、 extras 目录

扩展插件目录。提供了对Ant的支持,可以使用Ant来实现自动化测试,例如批量脚本执行,产生html格式的报表,测试运行时,可以把测试数据记录下来,jmeter会

自动生成一个.jtl文件,将该文件放到extras目录下,运行"ant -Dtest=文件名 report",就可以生成测试统计报表。

四、 lib 目录

所用到的插件目录,里面均为jar包。jmeter会自动在jmeter_HOME/lib和ext目录下寻找需要的类,lib下存放JMeter所依赖的外部jar,

如:httpclient.jar、httpcore.jar、httpmime.jar等等。

其中lib\ext目录下存放有Jmeter依赖的核心jar包,ApacheJMeter_core.jar、ApacheJMeter_java.jar在写client端需要引用,JMeter插件包也在此目录下。

lib\junit下存放junit测试脚本.

五、 Licenses 目录

jmeter证书目录

六、 Printable_docs 目录

用户使用手册,例C:\apache-jmeter-3.0\printable_docs下的index.html

基础构成

  • 负载发生器:产生负载,多进程或多线程模拟用户行为

  • 用户运行器:脚本运行引擎,用户运行器附加在进程或线程上,根据脚本模拟指定的用户行为

  • 资源生成器:生成测试过程中服务器、负载机的资源数据

  • 报表生成器:根据测试中获得的数据生成报表,提供可视化的数据显示方式·

Jmeter面板介绍

image-1651979194924

常用的图标

image-1651979497836
从左往右依次是

  • 新建测试计划

  • 选择测试计划模板创建一个新的测试计划

  • 打开jmeter脚本

  • 保存jmeter脚本

  • 剪切

  • 复制(鸡肋,不如ctrl+c)

  • 粘贴

  • 展开目录树

  • 收起目录树

  • 禁用或启用元件

  • 本机开始运行当前测试计划

  • 立即开始在本机运行当前测试计划

  • 停止

  • 关闭

  • 清除

  • 清除全部

  • 查找

  • 清除查找

  • 函数助手对话框

  • 帮助

查看日志
如果是黄色感叹号则是正常的,如果是红色数字的代表有问题【显示的数字是多少呢,warnings/errors 数量就是多少】
点击可以查看日志【这个日志是Jmeter工具使用加载信息的日志,并不是测试脚本运行的日志】

image-1651980459459
查看错误报告
jmeter会在 jmeter.log 文件中记录warn和error信息,而 jmeter.log 在bin目录下

jmeter.properties

所在目录: apache-jmeter-5.1.1\bin ,jmeter安装目录下的bin目录
是Jmeter核心配置项文件
建议将需要修改的属性值,复制粘贴到同目录下的 user.properties
好处:当Jmeter升级时,可以避免修改项需要重新应用

GUI语言

#language=en
language=zh_CN  #简体中文

功能:设置JMeter GUI界面的显示语言
说明:若没有设置,则使用JVM(Java虚拟机)设置的locale语言.

GUI图标放大比例设置

JMeter GUI界面布局
当JMeter以GUI模式运行时,窗口主要由三部分构成:

  1. 功能区
    上方菜单栏,下方工具栏。菜单栏展示了JMeter提供的功能菜单,而工具栏中的图标
    是常见功能的快捷方式。

  2. 视图区
    以树状结构呈现JMeter元素,其中“Test Plane”是树的根节点,每一个节点就是一个JMeter元素。
    在此区域可以添加、删除节点或者通过拖曳调整节点的位置。

  3. 内容区
    当在视图区选中一个JMeter元素节点时,内容区则会相应地显示该元素的内容。
    这时可以对其内容进行查看、设置等操作。

GUI图标放大比例设置

jmeter.hidpi.mode=true          #开启视网膜模式
jmeter.hidpi.scale.factor=1.2   #将图标放大1.2倍

功能区工具栏图标大小设置

#工具栏图标默认size: 22x22
#可用size: 22x22, 32x32, 48x48
jmeter.toolbar.icons.size=32x32

视图区目录树图标大小设置

#目录树图标默认size: 19x19
#可用size: 19x19, 24x24, 32x32, 48x48
jmeter.tree.icons.size=24x24

内容区编辑字体设置

#调整JMeter内容区的编辑字体
jsyntaxtextarea.font.family=consolas  #默认Hack,太难看,使用经典的consolas
jsyntaxtextarea.font.size=18  #这两个配置项必须同时设置才有效

响应数据编码设置

#响应数据编码默认为ISO-8859-1(即Latin-1)
sampleresult.default.encoding=UTF-8  #设置为UTF-8,避免出现乱码

添加JMeter元素快捷键设置

#配置添加JMeter元素时使用的快捷键,最多支持10个.
#在windows上可以使用 Ctrl+0  Ctrl+1 ... Ctrl+9
#在macOS上可以使用 Command+0 Command+1 ... Command+9
gui.quick_0=ThreadGroupGui     #新增线程组
gui.quick_1=HttpTestSampleGui  #新增HTTP取样器
gui.quick_2=RegexExtractorGui  #新增正则表达式提取器
gui.quick_3=AssertionGui       #新增响应断言
gui.quick_4=ConstantTimerGui   #新增常量定时器
gui.quick_5=TestActionGui      #新增测试活动
gui.quick_6=JSR223PostProcessor  #新增JSR223 后置处理程序
gui.quick_7=JSR223PreProcessor   #新增JSR223 预处理程序
gui.quick_8=DebugSampler         #新增调试取样器
gui.quick_9=ViewResultsFullVisualizer #新增察看结果树

HTTP Request Post Content-Type设置

# Should JMeter add to POST request content-type header if missing:
# Content-Type: application/x-www-form-urlencoded
# Was true before version 5.0
post_add_content_type_if_missing=true
说明:此配置项在JMeter5.0以前默认值为true,以后版本默认为false,故在5.0以后的版本中
发送POST请求,将参数放在"body data"中,且没有设置
Content-Type时,默认为Content-Type值为"text/plain",而不是"application/x-www-form-urlencoded".

日志级别设置

从JMeter3.2开始,日志级别不再在jmeter.properties中设置,而是通过apache log4j2
配置文件log4j2.xml中设置日志级别:

    <Root level="info">
      <AppenderRef ref="jmeter-log" />
      <AppenderRef ref="gui-log-event" />
    </Root>

#将level的值改为对应的日志级别,默认为info,也可以在GUI界面临时设置日志级别
log4j2定义了8个级别的日志,优先级从高到低依次为:
OFF > FATAL > ERROR > WARN > INFO > DEBUG > TRACE > ALL
ALL   用于打开所有日志记录
TRACE 追踪日志
DEBUG 指出细粒度信息事件对调试应用程序是非常有帮助的
INFO  消息在粗粒度级别上突出强调应用程序的运行过程
WARN  表明会出现潜在错误的情形
ERROR 指出虽然发生错误事件,但仍然不影响系统的继续运行
FATAL 指出每个严重的错误事件将会导致应用程序的退出
OFF   用于关闭所有日志记录

test plan测试计划详细讲解

测试计划说明

  1. 测试计划描述了 Jmeter 在执行时,一系列的步骤。一个测试计划至少包含一个线程组

  2. 测试计划由测试元素组成,例如线程组,逻辑控制器,样本生成控制器,监听器,定时器,断言和配置元素。

  3. 测试计划包含执行脚本的所有步骤。 测试计划中包含的所有内容都按照从上到下的顺序执行,或者按照测试计划中定义的顺序执行。

  4. 在运行整个测试计划之前,应保存测试计划

  5. JMeter文件或测试计划以.JMX扩展文件的形式保存。JMX是一种基于开放测试的格式,它使测试计划能够在文本编辑器中启动

  6. 测试计划的一部分保存为不同的选择。 例如,如果要使用侦听器保存HTTP请求采样器,可以将其保存为测试片段,以便它也可以在其他测试场景中使用
    注:仅在调试测试计划时,才应该使用上面的 GUI 模式【界面模式】;如果实际运行负载测试的时候,应该使用CLI模式【命令行模式、无界面模式】。

测试计划参数

image-1651990079785

User Defined Variables 用户定义的变量

  1. 这里用户添加的变量,相当于全局变量,所有线程组都共用,一般添加一些系统常用的配置;

  2. 一般不建议在测试计划上添加变量,因为不方便启用(disable)和禁用(enable),可以添加用户自定义变量组件来代替
    自定义变量组件:测试计划-添加-配置原件-用户自定义的变量
    image-1651990778298

Run Thread Groups consecutively 独立运行每个线程组,默认不勾选

  1. 勾选,顺序执行,控制测试计划中的多个线程组的执行顺序,保证顺序执行各线程组,也就是测试计划中存在多个线程组时,第一个线程组执行完后再执行下一个线程组;

  2. 不勾选,并行执行,各线程组并行、随机执行,也就是测试计划中存在多个线程组时,所有线程组都在同一时刻执行;

Run teardown Thread Groups after shutdown of main threads,主线程结束后运行tearDown线程,默认勾选

Functional Test Mode (l.e. save Response Data and Sampler Data),函数测试模式、

  1. 勾选后,监听器配置了保存到一个文件中,jmeter会将每次的请求结果保存到文件中;

  2. 在负载测试中不建议勾选(选择这个选项很影响性能),平时调试脚本情况下可以勾选;

Add directory or jar to classpath,添加目录或jar包到classpath

  1. BeanShell脚本需要调用外部的java文件或jar包时,可以把jar包路径添加到这里;

  2. 在BeanShell中直接import进来,并调用jar包中的方法。

运行测试计划

  1. 可通过ctrl+r运行测试计划

  2. 活动线程数/线程总数,这仅适用于本地运行的测试,不适应于分布式运行

  3. 使用客户端-服务器模式时,它们不包括在远程系统上启动的任何线程,也就是说分布式压测时,master机不会显示所有远程salve机的线程总数

暂停测试计划

stop threads:

许多采样器(Samplers)都是可中断的,这意味着可以提前终止活动采样
stop命令将检查所有线程是否已在默认超时(即5000 ms = 5秒)内停止
如果有线程还没被停止,则会发送一条信息;此时可以再发送一次 stop 命令,但如果还是失败的话,就得退出 Jmeter 来清理

shutdown threads:

线程会在当前运行任务结束后停止,不会中断活动线程正在执行的任务
会出现一个【正在停止测试】的窗口(如下图),直到所有线程都运行完成了才会关闭
如果停止时间太久,也可以直接发stop命令
注:Linux CLI模式下,没有快捷键来停止线程运行的,所以Jmeter 在 CLI模式下会监听特定端口上的命令(默认端口4445,可以通过 jmeterengine.nongui.port 修改),如果 4445 端口被占用了(比如,另一个Jmeter实例用了),Jmeter 会自动选择备用端口;Jmeter 将尝试监听下一个更高的端口,直到到达Jmeter属性 jmeterengine.nongui.maxport 为止,该属性默认为4455
在CLI模式下,如何停止线程执行
在bin目录下,运行脚本
stoptest.cmd / stoptest.sh 【硬中断】
shutdown.cmd / shutdown.sh 【软中断】
注意,只有在同一个 host 下运行的脚本,Jmeter 才会接受

基础线程组Thread Group

Thread Group基础线程组介绍

添加:测试计划-添加-线程-线程组

  • 线程组是一个测试计划的开始点

  • 在一个测试计划中的所有元件都必须在某个线程组下

  • 线程组决定 Jmeter 执行测试计划的线程数

主要作用:

  • 设置线程数

  • 设置ramp-up period

  • 设置执行测试的次数

  • 每个线程都会独立的运行测试计划,互不干扰,多个线程用于模仿对服务器的并发访问。

Thread Group线程属性介绍

image-1651991728825

在取样器错误后要执行的动作

默认:继续
建议:继续
假设一个HTTP Sampler报错了,后面还有其他请求,最好肯定是继续执行下去啦

线程属性值

设置的线程属性值是【预期压力值】
而聚合报告是【压力测试的实际结果】

  1. 线程数
    Jmeter java进程下启动的线程,用来模拟真实用户数,1线程数 = 1用户数
    windows下,2g的 java内存,1m 的栈空间,最大启动线程数=1000
    Linux下,2g的 java内存,1m 的栈空间,最大启动线程数=2000
    在Jmeter中,先启动线程,再运行线程,后释放线程【启动线程并运行,释放线程】
    线程数建议不超过1000

  2. Ramp-Up时间(秒)
    预期线程组的所有线程从启动-运行-释放的总时间
    ramp up=0时,表示瞬时加压,启动线程的时间无限趋近于0
    特别注意:在负载测试的时候,尽量把ramp up设置大一些,让性能曲线平缓,容易找到瓶颈点

  3. 循环次数
    每个线程循环执行的次数,默认一次【便于理解:线程的迭代次数、重复发起请求的次数】
    如果设置为永远,那么 jmeter 将以最大的可能去发送请求,以此测试出最大并发数
    举例:
    image-1651994549329
    上图:20s 内启动并运行 20 个线程,一共启动 20 个线程,总共发送 60 个请求(20*3),每秒启动一个线程,然后运行三次
    备注:如果 ramp-up 时间内,所有线程不能启动运行完的话,时间则会顺延下去

Ramp-up 设置注意事项
Ramp-up需要设置足够长的时间来避免在测试刚开始时工作量过大
假如需要大量线程的话,不建议设置成0,0 属于瞬时加压【过小的 ramp-up period 】
如果设置 0,Jmeter 将在测试开始时就启动全部线程并立即发送请求,这样很容易让服务器达到饱满状态,且瞬间会增加很大的负载量,容易让服务器超载,这样是不合理的;
不合理的原因并不是因为平均压力值过高,而是因为所有线程都在初始状态时一起并发访问,从而引起不正常的初始访问峰值,可以通过 Jmeter 的聚合报告看到这种情况

Ramp-up还必须足够短,保证最后一个线程在第一个线程完成之前开始运行
如果 Ramp-up 过大,则会降低访问峰值的负载,即没有达到预期的压力峰值,无法获取准确的服务器最大负载情况【过大的 ramp-up period 】
具体的表现为:一些线程还没有启动,初期启动的部分线程已经结束了【导致实际并发量并会小于预期并发量】

如何确定一个合理的ramp-up period
首先,让初始点击率接近平均点击率,前提是确定合理的访问量
初始的 ramp-up period = 平均点击率= 总线程/点击率;假如线程数=100,点击率=10次/s,则ramp-up period = 100/10 = 10s

延迟创建线程直到需要
延迟创建线程,直到线程被需要、采样器开始执行时才会被创建,避免资源浪费

调度器Specify Thread Lifetime【scheduler】

image-1651992310114
调度器的作用:控制每个线程组运行的持续时间以及它在多少秒后再启动

  1. Duration (seconds) :持续时间;线程组运行的持续时间

  2. Startup Delay (seconds):启动延迟;测试计划开始后,线程组的线程将在多少秒后再启动运行

调度器和循环次数的关系
循环次数有固定值且 ≠ -1,持续时间不会生效,以循环次数为准
循环次数设置为永远或 -1 时,持续时间才会生效

调度器注意事项
当线程组运行完持续时间后,会逐步释放线程,不会一下子把所有线程释放掉,而释放线程也是需要时间的~
所以测试计划总的时间(右上角的时间)会 > 持续时间+启动延迟

TPS
总的完成请求数 = 线程总数 * 循环次数
平均TPS = 总请求数 / 线程运行总时间【上图,右上角黄色三角形的时间】
平均TPS(即聚合报告的TPS)是仅供参考的
实际的TPS是由服务器决定的,因为它是衡量服务器处理能力的性能指标

脚本录制

对大多数刚开始接触性能测试的人来说,代码功力可能不是太好,我们可以通过工具,录制脚本来进行测试,以达到我们的目的

一般来讲,录制脚本有两种方法

一、利用 badboy 进行脚本录制

下载安装

badboy下载地址

提示:官网下载时候会有用户邮件验证的,直接continue跳过,下载即可
安装:和一般的Windows安装程序没区别,无脑下一步就行;安装完成后一般都会在桌面和开始菜单里面有badboy的快捷方式,如果没有,在badboy安装目录下找到badboy.exe文件,双击启动即可
启动:启动badboy之后,界面如下
image-1651993220456

录制

  1. 如上图,在地址栏(红色标注区域)中输入你需要录制的web应用的URL,这里以http://www.baidu.com为例子

  2. 点击开始录制按钮(地址栏上方圈出来的地方)开始录制

  3. 开始录制后,你可以在badboy内嵌的浏览器(界面右侧)对被测应用进行操作,所有操作过程都会记录在界面左侧的编辑窗口(黄色标注区域)
    录制的脚本并不是一行行代码,而是一个web对象,有点类似于loadrunner中VuGen中的tree view视图

  4. 录制完成后,点击工具栏中的停止按钮(绿色标注区域),完成脚本的录制

  5. 点击file→save或者export to jmeter,将文件保存为jmeter的脚本格式:.jmx;启动jmeter,打开刚录制保存的文件,就可以进行测试了

二、利用jmeter代理服务器进行脚本录制

  1. 启动jmeter:在测试计划中添加线程组,线程组中添加逻辑控制器→录制控制器
    image-1651993493728

  2. 测试计划右键添加非测试元件—Http代理服务器
    image-1651993622860

  3. 配置代理服务器

  • 端口(代理服务器监听端口):设置为8080(一般来说)

  • 目标控制器:测试计划——线程组

  • 分组选择:每个组放入一个新的控制器

image-1651993782549
添加过滤器
image-1651993818143
4. http代理服务器:右键单击,添加定时器→高斯随机定时器(告知jmeter在其生成的http请求中自动增加一个定时器)
定时器会使相应的取样器被延迟:上一个请求发送被响应且延时指定时间后,下一个被定时器影响的取样请求才会被发送
如果在代理服务器中使用了高斯随机定时器,则应在其中的固定延迟偏移里添加:${T}:用于自动引用记录的延迟时间
5. 打开浏览器,网络设置,将局域网设置中的代理服务器设为localhost,端口设置为8080
image-1651994267658
6. 代理服务器配置后之后,点击启动,代理服务器就会开始记录所接受的http请求
image-1651994354501
7. 在浏览器地址栏输入需要测试的地址并进行相关操作,录制完成后,停止http代理服务器,在录制控制器上点击右键,保存录制的脚本
注意:别忘了将代理服务器设置恢复原样
8. 脚本录制完毕,启动jmeter,就可以进行测试了
​ 注意:录制https的话要添加相应的证书
添加证书
image-1651994426763
image-1651994443708

Jmeter的无界面运行测试脚本

参数

解释

-n

指定JMeter 以非GUI模式运行

-t

指定要运行的 JMeter 测试脚本文件

-l

指定结果文件路径(jtl或csv)
参数为:结果文件路径,如果路径不存在时,不会自动创建

-j

指定 运行日志文件的名称
参数为:日志路径,路径不存在时,不会自动创建,同时将日志输出至控制台

-r

设置分布式(远程)执行,在 jmeter.properties中属性“ remote_hosts ”指定的服务器中运行测试

-R

指定分布式(远程)服务器列表,在指定的远程服务器上运行测试

-g

指定测试结果文件路径,仅用于生成测试报表
参数为:CSV文件

-e

设置测试完成后生成测试报表

-o

指定测试报表生成的文件夹。文件夹不得存在或为空

-H

指定代理服务器主机名或 IP 地址

-P

指定代理服务器端口号

-X

运行完脚本后自动停止 jmeter-server

当你在命令行中使用JMeter的参数时,以下是一些更详细的案例说明:

  1. 以非GUI模式运行测试脚本,并将结果保存到CSV文件中:

jmeter -n -t /path/to/test.jmx -l /path/to/results.csv

这将以非GUI模式运行/path/to/test.jmx中的测试脚本,并将结果保存为CSV格式的文件/path/to/results.csv

  1. 运行分布式测试,指定远程服务器列表,并同时输出日志到文件和控制台:

jmeter -n -t /path/to/test.jmx -r -R server1,server2,server3 -j /path/to/logs.log

这将以非GUI模式运行/path/to/test.jmx中的测试脚本,并在server1server2server3上进行分布式执行。运行日志将保存到/path/to/logs.log文件中,并同时输出到控制台。

  1. 生成测试报表并指定报表文件夹:

jmeter -g /path/to/results.csv -o /path/to/report-folder

这将使用/path/to/results.csv中的测试结果文件生成测试报表,并将报表保存到/path/to/report-folder文件夹中。

  1. 使用代理服务器进行测试:

jmeter -n -t /path/to/test.jmx -H proxy.example.com -P 8080

这将以非GUI模式运行/path/to/test.jmx中的测试脚本,并通过代理服务器proxy.example.com的端口8080进行测试。

  1. 运行完脚本后自动停止JMeter服务器:

jmeter -n -t /path/to/test.jmx -X

这将以非GUI模式运行/path/to/test.jmx中的测试脚本,并在测试完成后自动停止JMeter服务器。

文档参考