零、 一些亂七八糟的廢話
性能關鍵指標
多 - 并發量 能夠支持最大的用戶訪問量
快 - 響應時間 有多快
好 - 穩定性 (長時間運行)
省 - 資源使用率
加上 思考時間
- 響應時間 - 普遍接受響應時間 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版本
http://www.lxweimin.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秒鐘