一 、前置
1. Jmeter安装
2. 插件包下载安装
地址:Jmeter 插件包
.jar插件包需 复制 —> Jmeter路径 —> lib —> ext —> 重启Jmeter,即可在选项(Option) 下看到 Plugins Manager,点击后即可进入插件下载页面
插件举例:
Transaction per Second(TPS):每秒事务数
Response Times Over Time(TRT):事务响应时间
Active Threads Over Time:统计每秒活动的线程总数
[※]jp@gc - Stepping Thread Group(阶梯压测):
- 测试计划 —> 添加 —> 线程 —> jp@gc - Stepping Thread Group
- 该场景主要应用在负载测试里面,通过设定一定的并发线程数,给定加压规则,遵循“缓起步,快结束”的原则,不断地增加并发用户来找到系统的性能瓶颈,进而有针对性的进行各方面的系统优化
- 转载网址link
3. 性能指标及常见的性能测试方法
指标:
响应时间(Response Time)秒单位
- 5s以内,极端的举例2~3s最优
- 大于7秒可能用户体验不太好
- (具体看项目的要求)
吞吐量(Throughput)
- 评估服务端的处理能力,举例订单接口在特定的情况下能处理多少的订单量
- tps,通过事务来评估;qps每秒查询数每秒的事务处理量
- 网络的评估方面,每秒钟上行下行的字节数
资源使用率(Resource utilization)
- 占用多少的内存。CPU占用率,I/O磁盘占用了多少,举例具体看代码评估资源使用率,不能只看CPU占比,可能还有代码的角度是否有缺陷
点击数(Hits per second)
- 评估服务端发起的请求数,前端请求的接口的数量
并发用户数(Concurrent users)
- 模拟并发用户数,举例说明是:同时有多少用户来访问,(集合点)极端的是同一时刻发起的请求,更多的是说用多少的用户量发起请求
测试方法:
基准测试
- 模拟单用户,验证单用户下评估系统是不是存在性能问题
- 调脚本
负载测试
- 压大的用户量,看系统的性能运行情况,例:压10分钟或20分钟
稳定性测试
- 长时间的压测,例8个小时以上
4. 环境变量配置参考
path:
C:\Program Files\Java\jdk-15\bin;C:\Users\user\Test\data\apache-jmeter-5.4.1\bin
CLASSPATH:
C:\Program Files\Java\jdk-15\lib*.jar;%JMETER_HOME%\lib\ext\ApacheJMeter_core.jar
JMETER_HOME:
C:\Users\tingfliu\Test\data\apache-jmeter-5.4.1
二 、Jmeter使用
1. 主要组件
- 测试计划
- 线程组
- 取样器
- 监听器
- 断言
聚合报告
- 90%百分位
- 吞吐量
2. 录制操作
1、使用Badboy录制操作导出给Jmeter使用
2、使用Jmeter自带录制工具:
3. Jmeter接口返回内容乱码
1、修改 JMeter 配置文件
- JMeter 的默认编码是 ISO-8859-1,可以通过修改 jmeter.properties 配置文件来设置默认编码为 UTF-8。
- 打开 JMeter 安装目录下的 bin 文件夹
- jmeter.properties 文件
- 取消注释:去掉前面的 #,取值:UTF-8:
- sampleresult.default.encoding=UTF-8
- 保存文件并重新启动 JMeter
2、HTTP请求
- 内容编码 处取值:UTF-8
4. 命令行执行脚本
原因
- 直接启动Jmeter运行线程较多的测试脚本,会造成内存和CPU的大量消耗,导致客户机卡死,所以正确的打开方式是在GUI模式下调整测试脚本,再用命令行模式执行。
命令行语句
- 转载网址link1
- 转载网址link2
- 转载网址link3
- 执行路径:
- 执行命令前要检查当前目录是否是%Jmeter_Home%\bin 目录
- 如果 Jmeter 脚本不在当前目录,需要指定完整的路径;如果要把执行的结果保存在其他地方也要指定完整的路径
- 命令中不指定测试计划与测试结果的路径时,默认都是在该目录下
- 命令参数及释义
命令参数 | 命令释义 |
---|---|
-n | 设置命令行模式运行Jmeter |
-t | 指定要执行的jmx文件 参数:Jmx脚本路径,若非当前目录使用全部路径或相对路径 |
-l | 指定测试结果的日志文件(类似于查看结果树,jtl或csv文件)路径 参数:结果文件路径。路径不存在时会自动创建 |
-j | 指定Jmeter日志文件(INFO、ERROR、DEBUG等) 参数:日志路径。路径不存在,不会自动创建,同时将日志输出至命令行控制台 |
-g | 指定结果文件的路径,仅用于生成测试报告 参数:jtl或csv文件报告 |
-e | 在测试结束后生成HTML测试报告 |
-o | 指定用于生成HTML报告的目标目录文件夹必须为空或不存在 参数:报告文件夹路径 |
-r | 指定(远程)运行Jmeter客户端和服务器模式 服务器列表由JMETER_HOME\bin\jmeter.properties中remote_hosts指定 |
-R | 指定远程(分布式)服务器列表 参数:指定服务器列表,配置形式同remote_hosts |
-s | 运行Jmeter作为服务器(用于分布式测试) |
-f | 强制将Jmeter进程结束,或者在运行非GUI测试时,立即结束测试并生成结果文件 |
-c | 指定远程服务器的 IP 地址或主机名 |
-i | 指定本地 IP 地址,用于远程服务器通信 |
-H | 指定代理服务器的主机名或代理服务器IP 参数:服务器的主机名或代理服务器IP |
-P | 指定代理服务器的端口号 参数:代理服务器的端口号 |
- 可开始菜单搜索打开命令行工具:PowerShell
# 使用命令行的'cd命令进入到本地Jmeter工具bin目录
cd Jmeter的bin路径
# 切换到b盘
b:
# 举例1
.\jmeter -n -t jmx/file.jmx -l jtl/file_线程数.jtl -e -o report_file_线程数
# 举例2
# 文件路径地址尽量不要有空格和中文
# 每次运行时路径下都不要有jtl文件和report文件夹
.\jmeter -n -t D:\PerformanceTest\promoteTest.jmx -l D:\PerformanceTest\LOG\csvlog.jtl -e -o D:\PerformanceTest\Report
# -j
-j report\01-log.log
# -r
.\jmeter-server -Djava.rmi.server.hostname=192.168.1.100
# -s
.\jmeter-server
# -c
.\jmeter -c 192.168.1.100
# -i
.\jmeter -i 192.168.1.101
# -f
.\jmeter-server -Djava.rmi.server.hostname=192.168.1.100
# -H
.\jmeter -H proxy.example.com
# -P
.\jmeter -P 8080
- 注意事项
- 自定义配置
Jmeter3.0以后在bin目录新增了reportgenerator.properties文件保存了所有关于图形化HTML报告生成模块的默认配置,要变更配置,建议不要直接编辑该文件,而是推荐在user.properties中去配置和覆盖。 - 默认采样点粒度是60000ms(即1分钟),通常在稳定性以外的测试过程中我们需要细化粒度,如1000ms(即1秒),我们在user.properties文件中添加如下配置:
jmeter.reportgenerator.overall_granularity=1000
- 自定义配置
5. JSON提取器
- 线程组 —> 添加 —> 后置处理器 —> JSON提取器
面板字段含义
面板字段 | 含义 |
---|---|
Main sampleand sub-samples | 应用于主sample及子sample |
Main sample only | 默认的是这个,应用于主sample |
Sub-samples only | 应用于子sample |
Jmeter Variable Name to use | 应用于变量命名的内容 |
Names of created variable | 名称 参数:code |
JSON Path Expression | JSON表达式 参数:$.code |
Match Numbers | 0随机;n取第几个匹配值;-1匹配所有,后续引用用 变量名_N 取第N个值 参数:1 |
Compute concatenation var (suffix_ALL) | 勾选框,默认不勾选 |
Default Values | 如果参数没获取到可默认参数为(因人而异):null |
$.你要提取的参数
1、响应类似{"属性":[{"sx":1},{},{}]},整个响应是个对象。取sx的值:$.属性[0].sx
2、修改json extractor 获取数组的所有值 $[*].属性。match no=3取第3个
3、match no=5,数组越界后,取default values
4、修改json extractor 设置match no =-1 匹配对应字段所有值;并修改接收参数的http请求的参数为 ${varname_N}.N=1-4
我想提取code参数值:
JSON Path Extractor:$.code
字段详细举例:
提取username参数值:
JSON Path Extractor:$.list[0].username
如果提取的参数不存在父级?
$.你要提取的参数名
提取的参数存在父级
$.你要提取的参数名的父亲.你要提取的参数名
如果提取参数的父级存在父级
$.你要提取的参数名的父亲的父亲(爷爷).你要提取的参数名的父亲.你要提取的参数名
$.data.code
注:参数如果是[数组]
$.你要提取的参数参数[N]
以下标的形式取值,0代表取的数组中第一个值,1代表取的是数组中第二个值,N代表取的数组中第N+1个值
5、提取多个值得json内容和提取单个值得格式保持一致,多个之间分别用分号来隔开 $.code;$.code2;$.data.code
验证Json提取数据
- 针对想获取的 HTTP请求 使用 察看结果树 的 JSON Path Tester 的输入方式,在该请求的 Json Path Expression 处输入参数,Test 是否可以获取取值
- 注:一次只能输入一个参数 Test 是否可以获取值
- 配合使用,可在HTTP请求右键添加 调试后置处理程序 在结束树查看提取数据情况
6. 循环控制器
- 配合使用:计数器
- Starting value
- 递增
- Maximum value,可从 调试后置处理程序 取值:${参数_matchNr},取到参数次数
- 引用名称,后续HTTP请求可用计数器的计数参数,可使用:num
- 后续HTTP请求使用参考:KaTeX parse error: Expected group after '_' at position 2: {_̲_V(参数_{num},)}
7. 仅一次控制器
- 线程组 —> 添加 —> 逻辑控制器 —> 仅一次控制器
- 并发数=跑的次数
8. IF控制器
- 线程组 —> 添加 —> 逻辑控制器 —> 如果(if)控制器
面板字段含义
- 转载网址link
- 示意图
面板字段 | 含义 |
---|---|
Expression (must evaluate to true or false) | 表达式(值必须是true或false),在右边文本框中输入的条件值必须是true或false(默认false) |
Interpret Condition as Variable Expression? | 默认勾选,将条件解释变为变量表达式,需要使用{_̲_jexl3}或{__groovy}表达式 |
Evaluate for all children? | 条件作用于每个子项 |
建议 | 选中[Interpret Condition as Variable Expression?] |
注意 | 如果取消选中Interpret Condition as Variable Expression?,这可能会导致性能损失很大,并使测试的扩展性降低,所以不推荐不勾选 |
${_̲_jexl3("${code}"="0")}
${__groovy("${code}"=="0")}
9. 响应断言
- 点击 添加 —> 断言 —>响应断言
- 将想要放response里的内容放在 测试模式 ,需是text文本格式返回值
- 自定义失败信息 存放
10. Jmeter连接数据库
转载网址link
截取的大致信息如下:
下载对应数据库插件驱动
导入插件
- 方法1:把jar文件放置到Jmeter路径的lib文件夹后重启Jmeter
- 方法2:
添加连接 JDBC Connection Configuration
- 线程组 —> 添加 —> 配置元件 —>JDBC Connection Configuration
- 示意图:
- 面板字段含义
面板字段 | 含义 |
---|---|
Variable Name for created pool | 定义池变量名称,自定义参数,在JDBC Request中会用到 |
Max Number of Connections | 1、最大连接数 2、做性能测试时,建议填 0;如果填了10,则最大连接10个线程 |
Time Between Eviction Runs(ms) | 1、线程可空闲时间,单位毫秒 2、如果当前连接池中某个连接在空闲了 time Between Eviction |
Runs Millis | 时间后任然没有使用,则被物理性的关闭掉 |
Auto Commit | 自动提交sql语句,如:修改数据库时,自动 commit |
Transaction isolation | 事务隔离级别 |
Preinit Pool | 1、立即初始化连接池 2、如果为 False,则第一个 JDBC 请求的响应时间会较长,因为包含了连接池建立的时间 |
- 面板数据库连接配置
面板字段 | 含义 |
---|---|
Database URL | 数据库连接 URL |
JDBC Driver class | 数据库驱动 |
Username | 数据库登录用户名 |
Password | 数据库登录密码 |
Connection Properties | 建立连接时要设置的连接属性 |
添加 JDBC Request
- 路径:线程组 > 添加 > 取样器 > JDBC Request
- 示意图:
- 面板字段含义
面板字段 | 含义 |
---|---|
Variable Name Bound to Poo | 数据库连接池配置的名称 |
Query Type | sql 语句的类型 |
SQL Query | sql 语句 语句结尾不需要添加 变量用 ? 占位 |
Parameter values | 需要传递的变量值,多个变量用 , 分隔 |
Parameter types | 变量类型 |
Variable Names | 1、保存sql语句返回的数据和返回数据的总行数 2、用 , 分隔 3、跳过列用空 4、Result Variable Name |
Query timeout(s) | 1、 超时时间 2、默认0,代表无限时间 |
Limit ResultSet | 和 limit 类似作用,限制 sql 语句返回结果集的行数 |
Handle ResultSet | 1、如何定义 callable statements 返回的结果集 2、默认是存储为字符串 |
三 、另外的一些检测方法
Google performance检测
- PC 网页端
- 记录加载速度
- 录制结果
- 重点字段:Scripting (调接口的速度参考)
- 运行结果s = Total - Idle
Lighthouse
- PC 网页端
- 谷歌插件,需自行商城下载
- 重要指标:FCP,LCP,TBT,SI
- 重要指标评分标准转载网址
Azure Monitor
- Azure Monitor手册
- 反映 Azure 资源的运行状况和使用情况统计信息
批量数据导入
- 使用csv文件
- 如果遇到表列名是uniqueidentifier类型,无法导csv文件数据进表可采取方法
- 生成【原表】的创表语句,修改:uniqueidentifier类型 —> 其他字符类型,例如:nvarchar(50)
- 注:创建【中间表】可能需要删除原sql中key设置
- 把数据csv文件导入【中间表】
- 从【中间表】把数据导入【原表】
- 使用insert into 【原表】([原表字段]) select [中间表字段] from 【中间表】;
- select uniqueidentifier类型的字段需要进行转换:
insert into 原表 ([原表字段]) select [中间表字段] from 中间表;
TRY_CONVERT(UNIQUEIDENTIFIER, [中间表字段]) [中间表字段]
-- 或者可能需要
TRY_CONVERT(UNIQUEIDENTIFIER, ISNULL([中间表字段],'00000000-0000-0000-0000-000000000000')) [中间表字段]
-- 或者可能需要
ISNULL([中间表字段],0) [中间表字段]