一、Jmeter介紹
jmeter是Apache組織基於java開發的一款性能測試軟件。是一款開源、小巧、支持多協議(HTTP/HTTPS、JDBC、JAVA...等等)、眾多插件為一體的強大工具。
它不僅做性能測試,還可以做接口的自動化測試。
優點
1.開源免費
2.體積小
3.有豐富的第三方插件
缺點
1.不支持ip欺騙
2.報表的精度比LR要差
二、Jmeter文件目錄介紹
1.1 bin目錄
存放可執行文件和配置文件
jmeter.bat:windows的啟動文件
jmeter.log:日志文件
jmeter.sh:linux的啟動文件
jmeter-properties:系統配置文件
jmeter-server.bat:windows分布式測試要用到的服務器配置
jmeter-server:linux分布式測試要用到的服務器配置
1.2 docs目錄
docs:是Jmeter的api文檔,可打開api/index.html頁面來查看
1.3 printable_docs目錄
printable_docs的usermanual子目錄下的內容是Jmeter的用戶手冊文檔。
usermanual下component_reference.html是最常用到的核心元件幫助文檔。
提示:printable_docs的demos子目錄下有些常用Jmeter腳本案例,可以參考。
1.4 lib目錄
該目錄用來存放Jmeter依賴的jar包和用戶擴展所依賴的jar包。
三、Jmeter的基礎配置
漢化設置
-
臨時修改:
options--->language--->choose language--->Chinese
-
永久修改:
-
打開jmeter.properties
-
修改language=zh_CN
-
重啟jmeter
-
主題修改
選項--->主題--->選擇對應的主題,重啟jmeter
四、Jmeter的基本操作
- 啟動jmeter
- 添加線程組
- 添加http請求的取樣器,並配置
- 添加查詢結果樹的監聽器
- 點擊"啟動"運行jmeter,並查看結果
基本元件
線程組:模擬用戶的。
配置元件:進行測試環境和測試數據初始化--->比如自動化腳本中setup
前置處理器:對要發送請求進行預處理--->比如自動化腳本中參數化
取樣器:往服務器發送請求--->比如自動化腳本中發請求的代碼
后置處理器:對收到服務器的響應進行數據提取--->比如自動化腳本中獲取響應中特定字段語句
斷言:將收到響應結果又預期結果做對比--->比如自動化腳本中斷言
監聽器:查看測試腳本運行后結果和日志--->比如自動化腳本中測試報告
定時器:等待一段時間--->比如自動化腳本中sleep
測試片段:封裝基本功能,不單獨執行,需要通過腳本的調用才能執行--->比如自動化腳本中封裝函數
作用域
核心:根據測試計划中的樹形結構的父子節點來確定的
原則:
- 取樣器是沒有作用域的。
- 邏輯控制器:只對其子節點下的所有元件有效。
- 其他的元件。
- 如果其父節點是取樣器,則只對父節點取樣器有效。
- 如果其父節點不是取樣器,對父節點下所有子節點及節點中子節點有效。
元件的執行順序
順序:配置元件--->前置處理器--->定時器--->取樣器--->后置處理器--->斷言--->監聽器
注意:
- 配置元件、前置處理器、后置處理器都需要依賴取樣器才能運行
- 在同一個作用域下,相同類型元件執行順序是從上到下來按順序執行
Jemter重要的三個組件
線程組
作用:通過配置線程組中的線程數來模擬用戶。線程數就是用戶數,線程組是用戶組
特點:
- 模擬多用戶
- 取樣器和邏輯控制器必須在線程組下使用
- 一個測試計划下可以添加多個線程組,可以並行或串行執行
- 並行:默認情況下線程組為並行執行
- 串行:在測試計划下勾上"獨立運行每個線程組"
線程組的分類:
- setup線程組:擁有測試前預處理操作,在所有線程組中最先執行
- 普通線程組:來執行業務測試腳本
- teardown線程組:用來測試后的后置處理(數據、恢復環境)的操作,在所有的線程組中最后執行
線程組的屬性
線程數:模擬虛擬用戶數
Ramp-up時間:虛擬用戶啟動所需要的時間
循環次數:
- 配置指定次數:控制腳本運行執行的次數
- 配置循環永遠
- 需要調度器配置使用
- 運行時間:腳本執行的時間
- 延遲啟動時間:腳本等待特定的時間才能開始運行
http請求
http協議:可以填寫為HTTP或者HTTPS,默認不填寫為HTTP協議
http主機名/ip:如:http://baidu.com 80
端口:可以填寫為任意值。默認不填寫時為80端口
請求發方法:HTTP協議所有支持的所有方法
路徑:目錄+參數
編碼格式:默認IOS國際標准,推薦使用utf-8
查看結果樹
取樣器結果:統計請求相關的信息
請求:HTTP請求的請求頭和請求體的詳情信息
響應:HTTP響應的響應頭和響應體的詳情信息
jmeter響應中出現亂碼時:
- 修改jmeter.properties文件中,sampleresult.default.encoding=utf-8
- 重啟jmeter
五、Jmeter參數化常用方式
用戶定義的變量
- 方式1:
添加:線程組--->配置元件--->用戶自定義變量
配置:參數名+參數值
使用:在HTTP請求的取樣器中引用定義變量。$(參數名)
- 方式2:
配置:在測試計划中去配置用戶定義變量
使用:在HTTP請求的取樣器中引用定義變量。$(參數名)
應用場景:當大量腳本中的參數值需要修改時候,直接修改用戶定義變量中值會更方便
用戶參數
添加:線程組--->前置處理器--->用戶參數
配置:
- 參數:添加變量
- 參數值:添加用戶--->針對每個用戶配置不同的參數值
使用:在HTTP請求的取樣器中引用定義的變量。$(參數名)
應用場景:可以針對不同的用戶獲取到不同的參數值
CSV Data Set Config
添加:線程組--->配置元件--->CSV數據文件設置
編寫CSV數據文件(.csv作為后綴):
- 多個參數寫為多列,其中用逗號分隔
- 多組參數值,則使用多行來設置
配置:
- 路徑
- 文件編碼:UTF-8
- 變量名稱:從CSV數據文件中讀取的數據需要保存變量名。有多個變量時用逗號分隔
- 是否忽略首行:是否從CSV文件第一行中開始讀取
- 分隔符:要求與CSV數據文件中多列的分隔符一致
- 遇到文件結束符是否再次循環:默認TRUE
- 遇到文件結束符是否停止線程:當前一個參數為FALSE,該參數有效,一般設置為TRUE
函數
counter:
- TRUE:每個用戶使用獨立計數器
- FALSE:所有的用戶使用全局計數器
引用:在取樣器中使用$(__counter(FALSE,))來引用對應值
建議大家使用函數方式
六、Jmeter斷言
作用:讓腳本自動化執行過程中,能夠自動判定執行結果是否符合要求時候,需要添加斷言
響應斷言
添加:線程組--->HTTP請求--->斷言--->響應斷言
配置:
- 測試字段:需要檢查的字段
- 模式匹配規則:需要使用什么規則來進行檢查
- 測試模式:需要校驗的值
Json斷言
適用於返回的HTTP響應為JSON格式
添加:線程組--->HTTP請求--->斷言--->JSON斷言
配置:
- JSON PATH:$.weatherinfo.city
- 勾選"Addltonal assert value"
- 在expected value里填寫期望值
斷言持續時間:
適用於性能測試時,檢查HTTP請求的響應時間是否超過預期值
添加:線程組--->HTTP請求--->斷言--->斷言持續時間
配置:預期時間
七、Jmeter關聯(提取器、數據庫、邏輯控制器等)
當多個請求之間有依賴關系,后一個請求的參數需要使用前一個請求的響應數據時,需要用到關聯。
分類:
- 正則表達式提取器
- xpath提取器
- Json提取器
提取器
正則提取器
添加:線程組--->HTTP請求--->后置處理器--->正則表達式提取器
配置:
- 要檢查的響應字段:默認主體
- 引用名稱:匹配后的數據要存儲的變量名
- 正則表達式:
<p>(.*?)</p>,"()"里是要保存的數據
- 模板:$1$
- 數據1代表上面正則表達式中第幾個()
- 匹配數字:0代表隨機值、1代表第一個結果,-1代表所有結果
- 缺省值:當沒有匹配上時將該值保存到變量里
xpath提取器
添加:線程組--->HTTP請求--->后置處理器--->xpath提取器
配置:
- 引用名稱:匹配后的數據要存儲的變量名
- xpath path:xpath匹配規則
- 匹配數字:0代表隨機值、1代表第一個結果,-1代表所有結果
- 缺省值:當沒有匹配上時將該值保存到變量里
json提取器
添加:線程組--->HTTP請求--->后置處理器--->json提取器
配置:
- 引用名稱:匹配后的數據要存儲的變量名
- json path:json路徑。$.weatherinfo.city
引用:直接引用變量名即可
八、Jmeter數據庫連接與操作
連接准備:
- 打開數據庫,確定數據庫的表及對應的字段
- 加載mysql的jdbc驅動
- 方法一:將jdbc驅動通過測試計划,瀏覽的方式添加
- 方式二:將jdbc驅動jar包放入到lib\ext目錄下,並重啟jmeter
- 配置jdbc connection configuration
- created pool name:給連接池命名,用於后續引用
- 數據庫URL:jdbc:mysql://127.0.0.1:3306/test
- 用戶名
- 密碼
直連數據庫使用:
- 添加JDBC Request:取樣器下添加
- 配置:
- 配置連接池名稱
- 配置SQL語句
- 配置保存的變量名
- 如果SQL語句返回了多個參數,輸入相同個數的變量名來保存
- HTTP斷言中,就可以引用變量來進行判斷
九、Jmeter的邏輯控制器
控制元件的執行順序
if控制器
添加:線程組--->邏輯控制器--->if控制器
配置:
- 使用JS預發:"${name}"=="baidu"
- 使用jmeter函數的方式:${__jexl3("${name}"=="baidu",)}
- 推薦使用函數的方式
循環控制器
指定HTTP請求執行特定的次數
添加:線程組--->邏輯控制器--->循環控制器
配置:次數
循環控制器中的循環次數配置m與線程組中的循環次數n配置對比:
- 關系:如果同時配置,循環控制器下HTTP請求實際執行的次數應該是n*m
- 區別:這兩個循環次數作用域不同
ForEach控制器
與用戶定義的變量或正則表達式提取器配合使用,循環讀取返回的變量值,執行一次或多次。
-
與用戶定義的變量配合
添加:線程組--->邏輯控制器--->ForEach控制器
配置:
-
用戶定義的變量
- 變量名:固定前綴+連續數字
-
ForEach控制器
- 變量前綴:用戶定義的變量中配置的固定前綴
- 起始數字:連續數字的最小值-1
- 結束數字:連續數字的最大值
- 輸出變量名稱:依次讀取變量值后存儲到參數中,共HTTP請求來引用
-
HTTP請求:
- 引用輸出的變量名稱
-
-
與正則表達式配合使用
- 先通過正則表達式提取器,提取出請求中所有滿足條件數據
- 添加ForEach控制器,並配置提取所有滿足條件的數據,並保存為變量
- 在其子節點下,添加HTTP請求並引用變量,可循環讀取正則表達式里匹配的所有數據
十、Jmeter定時器
同步定時器
需要進行大量用戶的並發測試時,為了讓用戶能真正同時執行,添加"同步定時器"使其阻塞線程,直到線程達到了預先設置數值,才開始進行取樣器操作。
配置:
-
並發數:同事達到多少用戶才開始發請求
-
超時時間:
- 必須配置:否則當虛擬用戶數無法被並發數整除時,會導致有部分用戶掛起無法執行
- 配置不能太短:必須比並發數加載時間要長。否則無法達到並發數的要求,數據就會被釋放掉
常數吞吐量定時器
用於性能測試中模擬用戶產生業務壓力,通過給定QPS來對服務器發送固定頻率要求。
添加:線程組--->HTTP取樣器--->常數吞吐量定時器
配置:吞吐量的值QPS*60
十一、Jmeter的分布式
原理:
- 分布式測試時分為一台控制機和多台代理機
- 控制機負責發布測試任務給代理機
- 代理機接收任務並向服務器發送請求,並接收服務器返回的響應,然后將測試結果返回給控制機
- 由控制機對測試結果數據進行匯總統計
分布式相關注意事項:
- 所有的測試機防火牆都已經關閉
- 所有的測試機及服務器在同一個網絡內
- 所有的測試機的jmeter版本和JDK版本完全相同
- 關閉jmeter里的RMI SSL開關
分布式配置
配置
- 代理機
- server_port:不重復。如果使用多個機器做代理機,可不用配置
- 關閉RMI SSL
- 控制機
- remote_server:所有代理機的IP+port,有多個代理機時要使用逗號分隔
- 關閉RMI SSL
運行
- 代理機
- jmeter-server.bat運行
- 控制機:
- jmeter.bat運行
- 控制代理機執行腳本,運行--->遠程啟動所有
十二、報告結果分析
聚合報告
具體參數說明如下:
Label:就是請求名稱
#樣本:總線程數,值 = 線程數 * 循環次數=20*10=200
平均值:單個請求的平均響應時間,值 = 總運行時間 / 發送到服務器的總請求數
中位數、90%百分位、95%百分位、99%百分位分別代表50%的用戶響應時間、90%的用戶響應時間、95%的用戶響應時間、99%的用戶響應時間,也就是有百分之多少的請求小於這個值。其中,90%百分位是性能測試中比較重要的一個衡量指標。
最小值:最小響應時間
最大值:最大響應時間
異常%:錯誤率,發生錯誤的請求 / 總請求數,上面示例中錯誤率為0
吞吐量:表示每秒完成的請求數。
接收KB/sec或發送KB/sec:以每秒接收或發送的千字節為單位測量的吞吐量
圖形報告
具體參數說明如下:
樣本數目:總的請求數
最新樣本:最后一次請求的響應時間
平均:所有請求的平均響應時間
偏離:響應時間變化、離散程度測量值的大小,也就是數據的分布偏差,值越小越好
吞吐量:服務器每分鍾處理的請求數,相當於TPS,注意單位是分鍾
中值:響應時間的50%百分位的值,也就是有50%的請求響應時間小於該值
表格報告
具體參數說明如下:
Sample#:每個請求的序號。
Start Time:每個請求開始時間。(時:分:秒.毫秒)
Thread Name:每個線程的名稱(線程序號-第N次循環次數)。
Label:每個請求的自定義名稱(無修改時默認顯示請求類型,如Http,FTP等請求)。
Sample Time(ms):每個請求的響應時間。(單位:毫秒)
Status:請求狀態,如果為勾則表示成功,如果為叉表示失敗。
Bytes:響應的字節數,請求的字節數。
Sent Bytes:發送的字節數。
Latency:延遲的時間,等待時長。(單位:毫秒)
Connect Time(ms):連接服務器的時間。(單位:毫秒)
樣本數目:所有請求個數,樣本數目 = 線程數(請求用戶數)* 請求次數 。(單位:個)
平均:所有請求的平均響應時間。(單位:毫秒)
最新樣本:最新樣本響應時間,表示服務器響應最后一個請求的時間。(單位:毫秒)
偏離:服務器響應時間變化、離散程度測量值的大小,或者,換句話說,就是數據的分布。
一般而言,性能測試中我們需要重點關注的數據有: #Samples 請求數,Average 平均響應時間,Min 最小響應時間,Max 最大響應時間,Error% 錯誤率及Throughput 吞吐量。
Jmeter自動化實戰
接口自動化測試框架: jmeter + ant + jenkins:
待更新
Jmeter性能測試實戰
【性能測試實戰】jmeter+k8s+微服務+skywalking+efk:
待更新