Jmeter安装目录说明
文件夹 | 作用 |
---|---|
bin | 包含启动、配置等相关命令自己写的脚本默认另存为该目录下 |
docs | 官方接口文档,二次开发需要了解的一些接口 |
extras | 辅助库,持续集成会用到(后面讲) |
lib | 存放各种 Jmeter 核心库的源码 jar 包存放自己二次开发的 jar包 |
lib\ext | 官方提供的第三方插件 |
license | 包含 non-ASF 软件的许可证 |
printable_docs | 离线的帮助文档,可以查看函数等内容 |
LICENSE | JMeter 许可说明 |
NOTICE | JMeter 简单信息说明 |
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面板介绍
常用的图标
从左往右依次是
新建测试计划
选择测试计划模板创建一个新的测试计划
打开jmeter脚本
保存jmeter脚本
剪切
复制(鸡肋,不如ctrl+c)
粘贴
展开目录树
收起目录树
禁用或启用元件
本机开始运行当前测试计划
立即开始在本机运行当前测试计划
停止
关闭
清除
清除全部
查找
清除查找
函数助手对话框
帮助
查看日志
如果是黄色感叹号则是正常的,如果是红色数字的代表有问题【显示的数字是多少呢,warnings/errors 数量就是多少】
点击可以查看日志【这个日志是Jmeter工具使用加载信息的日志,并不是测试脚本运行的日志】
查看错误报告
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模式运行时,窗口主要由三部分构成:
功能区
上方菜单栏,下方工具栏。菜单栏展示了JMeter提供的功能菜单,而工具栏中的图标
是常见功能的快捷方式。视图区
以树状结构呈现JMeter元素,其中“Test Plane”是树的根节点,每一个节点就是一个JMeter元素。
在此区域可以添加、删除节点或者通过拖曳调整节点的位置。内容区
当在视图区选中一个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测试计划详细讲解
测试计划说明
测试计划描述了 Jmeter 在执行时,一系列的步骤。一个测试计划至少包含一个线程组
测试计划由测试元素组成,例如线程组,逻辑控制器,样本生成控制器,监听器,定时器,断言和配置元素。
测试计划包含执行脚本的所有步骤。 测试计划中包含的所有内容都按照从上到下的顺序执行,或者按照测试计划中定义的顺序执行。
在运行整个测试计划之前,应保存测试计划
JMeter文件或测试计划以.JMX扩展文件的形式保存。JMX是一种基于开放测试的格式,它使测试计划能够在文本编辑器中启动
测试计划的一部分保存为不同的选择。 例如,如果要使用侦听器保存HTTP请求采样器,可以将其保存为测试片段,以便它也可以在其他测试场景中使用
注:仅在调试测试计划时,才应该使用上面的 GUI 模式【界面模式】;如果实际运行负载测试的时候,应该使用CLI模式【命令行模式、无界面模式】。
测试计划参数
User Defined Variables 用户定义的变量
这里用户添加的变量,相当于全局变量,所有线程组都共用,一般添加一些系统常用的配置;
一般不建议在测试计划上添加变量,因为不方便启用(disable)和禁用(enable),可以添加用户自定义变量组件来代替
自定义变量组件:测试计划-添加-配置原件-用户自定义的变量
Run Thread Groups consecutively 独立运行每个线程组,默认不勾选
勾选,顺序执行,控制测试计划中的多个线程组的执行顺序,保证顺序执行各线程组,也就是测试计划中存在多个线程组时,第一个线程组执行完后再执行下一个线程组;
不勾选,并行执行,各线程组并行、随机执行,也就是测试计划中存在多个线程组时,所有线程组都在同一时刻执行;
Run teardown Thread Groups after shutdown of main threads,主线程结束后运行tearDown线程,默认勾选
Functional Test Mode (l.e. save Response Data and Sampler Data),函数测试模式、
勾选后,监听器配置了保存到一个文件中,jmeter会将每次的请求结果保存到文件中;
在负载测试中不建议勾选(选择这个选项很影响性能),平时调试脚本情况下可以勾选;
Add directory or jar to classpath,添加目录或jar包到classpath
BeanShell脚本需要调用外部的java文件或jar包时,可以把jar包路径添加到这里;
在BeanShell中直接import进来,并调用jar包中的方法。
运行测试计划
可通过ctrl+r运行测试计划
活动线程数/线程总数,这仅适用于本地运行的测试,不适应于分布式运行
使用客户端-服务器模式时,它们不包括在远程系统上启动的任何线程,也就是说分布式压测时,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线程属性介绍
在取样器错误后要执行的动作
默认:继续
建议:继续
假设一个HTTP Sampler报错了,后面还有其他请求,最好肯定是继续执行下去啦
线程属性值
设置的线程属性值是【预期压力值】
而聚合报告是【压力测试的实际结果】
线程数
Jmeter java进程下启动的线程,用来模拟真实用户数,1线程数 = 1用户数
windows下,2g的 java内存,1m 的栈空间,最大启动线程数=1000
Linux下,2g的 java内存,1m 的栈空间,最大启动线程数=2000
在Jmeter中,先启动线程,再运行线程,后释放线程【启动线程并运行,释放线程】
线程数建议不超过1000Ramp-Up时间(秒)
预期线程组的所有线程从启动-运行-释放的总时间
ramp up=0时,表示瞬时加压,启动线程的时间无限趋近于0
特别注意:在负载测试的时候,尽量把ramp up设置大一些,让性能曲线平缓,容易找到瓶颈点循环次数
每个线程循环执行的次数,默认一次【便于理解:线程的迭代次数、重复发起请求的次数】
如果设置为永远,那么 jmeter 将以最大的可能去发送请求,以此测试出最大并发数
举例:
上图: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】
调度器的作用:控制每个线程组运行的持续时间以及它在多少秒后再启动
Duration (seconds) :持续时间;线程组运行的持续时间
Startup Delay (seconds):启动延迟;测试计划开始后,线程组的线程将在多少秒后再启动运行
调度器和循环次数的关系
循环次数有固定值且 ≠ -1,持续时间不会生效,以循环次数为准
循环次数设置为永远或 -1 时,持续时间才会生效
调度器注意事项
当线程组运行完持续时间后,会逐步释放线程,不会一下子把所有线程释放掉,而释放线程也是需要时间的~
所以测试计划总的时间(右上角的时间)会 > 持续时间+启动延迟
TPS
总的完成请求数 = 线程总数 * 循环次数
平均TPS = 总请求数 / 线程运行总时间【上图,右上角黄色三角形的时间】
平均TPS(即聚合报告的TPS)是仅供参考的
实际的TPS是由服务器决定的,因为它是衡量服务器处理能力的性能指标
脚本录制
对大多数刚开始接触性能测试的人来说,代码功力可能不是太好,我们可以通过工具,录制脚本来进行测试,以达到我们的目的
一般来讲,录制脚本有两种方法
一、利用 badboy 进行脚本录制
下载安装
提示:官网下载时候会有用户邮件验证的,直接continue跳过,下载即可
安装:和一般的Windows安装程序没区别,无脑下一步就行;安装完成后一般都会在桌面和开始菜单里面有badboy的快捷方式,如果没有,在badboy安装目录下找到badboy.exe文件,双击启动即可
启动:启动badboy之后,界面如下
录制
如上图,在地址栏(红色标注区域)中输入你需要录制的web应用的URL,这里以http://www.baidu.com为例子
点击开始录制按钮(地址栏上方圈出来的地方)开始录制
开始录制后,你可以在badboy内嵌的浏览器(界面右侧)对被测应用进行操作,所有操作过程都会记录在界面左侧的编辑窗口(黄色标注区域)
录制的脚本并不是一行行代码,而是一个web对象,有点类似于loadrunner中VuGen中的tree view视图录制完成后,点击工具栏中的停止按钮(绿色标注区域),完成脚本的录制
点击file→save或者export to jmeter,将文件保存为jmeter的脚本格式:.jmx;启动jmeter,打开刚录制保存的文件,就可以进行测试了
二、利用jmeter代理服务器进行脚本录制
启动jmeter:在测试计划中添加线程组,线程组中添加逻辑控制器→录制控制器
测试计划右键添加非测试元件—Http代理服务器
配置代理服务器
端口(代理服务器监听端口):设置为8080(一般来说)
目标控制器:测试计划——线程组
分组选择:每个组放入一个新的控制器
添加过滤器
4. http代理服务器:右键单击,添加定时器→高斯随机定时器(告知jmeter在其生成的http请求中自动增加一个定时器)
定时器会使相应的取样器被延迟:上一个请求发送被响应且延时指定时间后,下一个被定时器影响的取样请求才会被发送
如果在代理服务器中使用了高斯随机定时器,则应在其中的固定延迟偏移里添加:${T}:用于自动引用记录的延迟时间
5. 打开浏览器,网络设置,将局域网设置中的代理服务器设为localhost,端口设置为8080
6. 代理服务器配置后之后,点击启动,代理服务器就会开始记录所接受的http请求
7. 在浏览器地址栏输入需要测试的地址并进行相关操作,录制完成后,停止http代理服务器,在录制控制器上点击右键,保存录制的脚本
注意:别忘了将代理服务器设置恢复原样
8. 脚本录制完毕,启动jmeter,就可以进行测试了
注意:录制https的话要添加相应的证书
添加证书
Jmeter的无界面运行测试脚本
参数 | 解释 |
---|---|
-n | 指定JMeter 以非GUI模式运行 |
-t | 指定要运行的 JMeter 测试脚本文件 |
-l | 指定结果文件路径(jtl或csv) |
-j | 指定 运行日志文件的名称 |
-r | 设置分布式(远程)执行,在 jmeter.properties中属性“ remote_hosts ”指定的服务器中运行测试 |
-R | 指定分布式(远程)服务器列表,在指定的远程服务器上运行测试 |
-g | 指定测试结果文件路径,仅用于生成测试报表 |
-e | 设置测试完成后生成测试报表 |
-o | 指定测试报表生成的文件夹。文件夹不得存在或为空 |
-H | 指定代理服务器主机名或 IP 地址 |
-P | 指定代理服务器端口号 |
-X | 运行完脚本后自动停止 jmeter-server |
当你在命令行中使用JMeter的参数时,以下是一些更详细的案例说明:
以非GUI模式运行测试脚本,并将结果保存到CSV文件中:
jmeter -n -t /path/to/test.jmx -l /path/to/results.csv
这将以非GUI模式运行/path/to/test.jmx
中的测试脚本,并将结果保存为CSV格式的文件/path/to/results.csv
。
运行分布式测试,指定远程服务器列表,并同时输出日志到文件和控制台:
jmeter -n -t /path/to/test.jmx -r -R server1,server2,server3 -j /path/to/logs.log
这将以非GUI模式运行/path/to/test.jmx
中的测试脚本,并在server1
、server2
和server3
上进行分布式执行。运行日志将保存到/path/to/logs.log
文件中,并同时输出到控制台。
生成测试报表并指定报表文件夹:
jmeter -g /path/to/results.csv -o /path/to/report-folder
这将使用/path/to/results.csv
中的测试结果文件生成测试报表,并将报表保存到/path/to/report-folder
文件夹中。
使用代理服务器进行测试:
jmeter -n -t /path/to/test.jmx -H proxy.example.com -P 8080
这将以非GUI模式运行/path/to/test.jmx
中的测试脚本,并通过代理服务器proxy.example.com
的端口8080
进行测试。
运行完脚本后自动停止JMeter服务器:
jmeter -n -t /path/to/test.jmx -X
这将以非GUI模式运行/path/to/test.jmx
中的测试脚本,并在测试完成后自动停止JMeter服务器。
评论