文章目录
- 引言
- Jmeter 核心组件
- Jmeter 程序设计通用规范
- 测试计划
-
- 一、线程(用户)
- 二、配置元件
-
- 2.1、CSV 数据文件设置(CSV Data Set Config)
- 2.2、HTTP信息头管理器
- 2.3、HTTP Cookie管理器(HTTP Cookie Manager)
- 2.4、HTTP缓存管理器
- 2.5、HTTP请求默认值
- 2.6、计数器(Counter)
- 2.7、随机变量(Random Variable)
- 2.8、用户定义的变量(User Defined Variables)
- 2.9、Java默认请求(Java Request Defaults)
- 2.10、HTTP授权管理器(HTTP Authorization Manager)
- 2.11、DNS缓存管理器(DNS Cache Manager)
- 2.12、FTP默认请求(FTP Request Defaults)
- 2.13、JDBC Connection Configuration
- 2.14、总结
- 三、监听器
-
- 3.1、查看结果树(View Results Tree)
- 3.2、汇总报告(Summary Report)
- 3.3、聚合报告(Aggregate Report)
- 3.4、后端监听器(Backend Listener)
- 3.5、汇总图(Aggregate Graph)
- 3.6、断言结果(Assertion Results)
- 3.7、生成概要结果(Generate Summary Results)
- 3.8、图形结果(Graph Results)
- 3.9、响应时间图(Response Time Graph)
- 3.10、保存响应到文件(Save Responses to a file)
- 3.11、简单数据写入器(Simple Data Writer)
- 3.12、用表格查看结果(View Results in Table)
- 3.13、比较断言可视化器(Comparison Assertion Visualizer)
- 3.14、邮件观察仪(Mailer Visualizer)
- 3.15、总结
- 四、定时器
- 五、前置处理器
- 六、后置处理器
-
- 6.1、正则表达式提取器(Regular Expression Extractor)
- 6.2、JSON提取器(JSON Extractor)
- 6.3、边界提取器(Boundary Extractor)
- 6.4、JSON JMESPath Extractor
- 6.5、CSS/JQuery提取器(CSS Selector Extractor)
- 6.6、XPath提取器(XPath Extractor)
- 6.7、XPath2 提取器(XPath2 Extractor)
- 6.8、结果状态处理器(Result Status Action Handler)
- 6.9、调试后置处理程序(Debug PostProcessor)
- 6.10、后置处理器小结
- 七、断言
-
- 7.1、响应断言(Response Assertion)
- 7.2、JSON断言(JSON Assertion)
- 7.3、大小断言(Size Assertion)
- 7.4、XPath2 断言(XPath2 Assertion)
- 7.5、断言持续时间(Duration Assertion)
- 7.6、HTML断言(HTML Assertion)
- 7.7、JSON JMESPath 断言(JSON JMESPath Assertion)
- 7.8、MD5Hex断言(MD5Hex Assertion)
- 7.9 XML断言(XML Assertion)
- 7.10 Xpath断言(XPath Assertion)
- 7.11 总结
- 八、取样器
- 九、逻辑控制器
-
- 9.1、IF 控制器(If Controller)
- 9.2、事务控制器(Transaction Controller)
- 9.3、循环控制器(Loop Controller)
- 9.4、While 控制器(While Controller)
- 9.5、临界部分控制器(Critical Section Controller)
- 9.6、ForEach控制器(ForEach Controller)
- 9.7、包含控制器(Include Controller)
- 9.8、交替控制器(Interleave Controller)
- 9.9、仅一次控制器(Once Only Controller)
- 9.10、随机控制器(Random Controller)
- 9.11、随机顺序控制器(Random Order Controller)
- 9.12、录制控制器(Recording Controller)
- 9.13、简单控制器(Simple Controller)
- 9.14、运行时间控制器(Runtime Controller)
- 9.15、吞吐量控制器(Throughput Controller)
- 9.16、模块控制器(Module Controller)
- 9.17、开关控制器(Switch Controller)
- 十、非测试元件
- 总结
引言
Apache JMeter 是 Apache 组织基于 Java 开发的压力测试工具,用于对软件做压力测试
JMeter官方文档:http://jmeter.apache.org/index.html
如果是小白同学,建议先查看 【P1】Jmeter 准备工作,里面包含了 Jmeter 下载、环境变量配置、设置语言、设置日志级别等等,可以更方便后续学习 Jmeter 准备工作
几个开源的网址:
TP商城: http://www.testingedu.com.cn:8000/
嘟市商城: http://124.223.31.21:8080/index.htm
WebXml: http://www.webxml.com.cn/zh_cn/index.aspx
慕慕生鲜: http://111.231.103.117/#/login
Jmeter 核心组件
取样器: 向服务器发送请求的最小单元
逻辑控制器: 结合取样器实现一些复杂的逻辑
前置处理器: 在请求之前的工作,主要包括参数的设定和传递
后置处理器: 在请求之后的工作,比如判断、参数关联、逻辑处理等,为业务逻辑中的重要环节
定制器: 负责在请求质检的延迟间隔。固定、高斯、随机
配置元件: 配置信息,用于设置一些默认值以供后续范围内的组件使用
断言: 提供成功与否的判断机制,通常用于检查取样器的结果是否正确
监听器: 提供结果检查机制,用于查看、检查、汇总、分析取样结果
执行顺序: 测试计划>>>线程组>>>配置元件>>>前置处理器>>>定时器>>>取样器>>>后置处理器>>>断言>>>监听器
作用域: 辅助组件(除测试计划、线程组、取样器之外的组件)作用于父组件、同级组件,以及同级组件下的所有子组件
Jmeter 程序设计通用规范
(1)、Jmeter 程序遵循易用易懂原则
-
比如配置元件、监听器尽可能往外放
-
尽量少用控制器,尽量减少层次结构
-
在代码逻辑较多时,尽量采用测试片段进行代码公用(方便维护修改)
-
采用简单控制器进行有效的逻辑化
(2)、注意 Jmeter 本身性能,部分性能不佳的组件在运行测试时尽可能屏蔽、少用
-
比如脚本语言中的 BeanShell,尽量用 Groovy 替代
-
比如 Css/Jquery 提取器的高效书写,避开低效的监听器等
-
运行时去掉一些调试组件、打印信息、日志信息等(影响性能测试结果)
(3)、文件路径建议统一采用相关路径,避开迁移的代码修改
(4)、合理设置断言器,保持业务压测的准确性
(5)、容易修改的常量,多处使用的常量,记得进行变量进行参数化
测试计划
测试计划是用来描述一个性能测试的顺序与动作,它包含了若干测试组件以及若干个线程组
-
独立运行每个线程组(例如在一个组运行结束后启动下一个):存在多个线程组时,勾选则串行执行。默认不勾选,并发执行
-
函数测试模式:如果选择,它将使 JMeter 记录每个样本从服务器返回的数据。如果在测试侦听器中选择了文件,则此数据将被写入文件。如果要进行少量运行以确保正确配置 JMeter 并确保服务器返回预期结果,这将很有用。结果是文件将快速增长,JMeter 的性能将受到影响。如果要进行压力测试,则应禁用此选项(默认情况下处于禁用状态)
脚本示例:【P2】Jmeter 线程组的并行与串行
一、线程(用户)
1.1、线程组
线程组元件可以理解为一个测试计划的开始(Jmeter 其它的元件都要放在线程组下)
右击测试计划 >>> 添加 >>> 线程(用户) >>> 线程组
在取样器错误后要执行的动作
-
继续:继续执行接下来的操作
-
启动下一进程循环: 开始下一次循环
-
停止线程:退出该线程,不在执行此线程的操作
-
停止测试:等待当前执行的取样器结束后,结束整个测试
-
立即停止测试:立刻停止测试
线程属性
-
线程数:相当于模拟的用户数量,一个用户占一个线程,模拟200个用户就是200个线程
-
Ramp-Up Period (in seconds):线程加速时间,设置多长时间内启动全部线程。例如线程数为100,时间设定为10s,那么就是10s加载 100个线程,每秒启动的线程数=100/10=10
-
循环次数: 如果填具体的数值,就是循环对应的次数,例如线程数为200,循环次数为10,则每个线程发10次请求;如果选择“永远”,则一直执行下去,直到手动停止
-
Same user on each iteration:相同用户迭代,一般用在有 Cookie 的场景时生效
-
Delay Thread creation until needed:延迟创建线程直到需要,默认不勾选,测试开始时,所有的线程就被创建完。勾选此项,延迟线程创建,直到需要才创建
注:进行参数化时,需配置对应的线程数量
调度器配置
-
持续时间(秒): 脚本持续运行的时间,如果同时设置有循环次数(循环次数 * 线程加速时间),则谁先到达则谁先生效
-
启动延迟(秒):脚本延迟启动的时间
1.2、setUP 线程组
setUP 线程组在测试任务普通线程组运行前先被运行。通常用在运行测试任务前,做初始化工作。例如建立数据库连接初始分化工作、用户登录
右击测试计划 >>> 添加 >>> 线程(用户) >>> setUP 线程组
参数说明参考:1.1 线程组
1.3、tearDown 线程组
tearDown 线程组在测试任务线程组运行结束后被运行。通常用来做清理测试脏数据、登出、关闭资源等工作。例如关闭数据库连接
右击测试计划 >>> 添加 >>> 线程(用户) >>> tearDown 线程组
参数说明参考:1.1 线程组
二、配置元件
配置元件主要用于设置一些默认值以供后续范围内的组件使用
执行顺序:
(1)、配置元件优先执行
(2)、按深度优先算法,依次寻找取样器,找到取样器后,逐个执行,遵循第3条规则
(3)、组件执行顺序:前置处理器 -> 定时器 -> 取样器 -> 后置处理器 -> 断言器 -> 监听器
(4)、执行多个同类型配置元件组件时,在范围内按照广度优先策略依次执行(先外后内,反向执行)
(5)、配置元件无子元素
(6)、配置元件的执行是相互独立的,谁先执行谁后执行,一般意义不大
2.1、CSV 数据文件设置(CSV Data Set Config)
CSV 数据文件变量是指从外部 csv 文件读取数据出来作为变量
选择请求 >>> 添加 >>> 配置元件 >>> CSV Data Set Config
设置 CSV 数据文件(Configure the CSV Data Source)
(1)、文件名(Filename):csv 文件路径,可以是绝对路径或者相对路径
建议设置成相对路径,填写相对于脚本的路径,后续远程压测或迁移时,可以更好的找个文件
(2)、文件编码(File encoding):编码格式,与所选文件编码格式保持一致
(3)、变量名称(西文逗号间隔)(Variable Names (comma-delimited)):如果文件中只有一个变量,直接写变量名,如果有多个变量,用英语的逗号隔开。例:var1,var2
(4)、忽略首行(只在设置了变量名称后才生效)(Ignore first line (only used if Variable Names is not empty)):
-
True:设置为 True 时,从文件第二行开始读取,此时文件第一行为变量名,例:var1,var2;设置为 True,变量名称可以不用设置,在文件第一行设置即可
-
False:一般设置为 False,文件从第一行开始设置变量数据,在变量名称中设置名称
(5)、分隔符(用 ‘\t’ 代替制表符)( Delimiter (use ‘\t’ for tab)):根据文件中的分隔符进行填写,默认:,
(6)、是否允许带引号?(Allow quoted data?):
-
True:参数文件包含引号时,实际的数据为引号中的数据。比如参数文件中的数据为"1,2",当使用该参数时,实际取得值为1,2
-
False:参数文件包含引号时,实际取得值为全部的值。比如参数文件中的数据为"1,2",当使用该参数时,实际取得值为"1,2"会取成两个参数
(7)、遇到文件结束符再次循环?(Recycle on EOF?):
-
True:参数文件中的数据循环使用,测试按照线程组中的设置执行。比如csv 文件共有 10 条记录,但线程数有 15 个,循环 10 次后,重头开始循环取值
-
False:参数文件不再循环遍历取值
(8)、遇到文件结束符停止线程(Stop thread on EOF?):
-
True:当执行完参数文件中所有参数后,直接停止线程
-
False:不停止
(9)、线程共享模式(Sharing mode):
-
所有线程(All threads):参数文件对所有线程共享,这包括同一测试计划中的不同线程组(测试计划下的所有线程组下的所有线程共享参数文件,所有线程之前参数取值互相影响,线程在同一次迭代下取值相同)
-
当前线程组(Current thread group): 只对当前线程组中的线程共享(当前线程组下的所有线程公用一个参数文件,同一个线程组下的线程之前取值相互影响,线程在同一次迭代下取值相同)
-
当前线程(Current thread): 仅当前线程获取(即每个线程获取一个参数文件,各个线程之间参数取值互不影响,线程在同一次迭代下取值相同)
当参数文件的位置与线程组在同级下,线程组下存在循环控制器时,循环控制器下的参数取值相同
线程组下存在循环控制器时,当参数文件在循环控制器下,循环控制器下每次迭代时重新取值
线程组下存在仅一次控制器,参数文件在仅一次控制器下,当参数在仅一次控制器下取值一次之后,之后无论哪次迭代参数取值都不变,类似于unique once
注:创建 CSV 文件最好用 notepad 创建,编码格式为 UTF-8
脚本示例:【P5】JMeter CSV Data Set Config(CSV 数据文件设置)
2.2、HTTP信息头管理器
设置 Jmeter 发送的 HTTP请求头所包含的信息;可抓包或通过浏览器开发模式查看
右键 >>> 添加 >>> 配置元件 >>> HTTP信息头管理器
- 信息头,也就是请求头,会跟随 HTTP 请求一起发送到服务器。比如需要传输 User-Agent 、cookie、token 或其他某些信息,或是需要伪造请求头的时候
脚本示例:【P3】HTTP 接口设计
2.3、HTTP Cookie管理器(HTTP Cookie Manager)
如果你有一个 HTTP 请求,其返回结果里包含一个 cookie,那么 Cookie 管理器会自动将该 cookie 保存起来,而且以后所有的对该网站的请求都使用同一个 cookie
右键 >>> 添加 >>> 配置元件 >>> HTTP Cookie管理器
选项(Options)
(1)、每次反复清除Cookies?(Clear cookies each iteration?):每次迭代时,都将 Cookies 清空
(2)、Use Thread Group configuration to control cookie clearing:用户线程组去配置清空 Cookie
(3)、Cookie 格式
-
standard:标准格式
-
standard-strict:严格格式
-
ignoreCookies:此规格忽略所有 Cookie。被用来防止 HttpClient 接受和发送的 Cookie
-
netscape:是最原始的 Cookies 规范,同时也是 RFC2109 的基础。尽管如此,还是在很多重要的方面与 RFC2109 不同,可能需要特定服务器才可以兼容
-
default:默认
-
rfc2109:是 HttpClient 使用的默认 Cookies 协议
-
rfc2965:定义了版本2并且尝试去弥补在版本1中 Cookie 的 rfc2109 标准的缺点。规定 rfc2965 最终取代 rfc2109 发送 rfc2965 标准 Cookies 的服务端,将会使用 Set-Cookie2 header 添加到 Set-Cookie Header 信心中,rfc2965 Cookies 是区分端口的
-
compatibility:推荐选择此种策略。这种兼容性设计要求是适应尽可能多的不同的服务器,尽管不是完全按照标准来实现的。如果你遇到了解析 Cookies 的问题,你就可能要用到这一个规范。有太多的 web 站点是用 CGI 脚本去实现的,而导致只有将所有的 Cookies 都放入 Request header 才可以正常的工作。这种情况下最好设置 http.protocol.single-cookie-header 参数为 true
存储在Cookie管理器中的Cookie(User-Defined Cookies)
- 自定义 Cookie,可以手动添加
脚本示例:【P6】JMeter HTTP Cookie管理器
2.4、HTTP缓存管理器
模拟浏览器缓存功能,静态缓存(图片等)。动态缓存(json,xml)等不在范围内。
注意:开启缓存时,我们要注意 JVM 内存大小,防止内存溢出,高并发时启步 4G
HTTP缓存管理器使用较少,大部分性能压测都是针对于动态资源 json,xml等请求,很少压测图片等静态资源
右键 >>> 添加 >>> 配置元件 >>> HTTP 缓存管理器
-
在每次迭代中清除缓存?: 如果选中此项,则在线程每次迭代时清除缓存。去Server请求资源
-
Use Thread Group configuration to control cache clearing:如果选择该项,使用线程组配置去控制缓存清空;线程组勾选 Same user on each iteration 相同用户迭代,则缓存不会清空,不勾选则会清空
-
Use Cache-Control/Expires header when processing GET request :规则与浏览器类似,检测修改时间和 Etag 变化,判断是否对静态资源进行缓存;如果勾选,则会对照当前时间检查“Cache-Control/Expires”值。如果请求是GET请求,并且时间戳记在缓存之后,则取样器将立即返回,而无需从远程服务器请求URL。这旨在模拟浏览器的行为。如果Cache-Control标头为“ no-cache ”,则响应将在过期时存储在缓存中,再次进行GET请求时将重新请求远程服务器;如果时间戳是将来的,并且请求是Get,那么Sampler会立即返回,而不需要从Server请求URL
-
缓存中元素最大数量: Jmeter保存所有缓存资源在RAM。默认情况下,缓存管理器在每个虚拟用户的缓存中最多存储5000个条目。如果增加这个值,Jmeter将相应地消耗更多的内存。它会导致“OutOfMemory”异常。为了避免这种行为,你应该在jmeter.bat\sh中调整JVM-Xmx选项
缓存执行规则:
-
无配置元件时(HTTP缓存管理器),不会缓存(与线程组设置无关)
-
有配置元件(HTTP缓存管理器),选上清空策略时,优先取配置元件(每一次迭代会清空缓存,与线程组设置(Same user on each iteration)无关)
-
有配置元件(HTTP缓存管理器),选择参考线程组时,看线程组设置(是否勾选 Same user on each iteration ;勾选则保留缓存;不勾选则不保存缓存信息)(分2种情况)
-
最后一种规则与浏览器类似,检测修改时间和 Etag 变化
2.5、HTTP请求默认值
管理公用的 HTTP 请求配置数据
右键 >>> 添加 >>> 配置元件 >>> HTTP 请求默认值
配置线程组下所有【HTTP请求】的请求行和请求体的默认值,与【HTTP请求】放在同级目录。配置后,每个【HTTP请求】无需重复配置,特殊的请求也可以单独配置,单独配置的优先级更高
参数说明参考:8.1 HTTP请求
脚本示例:【P3】HTTP 接口设计
2.6、计数器(Counter)
在迭代过程中增加计数器,一般用于统计和模拟序列等
右键 >>> 添加 >>> 配置元件 >>> 计算器
-
开始值(Starting value):给定计数器的起始值、初始值,第一次迭代时,会把该值赋给计数器
-
递增(Increment):每次迭代后,给计数器增加的值
-
最大值(Maximum value):达到最大值时,自动重置初始值;默认的最大值为2^63-1 Long.MAX_VALUE
-
数字格式(Number format):可选格式,比如000,格式化为001,002…三位,不足补0;默认格式为Long.toString(),但是默认格式下,还是可以当作数字使用
-
引用名称(Exported Variable Name):用于控制在其它元素中引用该值,比如:变量名称为 reference_name,形式:${reference_name}
-
与每用户独立的跟踪计数器(Track Counter Independently for each User):全局的计数器,如果不勾选,即全局的,比如用户#1 获取值为1,用户#2获取值还是为1;
如果勾选,即独立的,则每个用户有自己的值:比如用户#1 获取值为1,用户#2获取值为2。 -
在每个线程组迭代上重置计算器(Reset counter on each Thread Group Iteration):可选,仅勾选与每用户独立的跟踪计数器时可用
脚本示例:【P7】JMeter 计数器
2.7、随机变量(Random Variable)
模拟一些随机数字变量,模拟数据
右键 >>> 添加 >>> 配置元件 >>> 随机变量(Random Variable)
输出变量(Output variable)
-
变量名称(Variable Name):用于控制在其它元素中引用该值。例如:variable_name,形式:$(variable_name},必填
-
输出格式(Output Format):要使用的java.text.DecimalFormat格式字符串。例如,“000”将生成至少3位数的数字,或“USER_000”将生成USER_nnn形式的输出。如果未指定,则默认使用Long.toString()生成数字。非必填
配置随机发生器(Configure the Random generator)
-
最小值(Minimum Value):最小值设置。必填
-
最大值(Maximum Value):最大值设置。必填
-
随机种子(Seed for Random function):随机数生成器的种子。如果将每线程设置为true使用相同的种子值,则每个线程将获得与每个Random类相同的值。如果未设置种子,则将使用Random的默认构造函数。非必填
选项(Options)
- 每线程(用户)?(Per Thread(User)?):如果为False,则生成器在线程组中的所有线程之间共享。如果为True,则每个线程都有自己的随机生成器。必填
脚本示例:【P8】JMeter 随机变量(Random Variable)
2.8、用户定义的变量(User Defined Variables)
可以新增一些用户自定义变量,通常为简单字符串类
右键 >>> 添加 >>> 配置元件 >>> 用户定义的变量
引用变量的格式为:${变量名}
优先级:
-
线程组下的用户自定义变量 优先级高于 测试计划里的用户定义的变量
-
HTTP 请求下的用户自定义变量 优先级高于 线程组下的用户定义的变量
注意点:
-
定义的所有参数的值在测试计划的执行过程中不能发生取值的改变。即使变量的值是随机数(Random),不同用户数循环多次,拿到的用户自定义变量值都是一样的
-
一般仅将测试计划中不需要随迭代发生改变的参数(只取一次值的参数)设置在此处
脚本示例:【P9】JMeter 用户定义的变量(User Defined Variables)
2.9、Java默认请求(Java Request Defaults)
可以开发一些个 java 自定义组件;该元件结合 Java取样器,可以实现其它一些 Jmeter 原生支持不了的协议,如 redis,kafka 等
右键 >>> 添加 >>> 配置元件 >>> Java默认请求(Java Request Defaults)
2.10、HTTP授权管理器(HTTP Authorization Manager)
使用不同的认证方式来登陆网页;一般这种业务场景比较少,现在互联网都是通过自有的登陆来实现,并结合 HTTPS加密
右键 >>> 添加 >>> 配置元件 >>> HTTP授权管理器(HTTP Authorization Manager)
选项(Options)
-
在每次迭代中清除认证?(Clear auth on each iteration?):勾选后每次请求都会清理掉之前的认证,需要重新认证
-
使用线程组配置控制清除(Use Thread Group configuration to control clearing):线程组是否勾选 Same user on each iteration
存储在授权管理器中的授权(Authorizations Stored in the Authorization Manager)
(1)、基础URL(Base URL):需要使用认证页面的URL
(2)、用户名(Username):用于认证和登录的用户名
(3)、密码(Password):用于认证和登录的密码
(4)、域(Domain):身份认证页面的域名
(5)、Realm:Realm字串,一般不填
(6)、Mechanism:jmeter的http授权管理器提供的认证机制:
-
BASIC_DIGEST:HTTP协议并没有定义相关的安全认证方面的标准,而BASIC_DIGEST是一套基于http服务端的认证机制,保护相关资源避免被非法用户访问,如果你要访问被保护的资源,则必需要提供合法的用户名和密码。它和HTTPS没有任何关系(前者为用户认证机制,后者为信息通道加密)
-
KERBEROS:一个基于共享秘钥对称加密的安全网络认证系统,其避免了密码在网上传输,将密码作为对称加密的秘钥,通过能否解密来验证用户身份
2.11、DNS缓存管理器(DNS Cache Manager)
可以增加域名和IP的解析关系
右键 >>> 添加 >>> 配置元件 >>> DNS缓存管理器(DNS Cache Manager)
选项
-
在每次迭代中清除缓存(Clear cache each iteration):如果选择此选项,则每次启动新迭代时,都会清除每个线程的DNS缓存
-
使用系统DNS解析器(Use system DNS resolver):将使用系统DNS解析器。为了正确工作,请编辑 $ JAVA_HOME / jre / lib / security / java.security并添加networkaddress.cache.ttl = 0
-
使用自定义DNS解析器(Use custom DNS resolver):将使用自定义DNS解析器(来自dnsjava库)
DNS服务器(DNS Servers)
- 勾选 Use custom DNS resolver:添加配置主机名或IP地址
静态主机表(Static Host Table)
- 勾选 Use custom DNS resolver:添加静态主机
2.12、FTP默认请求(FTP Request Defaults)
可以增加域名和IP的解析关系
右键 >>> 添加 >>> 配置元件 >>> FTP默认请求(FTP Request Defaults)
-
服务器名称或IP(Server Name or IP):上传或者用来下载的服务器地址(即被测对象)
-
端口号(Port Number):指定的FTP传输端口号
-
远程文件(Remote File):远程FTP服务器文件路径
-
本地文件(Local File):本地文件路径
-
本地文件内容(Local File Contents):本地文件内容
-
get(RETR):下载文件选项
-
put(STOR):上传文件选项
-
使用二进制模式?(Use Binary mode ?):是否以二进制方式传输(默认ASCII)
-
保存文件响应?(Save File in Response ?):文件内容是否保存到响应中,如果选择了,且运行FTP请求成功后,我们可以再“查看结果树----响应数据”中看到内容
2.13、JDBC Connection Configuration
可以给数据源配置不同的连接池,供后续 JDBC 采样器使用;使用前请将对应的数据库驱动复制到 $JMETER_HOME/lib/ 或者 $JMETER_HOME/liblext/ 下;Jmeter 默认采用 DBCP 连接池
使用场景:该元件配置通常与 JDBC 取样器一同使用
右键 >>> 添加 >>> 配置元件 >>> JDBC Connection Configuration
Variable Name Bound to Pool
- Variable Name for created pool:数据库连接池的名称,可以设置多个 jdbc connection configuration,命名不同,在 jdbc request 请求中可以通过这个名称选择对应的连接池进行使用
Connection Pool Configuration:连接池参数配置,基本保持默认就行了,可根据需要进行修改
-
Max Number of Connections:最大连接数;做性能测试时,建议填 0 ;如果填了10,则最大连接10个线程
-
Max Wait (ms):在连接池中取回连接最大等待时间,单位毫秒;连接时超过最大等待时间,则连接失败
-
Time Between Eviction Runs (ms):线程可空闲时间,单位毫秒;如果当前连接池中某个连接在空闲了 Time Between Eviction Runs Millis 时间后任然没有使用,则被物理性的关闭掉
-
Auto Commit:自动提交 sql 语句,如:修改数据库时,自动 commit
-
Transaction Isolation:事务隔离级别(一般默认即可)
-
Pool Prepared Statements:
-
Preinit Pool:立即初始化连接池;如果为 False,则第一个 JDBC 请求的响应时间会较长,因为包含了连接池建立的时间
-
:数据库初始化参数,连接执行时执行,只执行一次
Connection Validation by Pool:验证连接池是否可响应
-
Test While Idle:当连接空闲时是否断开
-
Soft Min Evictable Idle Time(ms):连接在池中处于空闲状态的最短时间
-
Validation Query:一个简单的查询,用于确定数据库是否仍在响应;默认为 jdbc 驱动程序的 isValid() 方法,适用于许多数据库(Test While Idle 需配置为 True)
Database Connection Configuration:数据库连接配置
-
Database URL:数据库连接 URL(格式:jdbc:mysql://IP:端口号/数据库名称);如 consult-service 服务连接池:jdbc:mysql://{ip}:{port}/{dbname}
?allowMultiQueries=true&characterEncoding=utf8。添加 ?allowMultiQueries=true,是为了能够一次执行多条语句 -
JDBC Driver class:数据库驱动(选择对应的数据库驱动)
数据库 | 驱动 | URL |
---|---|---|
MySQL | com.mysql.jdbc.Driver | jdbc:mysql://host:port/{dbname} |
PostgreSQL | org.postgresql.Driver | jdbc:postgresql:{dbname} |
Oracle | oracle.jdbc.driver.OracleDriver | jdbc:oracle:thin:user/pass@//host:port/service |
sqlServer | com.microsoft.sqlserver.jdbc.SQLServerDriver | jdbc:sqlserver://host:port;databaseName=databaseName |
-
Username:数据库登录用户名
-
Password:数据库登录密码
-
Connection Properties:建立连接时要设置的连接属性
2.14、总结
2.13.1、Jmeter 变量作用域和规则
(1)、前一个组件定义的变量,在后续所有组件的执行过程中有效
- 例如在取样器 JSR223 Sampler中定义一个变量:vars.put(“var”,“我是变量”),在后续组件中都可以引用
(2)、变量分为线程变量、线程组变量、全局共享变量
-
线程变量的修改一般只对本线程有效,只会影响本线程的下一次迭代,不会跨线程
-
例如修改A线程,只影响A线程的之后迭代(设置线程循环),但不会影响B线程
-
线程组变量的修改会对整个线程组生效,在线程组内跨线程(比如像 csv配置元件中的线程组共享)
-
全局的变量的修改会对所有线程组生效(比如像 csv配置元件中的全局共享,全局 Counter 计数器等)
(3)、变量的定义尽量往外层放置,最好不要放置在业务逻辑中,理解起来比较反常(动态变量(设置一些后置处理器)除外)
2.13.2、配置元件使用小结
配置元件 | 使用频率 | 使用场景 |
---|---|---|
CSV 配置元件 | 非常高 | 针对某一个变量能够加载大量数据,多用于复杂业务条件的构造 |
HTTP 请求默认值 | 非常高 | 用于 http 取样器 |
HTTP 头部管理器 | 非常高 | 用于 http 取样器 |
HTTP Cookie管理 | 高 | 用于 http 取样器 |
HTTP 缓存管理 | 一般 | 用于 http 取样器 |
Counter 计数器 | 高 | 计数统计,序列等场景 |
Random 随机变量 | 一般 | 构建业务条件 |
自定义变量 | 非常高 | 处理少量数据,将脚本进行参数化 |
三、监听器
监听器主要为 Jmeter 持续大量的取样结果提供分析机制,比如查看、统计、汇总、分析取样结果,进而用来分析性能结果
执行顺序:
(1)、配置元件优先执行(非控制器内),用户自定义配置元件优先执行(无论是否在控制器内)
(2)、按深度优先算法,依次寻找取样器,找到取样器后,逐个执行,遵循第3条规则
(3)、执行总体顺序:控制器(父类)-> 配置元件(控制器内)-> 前置处理器 -> 定时器 -> 取样器 -> 后置处理器 -> 断言器 -> 监听器
(4)、监听器不可以添加子元素
(5)、同一个取样器有多个监听组件时,在范围内按照广度优先策略依次执行