文章目录
JMeter官网
JMeter 文件目录介绍
bin目录-存放可执行文件和配置文件
jmeter.bat :windows的启动文件
jmeter.log :日志文件
jmeter.sh :linux的启动文件
jmeter.properties : 系统配置文件
jmeter-server.bat:windows分布式测试要用到的服务器配置
jmeter-server:linux分布式测试要用到的服务器配置
docs目录-JMeter的api文档
- 打开api/index.html页面来查看
printable_docs目录-用户手册/元件帮助文档
- usermanual子目录下的内容是JMeter的用户手册文档
- usermanual下component_reference.html是最常用的核心元件帮助文档
- demos子目录下有一些常用的JMeter脚本案例,可作为参考
lib目录-存放Jmeter依赖的jar包和用户扩展依赖的jar包
- ext目录–第三方库
基本配置–汉化、主题
- 汉化
- 临时修改: options–language–choose language–chinese
- 永久修改:
- 打开jmeter.properties
- 修改language=zh_cn
- 重启jmeter
- 主题
- 选项-主题–选择对应的主题-重启
Jmeter基本操作步骤
- 启动jmeter
- 添加线程组
- 添加http请求的取样器并配置
- 添加查看结果树的监听器
- 启动运行jmeter,查看结果
JMeter元件及基本作用域
-
基本元件
- 线程组:模拟用户的
- 配置元件:进行测试环境和测试数据的初始化,类似于自动化脚本中的setup
- 前置处理器:对要发送的请求进行预处理,类似于自动化脚本中的参数化
- 取样器:往服务器发送请求,类似于自动化脚本中的发送请求的代码
- 后置处理器:对收到的服务器的响应进行数据提取,类似于自动化脚本中获取响应中特定字段的语句
- 断言:将收到的响应结果与预期结果做对比,类似于自动化脚本中的断言
- 监听器:查看测试脚本运行的结果和日志,类似于自动化脚本中的测试报告
- 定时器:等待一段时间,类似于自动化脚本中的sleep
- 测试片段:封装基本功能,不单独执行,需要通过脚本调用才能执行,类似于自动化脚本中封装的函数
-
作用域的原理
- 核心:根据测试计划中的树形结构的父子节点来确定
- 原则
- 取样器是没有作用域的
- 逻辑控制器:只针对其子节点下的所有元件有效
- 其他的元件
- 如果其父节点是取样器,只针对父节点(取样器)有效
- 如果其父节点是非取样器,针对父节点下的所有子节点及子节点的子节点有效
-
元件的执行顺序
- 顺序:配置元件、前置处理器、定时器、取样器、后置处理器、断言、监听器
- 注意
- 配置元件、前置处理器、后置处理器都需要依赖取样器才能运行
- 在同一个作用域下,相同类型元件的执行顺序是从上到下按顺序执行
JMeter三个重要组件
线程组
- 作用:通过配置线程组中的线程数来模拟用户,线程数就是用户数,线程组就是用户组
- 特点
- 模拟多用户
- 取样器和逻辑控制器必须在线程组下使用
- 一个测试计划下可以添加多个线程组,他们可以并行或串行
- 并行:默认情况下线程组为并行执行
- 串行:在测试计划下勾选”独立运行每个线程组“
- 线程组的分类
- setup线程组:用于测试前的预处理操作,在所有的线程组中最先执行
- 普通线程组:用于执行业务测试的脚本
- teardown线程组:用于测试后的后置处理(恢复环境、数据)的操作,在所有线程组中最后执行
- 线程组的属性
- 线程数:模拟用户数
- Ramp-up时间:模拟用户启动所需要的时间
- 循环次数
- 配置指定次数:控制脚本循环执行的次数
- 配置循环永远
- 需要调度器配置使用
- 运行时间:脚本执行时间
- 延迟启动时间:脚本等待特定的时间才能开始运行
- 线程数m和循环次数n的关系
- 如果同时配置,实际发送的http请求次数为m*n
- 虽然发送的次数相同,但是不能相互替换
- 线程组:代表并发用户数,体现服务器的负载量
- 循环次数:代表执行时间
取样器
HTTP请求
- http协议:可以填写为http或者https,默认为http
- http主机名/ip
- 端口:默认为80
- 请求方法:http协议所支持的所有方法
- 路径:目录+参数
- 编码格式:默认ios国际标准,推荐使用utf-8
查看结果树
- 取样器结果:统计请求相关的信息
- 请求:Http请求的请求头和请求体的详细信息
- 响应:Http响应的响应头和响应体的详细信息
JMeter响应中出现乱码
- 修改jmeter.properties文件中,sampleresult.defult.encoding=utf-8
- 重启jmeter
JMeter 参数化
四种方式:
- 用户定义的变量
- 用户参数
- csv data set config
- 函数
用户定义的变量
-
方式1
- 添加:线程组–配置文件–用户定义的变量
- 配置:参数名+参数值
- 使用:在HTTP请求的取样器中引用定义的变量–${}
-
方式2
- 配置:在测试计划中配置用户定义的变量
- 使用:在HTTP请求的取样器中引用定义的变量–${}
用户参数
- 添加:线程组–前置处理器–用户参数
- 配置
- 参数:添加变量-设置参数名
- 参数值:添加用户–针对每个用户配置不同的参数值
- 使用:在HTTP请求的取样器中引用定义的变量–${参数名}
CSV 数据文件设置
- 添加:线程组–配置元件–csv data set config
- 编写csv数据文件(.csv作为后缀):
- 多个参数写为多个列,其中用逗号隔开
- 多组参数值,则使用多行来设置
- 配置:
- 文件名:填写csv文件的路径,建议使用相对路径
- 文件编码:utf-8
- 变量名称:从csv数据文件中读取的数据需要保存的变量名,有多个变量用逗号隔开
- 是否忽略首行:是否从csv数据文件第一行开始读取
- 分隔符:要求与csv数据文件中多列的分隔符一致
- 遇到文件结束符是否再次循环:默认true
- 遇到文件结束符是否停止线程:当前一个参数为False,则该参数为True,一般设置为True
函数
- counter
- true:每个用户使用独立的计数器
- false:所有用户使用全局的计数器
- 引用:在取样器中使用${__counter(false,)}来引用对应的值
- 应用场景:当需要参数化的数据只有唯一性要求,但是对具体的参数值无明确要求时,建议使用函数方式
JMeter常用断言
作用:让脚本自动执行的过程中,能够自动的判定执行结果是否正确,需要添加断言
常用断言
- 响应断言
- JSON断言
- 断言持续时间
响应断言
- 添加:线程组–HTTP请求–断言–响应断言
- 配置
- 测试字段:需要检查的字段
- 模式匹配规则:需要使用什么规则来进行检查
- 测试模式:需要检验的值
Json断言
- 适用于返回的HTTP响应为Json格式
- 添加:线程组–HTTP请求–断言–JSON断言
- 配置
- JSON PSTH:$.weatherinfo.city
- 勾选”Additonal assert value“
- 在expected value里填写期望值
断言持续时间
- 适用于性能测试时候,检查HTTP请求的响应时间是否超过预期值
- 添加:线程组–HTTP请求–断言–断言持续时间
- 配置:预期时间
JMeter关联
- 当多个请求之间有依赖关系,后一个请求的参数需要使用前一个请求的相应数据时,需要用到关联
分类:
- 正则表达式提取器
- xpath提取器
- JSON提取器
正则表达式介绍:
表达式: <title>.*?</title>
. :是通配符,可以代表任意字符(除换行回车)
* :代表前面的字符出现0次或多次
? :代表非贪婪匹配,找到左边界后,往右查找匹配右边界,只有有匹配的右边界就停止继续查找,再次查找左边界和右边界
正则表达式提取器
- 添加:线程组-HTTP请求–后置处理器–正则表达式提取器
- 配置:
- 要检查的响应字段:默认主体
- 引用名称:匹配后的数据要储存的变量名
- 正则表达式:
(.*?) ()里是要保存的数据 - 模板:
1
1
1
- 数字1代表上面正则表达式中第几个()
- 匹配数字:0代表随机值,1代表第一个结果,-1代表所有结果
- 缺省值:当没有匹配上时该值保存到变量中
- 引用:
- 如果匹配数字为1,则直接使用变量名来引用:${变量名}
- 如果匹配数字为-1,则使用变量名+后缀的方式来引用:${变量名_数字}
- 匹配数字为-1,可以添加:线程组-取样器-debug sampler 来确定参数
XPath提取器
- 添加:线程组–HTTP请求器–后置处理器–xpath提取器
- 配置:
- 引用名称:匹配后的数据要存储的变量名
- xpath query:xpath匹配规则
- 匹配数字:1代表第一个结果,-1代表所有结果,0代表随机
- 缺省值:默认值
Json提取器
- 添加:线程组–HTTP请求–后置处理器–JSON提取器
- 配置:
- 引用名称:匹配的数据要存储的变量名
- JSON path:json路径 $.weather.city
- 引用:直接引用变量名
JMeter直连数据库
-
连接准备
- 打开数据库,确定数据库的表及对应的字段
- 加载mysql的 jdbc驱动
- 配置jdbc connection configuration
- created pool name :给连接池命名,用于后续引用
- database url:jdbc:mysql://127.0.0.1:3306/库名
- jdbc driver class : com.mysql.jdbc.driver
- username:
- password:
-
直连数据库:
- 添加JDBC Request:在取样器下添加
- 配置:
- 配置连接池的名称
- 配置sql语句
- 配置保存的变量名
- 如果sql语句返回了多个参数,输入相同个数的变量名来保存
- HTTP断言中,就可以引用变量来判断
JMeter逻辑控制器
- 可以按照设定的逻辑控制器来执行
如果( if) 控制器
循环控制器–ForEach控制器
如果(IF)控制器
- 与用户定义的变量一起使用
- 添加:线程组–逻辑控制器–if控制器
- 配置:
- 使用js语句:"${name}"==‘baidu’
- 推荐–使用jmeter函数的方式:KaTeX parse error: Expected group after '_' at position 2: {_̲_jexl3("{name}"==‘baidu’,)}
ForEach控制器
- 用户定义的变量或者正则表达式提取器配合使用,循环读取返回的变量中的值,执行一次或者多次
- 添加:线程组–逻辑控制器–ForEach控制器
- 与用户的定义的变量配合使用:
- 用户定义的变量
- 变量名:固定前缀+连续数字
- ForEach控制器
- 变量前缀:用户定义的变量中配置的固定前缀
- 起始数字:连续数字的最小值-1
- 结束数字:连续数字的最大值
- 输出变量名称:依次读取变量后存储到参数中,供HTTP请求引用
- HTTP请求:
- 使用输出变量进行引用
- 使用输出变量进行引用
- 用户定义的变量
- 与正则表达式提取器配合使用
- 先通过正则表达式提取器,提取出请求中所有满足条件的数据
- 添加ForEach控制器,配置提取所有满足条件的数据,并保存为变量
- 在其子节点下,添加http请求并引用变量
JMeter定时器
同步定时器
常数吞吐定时器
同步定时器(Synchronizing Timer)【集合点】
- 需要进行大量用户的并发测试时,为了让用户能真正的同时执行,添加同步定时器,用于阻塞线程,直到线程达到预先配置的数值,才开始执行取样器的操作
- 配置:
- 并发数:同时达到多少用户才开始发送请求
- 超时时间:
- 必须配置:否则当虚拟用户数无法被并发数整除时,就会有部分的用户挂起无法执行
- 配置不能太短:必须比并发数加载的时间要长,否则不能达到并发数的要求,数据就会被释放
常数吞吐量定时器
- 模拟用户产生的业务压力,通过指定QPS来对服务器发送固定频率的请求
- 添加:线程组–HTTP取样器–常数吞吐量定时器
Jmeter 分布式
- 应用场景
- 当测试机无法模拟用户需要的业务负载量时,需要使用多台测试机配合使用
- 原理
- 分布式测试机分为一台控制机和多台代理机
- 控制机负责发布测试任务给代理机
- 代理机接收任务并向服务器发送请求,并接收服务器返回的响应,将测试结果返回给控制机
- 由测试机对测试结果数据进行统计
- 分布式相关注意事项
- 所有的测试机防火墙都已经关闭
- 所有的测试机及服务器在同一个网络内
- 所有的测试机的Jmeter版本和java版本完全相同
- 关闭Jmeter里的RMI SSL开关
- 分布式配置
- 代理机
- server_port:不重复
- 关闭RMI.SSL
- 控制机
- remote_server:所有代理机的IP+port,多台之间用逗号分隔
- 关闭RMI.SSL
- 代理机
- 运行
- 代理机
- jmeter-server.bat运行
- 控制器
- jmeter.bat运行
- 控制代理机执行脚本:运行-远程启动所有
- 代理机