零、 一些乱七八糟的废话
性能关键指标
多 - 并发量 能够支持最大的用户访问量
快 - 响应时间 有多快
好 - 稳定性 (长时间运行)
省 - 资源使用率
加上 思考时间
- 响应时间 - 普遍接受响应时间 2、5、8秒 好,可以接受,上限
- 并发用户数 影响最大的是内存
并发用户数C计算:C = nL/T
C - 平均并发用户数
n - 平均每天访问用户数
L - 一天内用户从登录到退出的平均时间
T - 是考察时间长度(一天内多长时间有用户使用系统)
并发用户数峰值C^计算
C^ 约等于 C + 3 根号C
系统用户数 - 注册用户量 影响的是磁盘空间初始化性能环境 warm up 热机*也就是说 模拟实际使用场景,用户量之类的 磁盘到内存的过程
关于 异地访问服务器 响应时间的差异 找运维 - 在两个防火墙之间注入网络延时 - 吞吐量 -
- 系统性能计数器 -
-
思考时间 - 更加真实的模拟用户使用
用户300的时候出现拐点,说明饱和了,性能瓶颈,这种平直线多数是因为网络问题,需要增加带宽,丢包了
平直线部分如果是波浪线需要加服务器,内存满了,还是cpu满了
每台机器能创建多少个用户 由1. 机器的内存(物理内存)和
2.jmeter 是一个java进程 - 进程需要一定的内存资源-堆内存
3.端口号,占用端口号分布不均 需要用主从机-分布式-负载均衡
一、 安装
mac版本
//www.greatytc.com/p/bce9077d883c
- 下载 pache-jmeter-5.0.tgz 放网盘了
- 需要java8的环境 java环境看前边的笔记
- 配置PATH 使得终端 输入jmeter就可以打开
open ~/.bash_profile
export JMETER_HOME=/Users/lxr/apache-jmeter-5.0
export PATH=$JAVA_HOME/bin:$PATH:.:$JMETER_HOME/bin:$PATH
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JMETER_HOME/lib/ext/ApacheJMeter_core.jar:$JMETER_HOME/lib/jorphan.jar:$JMETER_HOME/lib/logkit-2.0.jar
source ~/.bash_profile
然后就可以在终端输入 jmeter
打开jmeter程序了
-
设置jmeter语言
通常是写http的请求,写不了解的请求时,可以用这个模板 - 关于jmeter的属性设置
(1)/Users/lxr/apache-jmeter-5.0/bin/jmeter.properties
#language=en -> language=zh_CN
(2)分布式 remote_hosts ip地址逗号隔开
二、 jmeter 使用
1.配置元件
HTTP请求默认值
HTTP消息头管理
HTTPCookie管理器
HTTPCache管理器
2.监听器
①察看结果树※
I:分析某个请求明细、详情:请求头、请求体;响应头、响应体
II:性能场景 分析请求错误原因 之类的
②聚合报告 汇总统计:请求数、响应时间(平均、90%、95%、min、max 毫秒)、错误率、吞吐量(越高越好)、发送/接受量(带宽)
③用表格查看结果(能体现起始时间)
④图形结果
3.其他元件
①前置处理器(发送请求前执行的元件。比如加密、)
②后置处理器(比如:提取数据)
③定时器(1.思考时间-固定定时器;2.同步定时器-集合点几点抢购;3.随机定时器;4.吞吐量定时器)
- 创建测试计划 选择保存位置
-
创建线程组 不做负载就线程数之类的全部 输入1
- 增加HTTP请求 - 保存
测试环境正式环境 需要来回切换之类的所以 要有一个 HTTP请求默认值,里头弄好了,其他的请求 一样 就不用写了
4.察看结果树 看接口请求结果 线程组 右键 添加 监听 查看结果树.csv
,图中文件写入选择它,运行结果就会保存到这个路径下的csv文件中
用表格查看结果 添加 - 监听器 - -
HTTP Cookie管理器 - 有些需要有cookie作为参数的接口需要 添加配置元件 HTTP Cookie管理器 添加了 放在这里就成了 自己就存起来了
- Token获取
添加 http请求 返回token的${token}
-
响应断言 - 在要执行断言的 请求下添加 注意作用域,可以拖拽过去
-
线程组下 右键 添加 监听器 断言结果 ,然后运行 绿三角
-
聚合报告
-
生成HTML报告
关于脚本录制,可以用Fiddler抓包,可以导出jmx文件 用jmeter打开
Part2、代理 脚本录制
- 新建线程组
-
测试计划 添加 非测试元件 HTTP代理服务器
-
打开浏览器(谷歌为例)
设置 -> 高级 -> 系统 -> 打开您计算机的代理设置
导入证书 设置 - 高级 - 隐私设置和安全性 - 安全 - 下滑 管理证书
-
Windows
-
Mac
双击点开证书
- Requests Filtering - 包含模式 - 排除模式 设置正则
.*www\.wanandroid\.com.*
.*\.(js|css|PNG|jpg|ico|png|gif).*
-
启动HTTP代理服务器
- 浏览网页 即可录制成功,添加 - 察看结果树 能察看结果
prat3、苹果电脑 录制 苹果手机
-
PC http代理 系统设置 - 网络 - 高级 - 代理 - 勾选输入 - 好 - 应用
-
jmeter HTTP代理服务器设置 - 点运行 - bin文件夹下生成证书
- iPhone 安装jmeter的信任证书
cd /Users/lxr/apache-jmeter-5.4/bin
python3 -m http.server 8080
访问http://[ip地址]:8080
下载证书 - 并去设置里安装信任证书
-
手机配置 代理
设置 - 无线局域网 - ① i - 配置代理 - 电脑iP 刚电脑上网络页面就有 - 端口号8888 设置完了,手机连不上网了去检查jmeterHTTP代理服务器启动了没有
-
启动jmeterHTTP代理服务器后 这个弹框不能关闭
Part4、参数化
概要
- 参数化流程
- 找出需要做参数化的数据
- 准备提供给参数化需要的数据源
- 关联数据 把脚本里的常量变成变量(使用前面的数据源数据)
- jmeter参数化方式
① CSV -- 需要配置的元件
② 函数式(随机数、时间 time、counter计数器)
③ 变量
④ 编程式
使用场景
-
CSV 账号密码 作用域看这个数据源给谁用
token 后置 JSON提取器
-
函数式
-
变量
- 编程式
- 引入外部的jar、java、class包
- 使用beanshell编程
Part5、Jmeter用正则关联
- 正则表达式
()括起来的部分就是要提取的部分
. 匹配任何字符串
- 一次或多次
? 找到第一个匹配项后就停止
应用
获取公众号列表https://wanandroid.com/wxarticle/chapters/json
https://wanandroid.com/wxarticle/list/408/1/json
方法:GET
参数:
公众号 ID:拼接在 url 中,eg:405
公众号页码:拼接在url 中,eg:1
用美元符号来应用该变量
Part5、集合点技术
eg:到点抢购
给登录请求 添加 - 定时器 - Sychronizing Timer (同步定时器)
两个输入项
模拟用户组的数量(Number of simulated Users to Group by):集合够多少个用户/线程后发一次请求
???0 就是跟线程组设置的线程数一样??但是我的不是这样 还是差几毫秒的,填跟线程组设置 线程一样的话 就是同时了
超时时间(Timeout):等待集合,直到超时 ms 毫秒,(设置值大于线程数量,或者最后的一批个数 不够一拨了比如 线程数5 设置2个一拨 最后一个等不齐,就只能等超时了)
Part6、实战
新的点
-
仅一次控制器 某些请求 只想每个用户执行一次 添加 - 逻辑控制器 - 仅一次控制器
将请求拖进里边
-
测试计划 中有多个线程组,默认是同事执行的 勾选后就是按照顺序执行,但是不影响setup 和 teardown
- 用户自定义变量 将项目中用到的会重复使用会变的 全局的东西拿出来
脚本开发 - 参数化数据 并发登录,多用户(不同账号)
- 准备好数据源
- 脚本中的常量 改成 变量 (将用户名 密码 用变量代替)
CSV 数据文件设置
Part 7
性能调优https://www.bilibili.com/video/BV1xV411m7eo
- 聚合报告
- Grafana 性能调优
- 命令行 top
分析过程 - 聚合报告 响应时间 错误率 吞吐量 来判断 问题出现在哪里
eg:响应时间大于预期值 - Grafana 性能调优 通过Grafana查看是什么东西的问题
eg:发现CPU爆红 使用率过高 - 命令行 top 查看具体哪个进程使用CPU高
结合看
先用python代码给 100个账号密码 写入文件
with open('/Users/lxr/jmeter_file/都市商城账号.txt', 'w') as file:
for i in range(1,100):
num_str = (3-len(str(i)))*'0' + str(i)
file_str = 'sq'+num_str+','+'123456'+'\n'
print(file_str,type(file_str))
file.write(file_str)
20秒内生成100个用户,每秒5个用户,持续执行10秒钟