# jmeter day_3
### 1.jmeter函数
#### 1.1跨线程组关联
- 1.提升线程组中变量的作用域
- 局部变量--->全局变量
- 1.setProperty提升线程组中变量的作用域
- 属性名称: 变量提升作用域后的新名字
- value: 提取器中的值
- 2.将setProperty函数复制到--->Bean Shell取样器中
- 2.接收提升作用域后变量
- 1.property
- 属性名称: 新变量名
- 2.将property函数复制到其他线程组中使用
### 2.集合点(并发)
- 组件: 同步定时器 Synchronizing Timer
- 位置: 定时器
- 1.当超时时间为0时:
- 0.并发数量必须满足模拟用户组数量,才发起并发
- 1.线程数≥模拟用户组的数量
- 2.线程数能够整除模拟用户组的数量
- 3.真正的并发数量==模拟用户组的数量
- 2.当超时时间不为0时:
- 0.到时间就发起并发,不在乎并发数量是否达到预计要求
- 1.超时时间≥线程组启动时间
### 3.jmeter分布式(重点)
- 1.编写性能测试脚本
- 2.执行机(slaver)
- 修改jmeter配置文件 jmeter.properties--->bin
- 1.修改remote_hosts = ip:1099 --->260行
- server.rmi.ssl.disable=true --->336行
- 2.禁用不用网卡
- 3.关闭防火墙
- 4.保存配置文件,启动jmeter-server.bat
- 3.控制机(master)
- 修改jmeter配置文件 jmeter.properties--->bin
- 1.修改remote_hosts = ip:1099 --->260行,执行机的IP:1099,多个使用逗号分隔
- server.rmi.ssl.disable=true --->336行
- 2.禁用不用网卡
- 3.关闭防火墙
- 4.保存配置文件,启动jmeter-server.bat
- 4.注意事项:
- 1.执行脚本,控制机和执行机放在同一路径下
- 2.执行之前,控制机和执行机互ping IP
- 3.控制机和执行机jmeter版本一致
### 4.逻辑控制器
- 逻辑控制器特点
- ==只能在线程组中添加==
- 安装插件--- Dummy Sampler
- DummySampler 模拟取样器
#### 4.1 如果(If)控制器
- 位置: 逻辑控制器--->如果(if)控制器
- 配置if控制器
- 借助函数 \_\_jexl3或\_\_groovy函数,将条件表达式结果先做一次运算
- ${\_\_groovy(表达式,)}
- 当表达式结果为true,执行控制器内的取样器,反之则不执行
- 注意事项:
- 字符串比较加引号,包括对变量引用都需要引号
- java中布尔值true,false都是小写
- 应用场景--->浏览商品 假设用户男女比例 2:3 ==用户分流== 1000
- 化妆品
- 电子产品
取余 模 1%5 0 1 2 3 4
- 使用评估if控制器下所有的取样器执行情况判断是否执行
- 1.勾选 Evaluate for all children
- 2.点击 Use status of last sample
- 通过判断上一个取样器的执行结果来决定是否执行下一个取样器
#### 4.2循环控制器
- 位置: 逻辑控制器
- 作用: 重复执行取样器
- 作用于,控制器内取样器
- 使用场景: 流量叠加
==循环控制器和if控制器可以嵌套使用==
#### 4.3 ForEach控制器
- 位置: 逻辑控制器
- 作用: 遍历
- 使用方式:
- 1.和用户定义的变量配合使用
- 2.在用户定义变量中添加数据
- 变量名: 变量名前缀_数字 数字连续的
- 2.配置Foreach控制器
- 1.输入变量名前缀: 用户定义变量中的变量名前缀
- 2.开始循环字段(不包含):数字
- 3.结束循环字段(包含):数字
- 4.输出变量名: 新变量名称
### 5.jmeter元件执行顺序
- 1.常用元件执行顺序
- 配置元件 ---1
- 前置处理器 ---- 2
- 定时器 -----3
- 取样器 -----4
- 后置处理器 ---5
- 断言 --- 6
- 监听器 --- 7
==当测试计划中有多个同级且相同的元件时,执行顺序按照位置先后顺序执行==
- 逻辑控制器
- 2.元件作用范围
- 监听器,配置元件,前/后置处理器,断言,定时器: 作用范围父级和兄弟级
- 逻辑控制器: 只适用于子级
### 6.jmeter命令行模式
jmeter -n -t jmeter脚本路径 -l 结果文件夹\结果文件名.jtl -e -o 测试报告文件夹
### 7.jmeter常用插件
# jmeter day_3
### 1.jmeter函数
#### 1.1跨线程组关联
- 1.提升线程组中变量的作用域
- 局部变量--->全局变量
- 1.setProperty提升线程组中变量的作用域
- 属性名称: 变量提升作用域后的新名字
- value: 提取器中的值
- 2.将setProperty函数复制到--->Bean Shell取样器中
- 2.接收提升作用域后变量
- 1.property
- 属性名称: 新变量名
- 2.将property函数复制到其他线程组中使用
### 2.集合点(并发)
- 组件: 同步定时器 Synchronizing Timer
- 位置: 定时器
- 1.当超时时间为0时:
- 0.并发数量必须满足模拟用户组数量,才发起并发
- 1.线程数≥模拟用户组的数量
- 2.线程数能够整除模拟用户组的数量
- 3.真正的并发数量==模拟用户组的数量
- 2.当超时时间不为0时:
- 0.到时间就发起并发,不在乎并发数量是否达到预计要求
- 1.超时时间≥线程组启动时间
### 3.jmeter分布式(重点)
- 1.编写性能测试脚本
- 2.执行机(slaver)
- 修改jmeter配置文件 jmeter.properties--->bin
- 1.修改remote_hosts = ip:1099 --->260行
- server.rmi.ssl.disable=true --->336行
- 2.禁用不用网卡
- 3.关闭防火墙
- 4.保存配置文件,启动jmeter-server.bat
- 3.控制机(master)
- 修改jmeter配置文件 jmeter.properties--->bin
- 1.修改remote_hosts = ip:1099 --->260行,执行机的IP:1099,多个使用逗号分隔
- server.rmi.ssl.disable=true --->336行
- 2.禁用不用网卡
- 3.关闭防火墙
- 4.保存配置文件,启动jmeter-server.bat
- 4.注意事项:
- 1.执行脚本,控制机和执行机放在同一路径下
- 2.执行之前,控制机和执行机互ping IP
- 3.控制机和执行机jmeter版本一致
### 4.逻辑控制器
- 逻辑控制器特点
- ==只能在线程组中添加==
- 安装插件--- Dummy Sampler
- DummySampler 模拟取样器
#### 4.1 如果(If)控制器
- 位置: 逻辑控制器--->如果(if)控制器
- 配置if控制器
- 借助函数 \_\_jexl3或\_\_groovy函数,将条件表达式结果先做一次运算
- ${\_\_groovy(表达式,)}
- 当表达式结果为true,执行控制器内的取样器,反之则不执行
- 注意事项:
- 字符串比较加引号,包括对变量引用都需要引号
- java中布尔值true,false都是小写
- 应用场景--->浏览商品 假设用户男女比例 2:3 ==用户分流== 1000
- 化妆品
- 电子产品
取余 模 1%5 0 1 2 3 4
- 使用评估if控制器下所有的取样器执行情况判断是否执行
- 1.勾选 Evaluate for all children
- 2.点击 Use status of last sample
- 通过判断上一个取样器的执行结果来决定是否执行下一个取样器
#### 4.2循环控制器
- 位置: 逻辑控制器
- 作用: 重复执行取样器
- 作用于,控制器内取样器
- 使用场景: 流量叠加
==循环控制器和if控制器可以嵌套使用==
#### 4.3 ForEach控制器
- 位置: 逻辑控制器
- 作用: 遍历
- 使用方式:
- 1.和用户定义的变量配合使用
- 2.在用户定义变量中添加数据
- 变量名: 变量名前缀_数字 数字连续的
- 2.配置Foreach控制器
- 1.输入变量名前缀: 用户定义变量中的变量名前缀
- 2.开始循环字段(不包含):数字
- 3.结束循环字段(包含):数字
- 4.输出变量名: 新变量名称
### 5.jmeter元件执行顺序
- 1.常用元件执行顺序
- 配置元件 ---1
- 前置处理器 ---- 2
- 定时器 -----3
- 取样器 -----4
- 后置处理器 ---5
- 断言 --- 6
- 监听器 --- 7
==当测试计划中有多个同级且相同的元件时,执行顺序按照位置先后顺序执行==
- 逻辑控制器
- 2.元件作用范围
- 监听器,配置元件,前/后置处理器,断言,定时器: 作用范围父级和兄弟级
- 逻辑控制器: 只适用于子级
### 6.jmeter命令行模式
jmeter -n -t jmeter脚本路径 -l 结果文件夹\结果文件名.jtl -e -o 测试报告文件夹
==使用命令行模式执行之前: 保证存放执行结果的文件夹和存放测试报告的文件夹为空==
### 7.jmeter常用插件
#### 7.1并发线程组
![并发线程组](D:\0812软件测试精英班\17_性能测试\20201124性能测试day_5\doc\并发线程组.png)
1.已知并发数量进行性能测试
2.已知吞吐量(TPS)进行性能测试
- 1.通过设置吞吐量,得到实际的响应时间
- 2.算出并发数
常识:
- 单个接口响应时间 200ms
- 性能测试增加负载曲线角度,加压过程45角,降压最好不超过60°
#### 7.2 终极线程组
1.浪涌
- Delay时间 = 上一组持续时间+上一组释放时间+上一组等待时间
2.持续加压
- 定制加压策略:
- 根据项目实际使用情况----线上数据收集整理统计
- 线性增长
- 指数增长
- 持续时间
- 持续加压每组数据Delay时间+持续时间都是相同的
- Delay递增
- 持续时间递减
#### 7.3.jmeter监控服务器
- 1.使用插件 Server-Agent
- 2.==插件在服务器上启动==
- 3.设置监控项
- CPU
- 内存
- 网络
- 磁盘
- 4.添加组件 监听器--->PerfMon Metrics Collector
- Host/IP --->服务器域名/IP
- Port ---->Server-Agent启动占用的端口号 4444
- Metrics ---->监控具体硬件
- Metrics Parameter ---->对应硬件中的具体--->进程
## jmeter性能测试实践
性能测试流程
### 1.确定性能测试需求
- 客户/BOSS
- 线上数据---最近3个月 对项目中重点功能或者关心的功能埋点
- 确定测试模块(场景/业务)
- 使用频繁
- 不能出错功能
- 占用资源较大
- 举例 电商项目 ==每天交易量为 40万笔==
- 首页 1 40% 2960
- 登录------一般单独测试
- 搜索商品/商品详情 2 56% 4144
- 购物车 3 3.5% 259
- 订单 4 0.5% 37
- 确认订单
- 生成订单
- 支付回调
- 订单状态迁移
- 快递物流查询 重复查询
计算并数量
28原则: 交易量80%是在每天20%时间完成的
32万笔 4.8小时----->18.5笔/秒---->TPS---->并发数=TPS×响应时间(2s)--->37个
平均并发=(单笔业务时间*业务总量)/业务时间
(2*400000*0.8)/24*0.2*3600=37
### 2.确定性能测试指标
并发数量:
响应时间: 2s
吞吐量:
CPU <75%
内存 <75%
### 3.编写jmeter性能测试脚本
#### 3.1首页--->分析各个接口请求频率
#### 3.2登录
- 1.登录单独做性能测试
- 针对不同模块做性能测试时,侧重点不同
- 体量较大的项目,登录是单独系统
import java.io.FileWriter;
import java.io.BufferedWriter;
FileWriter fstream = new FileWriter("E:/code/user_token.csv",true);
BufferedWriter out = new BufferedWriter(fstream);
//out.write(vars.get("session")+"\n");
out.write("${tokenHead} "+"${token}\r\n");
out.flush();//把缓存区内容压入文件
out.close();//关闭文件
fstream.close();