一篇文章带你掌握性能测试工具——Jmeter
一篇文章帶你掌握性能測試工具——Jmeter
在目前的中大型企業中,僅僅進行功能測試已經不足以滿足企業的需求,在重大客戶基數下性能測試將會直接影響到用戶體驗
所以在這篇文章中我們將會學習性能測試的相關知識以及常用工具Jmeter
我們將會從以下角度進行介紹:
- 性能測試基礎信息
- 性能測試工具介紹
性能測試基礎信息
首先我們需要去系統的了解一下性能測試的相關信息
性能測試簡述
首先我們需要了解我們為什么需要學習性能測試:
- 在目前企業里功能測試是最基本的需求,但隨著用戶量的增加,產品的品質也需要逐漸優化
- 性能測試主要是針對產品的執行速率,執行占用資源,并發度,最大可承受執行次數等多方面進行測試并判斷是否滿足產品需求
接下來我們需要理解性能主要針對什么:
- 性能測試主要針對兩方面進行評估
- 時間層面:用戶執行該操作最后效果展現所消耗的時間
- 資源層面:用戶執行該操作對自身計算機所占用CPU等資源的消耗比率
那么性能測試就是在多種情況下對性能情況進行測試得出結果:
- 使用自動化工具,模擬不同場景下,對軟件各項性能指標進行測試和評估的過程
最后我們簡單講一下性能測試的目的:
- 評估當前系統能力
- 尋找性能瓶頸,優化性能
- 評估軟件是否滿足未來需求,是否需要優化
性能測試對比
我們在之前的文章中已經學習了功能測試,那么我們簡單給出兩者的區別:
# 功能測試
# 目的:主要為了驗證系統的功能需求規格是否滿足產品需求
# 正向功能測試:采用完整正確的測試用例進行測試,判斷是否滿足產品需求
# 逆向功能測試:采用不完整或部分錯誤或錯誤的測試用例進行測試,判斷是否滿足產品需求
# 性能測試
# 目的:主要為了判斷產品是否滿足其業務需求場景
# 時間性能測試:采用業務需求場景下的測試用例獲取最終時間結果,判斷是否滿足產品需求
# 資源性能測試:采用業務需求場景下的測試用例獲取計算機資源占比,判斷是否滿足產品需求
我們還需要知道其兩者之間的先后順序關系:
- 在前后端提測之后,我們首先需要進行功能測試并回歸完完全功能之后,判斷該產品無任何問題后再進行性能測試
- 在完成功能測試和性能測試后,兩者自動化的書寫無先后順序關系
性能測試分類
我們下面來介紹性能測試的多種測試方式
基準測試
首先我們需要介紹基準測試:
- 狹義:基準測試其實就是單用戶測試
- 廣義:基準測試是采用單用戶測試在某一固定場景下進行測試并得到具體數據,以該數據作為基準和后續測試數據進行對比
我們給出一個簡單實例來說明基準測試:
-
我們在最開始采用一種情況進行測試并得到結果進行記錄,后續我們采用其他方式進行測試并與基準測試結果進行對比
-
基準測試:項目1.0版本,測試機配置(8G+16G),單用戶查詢一萬條數據采用3.0s
-
后續測試:項目1.0版本,測試機配置(8G+32G),單用戶查詢一萬條數據采用2.0s
-
后續測試:項目1.1版本,測試機配置(8G+16G),單用戶查詢一萬條數據采用2.5s
那么基準測試的用途也很明顯:
- 基準測試從不會單獨出現,它需要與其他數據比較才有意義
- 基準測試采用單用戶測試,主要是為了給后續多用戶測試綜合測試場景提供參考意義
- 基準測試采用測試機測試,主要是為了給后續不同配置測試機測試綜合測試場景提供參考意義
負載測試
我們同樣首先來介紹負載測試的意義:
- 通過逐步增加系統負載,確定滿足系統性能指標情況下(響應時間或CPU占用率),找到該系統的最大承受量
我們給出一個簡單實例來說明負載測試:
- 我們首先會從產品那里得到一個客戶性能需求,例如該電梯從1樓運輸到5樓的運行時間控制在15s內
- 那么我們就需要采用不同重量進行測試,判斷是否滿足客戶需求并將該負載結果告訴產品
- 我們會從下述case中選擇最大的滿足性能需求的重量作為負載測試的最終結果
- case1:100KG物品在電梯中從1樓運輸到5樓的運行時間是10s
- case2:500KG物品在電梯中從1樓運輸到5樓的運行時間是10s
- case3:700KG物品在電梯中從1樓運輸到5樓的運行時間是14s
- case4:900KG物品在電梯中從1樓運輸到5樓的運行時間是17s
針對負載測試我們還需要知道這些內容:
- 系統對外宣稱的一般是最大負載量
- 負載測試的測試時間一般為1-2小時
- 通過負載測試可以確定系統的最大負載量和極限負載量
負載測試的用途主要針對客戶需求:
- 系統最大負載量達到客戶需求時,系統才能正式上線使用
穩定測試
我們首先給出穩定性測試的概念:
- 穩定性測試主要是針對產品在穩定運行(正常業務負載下)的情況下進行長時間測試,并保證產品滿足線上業務需求
我們現實中其實存在很多案例:
- 因為不同業務存在不同業務場景,所以穩定性測試的測試時間是不同的
- 例如12306鐵路搶票軟件,每天的0點到6點之間是不允許搶票的,那么我們只需要測試在一天情況下能否滿足業務需求
- 例如淘寶京東購物軟件,每天無時無刻都可以進行購物,那么我們測試時長就需要稍微拉長一些來判斷能否滿足業務需求
負載測試的用途主要針對產品持久性:
- 系統在用戶要求的業務負載下達到規定的執行時間時,系統才能正式上線使用
壓力測試
我們首先給出壓力測試的概念:
- 壓力測試主要針對在高壓情況下,查看系統是否存在功能隱患,判斷是否是否良好的容錯能力和可恢復能力
針對壓力測試主要分為兩方面的壓力測試:
- 系統在持續高壓情況下的穩定性測試
- 系統在超高壓情況下崩潰后的恢復能力測試
我們分別給出兩個案例:
# 持續高壓下壓力測試
# 例如B站中某個視頻爆火,在一段時間內,該視頻的點擊率一直上升,一直調用get接口
# 那么我們就需要去測試該接口在高負荷情況下(超過正常調用頻率)在一段時間內(一天或三天)是否能夠正常調用且無錯誤
# 超高壓情況下恢復測試
# 例如某個功能爆火,導致該功能的點擊量/接口調用率突然提升超過預期,導致該接口/數據庫信息報錯
# 那么我們就需要測試在該功能崩潰情況下,是否能在較短時間內恢復該功能的正常運行/接口調用無異常
并發測試
我們同樣給出并發測試的概念:
- 并發測試是在極短的時間內,發送多個請求,判斷是否出現資源爭奪導致的異常情況
我們在日常生活中可以見到很多案例:
- 雙十一定時搶券活動
- 春節火車票搶購時間
但是我們需要注意到的是并發測試和負載測試雖然都是測試資源消耗或者說是資源的最大承受量,但兩者是不同的:
- 負載測試:是指一段時間內,在高負載的情況對于資源的消耗,是否會存在資源耗盡問題
- 并發測試:是指在極短時間內,判斷是否會出現由于資源互相搶奪而導致功能無法實現問題
其實并發測試的主要測試點更像是我們操作系統中出現的死鎖情況:
- 假設我們的資源A存在10個,資源B存在10個
- 同時存在20個線程都需要資源A和資源B,同時啟動導致10個線程得到資源A,10個線程得到資源B
- 但兩者都無法得到剩余的線程,從而出現資源死鎖問題,導致資源無法釋放,功能無法實現從而出現并發問題
性能測試指標
我們在進行性能測試時,當然不能只根據我們的感覺來判斷該性能是否符合標準,因此就出現指標這一概念
響應時間
首先我們來介紹響應時間:
- 狹義:用戶進行操作后,得到最后結果之間所消耗的時間
- 廣義:主要包含瀏覽器傳輸時間,服務器處理時間,服務器傳輸時間,數據庫處理時間等多時間匯總所得到的結果
我們可以簡單給出一張圖片進行解釋:
我們的響應時間通常是我們進行性能測試最直接的判斷結果:
- 例如我們查詢一萬條數據時所需要得到的響應時間在3s之內
但我們還需要注意一點:
- 我們所獲取的響應時間并不能是單次運行所得到的時間
- 而是在多次運行下,所得到的所有運行時間的平均值(Jmeter會有一個字段存儲平均響應時間)
吞吐量
我們來簡單介紹一下吞吐量:
- 吞吐量指單位時間內處理客戶端的請求數量,可以直接體現出系統的性能承載能力
吞吐量主要分為兩種:
-
TPS每秒事務數
-
QPS每秒查詢數
我們首先來介紹TPS:
- 即控制服務器每秒處理的事務請求的數量
- 該計算僅僅針對事務的數量進行計算,一次事務(一次點擊)可能會出現1個或多個請求,而這些請求都被劃分為一次事務
我們采用一張圖片解釋:
我們再來介紹QPS:
- 即控制服務器每秒處理的指定請求的數量
- 該計算是指針對某單一接口請求,去統計該單位時間內所處理的請求個數
我們同樣采用一張圖片解釋:
資源利用率
我們來簡單介紹一下資源利用率:
- 即計算機內各種資源的使用情況
- 通常是一個比率值,采用當前使用資源數/計算機全部資源數來獲取
我們常見的一些計算機資源包括有:
- CPU使用率
- 顯卡使用率
- 內存使用率
- 磁盤IO效率
- 網絡傳輸率
性能測試流程
首先我們直接給出一張性能測試流程圖:
需求分析
首先我們來講解性能測試需求分析:
- 所有測試的需求分析的過程都是相同的,由產品給出具體指標,由我們進行解析梳理
我們通常將性能測試需求分析劃分為四步:
# 1.明確被測系統
# 我們首先需要了解我們所測試的系統的業務功能和技術架構
# 我們需要去了解我們所測試的系統的常用模塊,并了解其執行步驟
# 2.明確測試內容
# 在產品給出需求的情況下,我們直接去測試產品需求點即可
# 若產品未給出需求,那么我們主要針對用戶使用最頻繁的部分進行測試或者針對性能過低的部分進行測試優化
# 3.明確測試策略
# 該測試策略就是我們前面所提到的測試分類方法
# 該測試策略并非需要全部執行,我們需要針對不同情況采用不同測試策略進行測試
# 4.明確測試指標
# 同樣,我們以產品的需求為主,如果存在需求,則滿足需求即可
# 若不存在需求,我們可以參考其他軟件或之前版本的測試數據進行判斷其指標
測試計劃
測試計劃其實主要依照公司主管所制定的計劃:
- 所測內容:依據項目背景,給出測試目的及測試范圍即可
- 所測人員:由主管進行分配各個人員的分工以及完成時間等信息
- 所測方法:測試方法可以由主管指定,也可以由各個人員進行判斷
測試用例
我們給出一張測試用例的常用模板圖即可:
測試執行
我們的性能測試通常通過工具進行測試:
- 由于性能測試需要長時間點擊或頻繁點擊,人工無法實現
- 我們通常通過參數化和腳本等,然后結合測試工具Jmeter或其他性能測試工具等去結合執行
我們的性能測試執行大概劃分為四階段:
# 1.建立測試環境
# 搭建性能測試環境,包括硬件環境,軟件環境,網絡環境
# 2.編寫測試腳本
# 按照性能測試需求用例,使用性能測試工具書寫測試腳本
# 3.性能測試監控
# 一般我們所使用的腳本工具都會存在性能測試監控窗口,我們只需要查看數據是否存在問題即可
# 4.執行測試腳本
# 設置性能運行場景,執行性能測試,收集測試結果并與指標進行對比
測試分析
我們在執行測試用例之后會獲取到其性能測試結果,我們只需要對比即可:
- 針對不滿足產品需求的性能測試結果,我們需要要求后端對其進行優化,并在優化后回歸測試
測試報告
我們在測試結束之后通常需要去書寫測試報告,主要是為了我們后續測試作為對照,主要包含以下內容:
- 測試流程記錄
- 測試風險評估
- 測試結果記錄
- 測試分析記錄
- 測試總結改進
性能測試工具介紹
接下來我們開始正式介紹Jmeter工具的使用
Jmeter性能比較
其實除了Jmeter之外,我們還有很多性能測試工具,其中之前比較出名的就是Loadrunner,我們這里簡單介紹一下兩者的區別:
# 首先我們來簡單說一下Loadrunner
# Loadrunner實際上算是一款很知名的性能測試工具
# Loadrunner的主要特點是:高收費,占用內存較大,功能全面無閹割,同時可模擬上萬人同步操作
# 而Jmeter其實就是針對Loadrunner所做出來的閹割版性能測試工具
# 但是由于Jmeter的免費且開源使得它在如今社會滿足企業需求且可以由我們自己插入第三方插件
# Jmeter的主要特點是:免費且開源,占用內存極小,基本滿足企業需求,同時可模擬千人同步操作,可以手動導入第三方實現企業需求
# 且兩者都包容多協議,像我們常用的Http,Https,FTP等協議,兩者都可以使用
# 且兩者都存在監聽件,我們所做的性能操作都會直接體現在監聽件中,不需要我們手動記錄
Jmeter下載安裝
Jmeter的下載非常簡單,我們只需要到官網下載對應壓縮包即可:Apache JMeter - Download Apache JMeter
我們將其壓縮到對應文件夾即可,注意需要是全英文文件夾,下面我們使用一張圖來介紹各文件內容:
如果我們希望快速打開Jmeter,我們通常會將該文件的bin目錄放入我們的環境變量,那么我們僅需要使用一行簡單命令就開啟服務:
最后我們給出一下Jmeter的一個頁面展示:
這里我們所看到的是英文界面,當然我們可以將其變為中文界面,我只需要進入bin目錄的Jmeter.properties文件修改:
最后我們給出一個小提示,因為我的電腦存在這個問題,所以記錄下來:
# 如果電腦是高刷新率,像我的電腦是240HZ刷新,就會導致Jmeter的GUI界面出現重疊問題
# 我們只需要在Jmeter.bat腳本中的第一行,加入這行代碼即可
set JVM_ARGS=-Dsun.java2d.d3d=false
Jmeter元件介紹
我們首先給出一張Jmeter工具的相關元件圖,我們會在下面進行解釋:
下面我們依次來介紹上述元件的作用:
# 取樣器
# 取樣器就是用來發送請求的元件,我們在頁面上點擊按鈕其實就是發送請求,這里就是模擬發送請求
# 邏輯控制器
# 邏輯控制器就是控制我們的元件是否執行,包含我們常用的if,while,foreach等
# 前置處理器
# 前置處理器是對我們的請求參數在執行前進行處理
# 后置處理器
# 后置處理器是對我們請求后所返回的響應進行處理
# 斷言
# Python中常用的判斷結果是否符合預期的功能
# 定時器
# 定時器主要用來控制我們多久后執行該取樣器(發送請求)
# 配置元件
# 配置元件內的元件都是用于進行初始化的東西
# 監聽器
# 監聽器主要是用來獲取我們使用取樣器發送請求后的響應數據相關信息
接下來我們需要知道元件的作用范圍都在哪里:
# ?取樣器:核心,沒有作用域
# ?邏輯控制器:只對其子節點中的取樣器和邏輯控制器起作用
# ?其他元件:
# ?如果是某個取樣器的子節點,則該元件只對其父節點起作用
# ?如果其父節點不是取樣器,則其作用域是該元件父節點下的其他所有后代節點(包括子節點,子節點的子節點等)
我們還需要注意其執行順序:
# 在同一個作用域(目錄/級別/縮進)的不同元件的執行順序:
# 配置元件 - 前置處理程序 - 定時器 - 取樣器 - 后置處理程序 - 斷言 - 監聽器
# 在同一個作用域(目錄/級別/縮進)的相同元件的執行順序:
# 從上到下的順序依次執行
我們給出一張圖,并給出它的執行順序,大家可以明白其作用范圍:
Jmeter案例展示
首先我們給出一個最簡單的案例進行展示:
# 步驟
# 1.啟動Jmeter
# 2.在“測試計劃”下添加線程組
# 3.在“線程組”下添加“http請求”取樣器
# 4.填寫“http請求”取樣器信息
# 5.在“線程組”下添加“查看結果樹”監聽器
# 6.點擊啟動按鈕,并查看結果
我們這里首先給出http請求的界面展示,后續我們會詳細介紹:
然后我們這里直接啟動,給出查看結果樹的執行界面展示:
Jmeter線程介紹
在了解其元組具體信息之前,我們首先需要了解一下線程組:
# 線程組一共只有三種,我們右鍵測試計劃就可以創建線程組,這里不給圖片展示了
# 1.線程組
# 控制Jmeter用于執行測試的一組用戶,用于執行測試用例,可以有1個或者多個(并行/串行),后續我們會給出具體參數信息設置
# 2.Setup線程組
# 預測試操作,所有腳本之前執行
# 類似于Pytest里面的Setup方法
# 3.Teardown線程組
# 測試后操作,所有腳本之后執行
# 類似于Pytest里面的Teardown方法
我們給出線程組的展示圖并說明其具體使用參數信息:
而最后我們在給出一個小貼士,是關于線程組的并行或串行啟動的開關按鈕:
Jmeter交互介紹
我們直接給出Jmeter請求的一張展示圖,并在該展示圖上進行介紹:
除了這些請求之外,我們在請求時,還需要傳遞參數信息:
- 如果是get請求,我們可以直接在路徑后以?key1=value1&key2=value2的形式進行傳遞
- 其他請求類型,我們通常在下方的參數欄進行傳遞,也可以選擇消息體數據采用JSON或其他格式傳遞,如果傳遞文件可以選擇第三種
我們給出一張展示圖:
我們順便給出一張查看結果樹的請求和響應展示圖:
Jmeter參數處理
我們在之前的自動化測試中也學習到了參數化,現在我們來學習Jmeter的參數化設置:
- 參數化的本質就是實現測試數據與測試方法的分離
- 參數化主要使用不同的測試數據,調用相同的測試方法進行測試
全局變量
我們首先學習Jmeter參數化最基本的全局變量:
- 用戶定義的變量 —— 全局變量
首先我們進行一些全局變量信息的講解:
# 如何定義?
# 我們可以在線程組下,創建配置元件的用戶定義的變量
# 具體作用?
# 定義一些全局變量方便我們頻繁使用,例如我們頻繁使用某些字段或某些數據,我們就可以定義為全局變量進行使用
# 如何使用?
# 我們只需要在需要導入的地方采用${變量名}就可以使用
我們直接給出全局變量定義的界面:
我們再給出一張使用圖:
用戶參數
同樣我們首先給出用戶參數的相關概念:
- 用戶參數 —— 為每個用戶分配不同的參數值
我們先來進行簡單介紹:
# 如何定義?
# 我們可以在線程組下,創建前置處理器的用戶參數
# 具體作用?
# 針對一組參數,當不同用戶使用時,會獲取不同的數據
# 如何使用?
# 我們只需要在需要導入的地方采用${變量名}就可以使用
我們首先給出一張用戶參數設置圖:
然后我們再給出一張使用圖或者說我們的設置圖:
數據文件
我們首先給出數據文件的相關定義:
- CSV數據文件設置 —— 文件方式參數化
我們同樣給出介紹:
# CSV文件?
# CSV文件是一種分行存儲數據的文件
# CSV文件類型1(存在表行頭)
username,password,isOP
user1,123456,True
user2,123321,False
user3,111111,True
# CSV文件類型2(無表頭行)
user1,123456,True
user2,123321,False
user3,111111,True
# 如何定義?
# 我們可以在線程組下,創建配置元件的CSV 數據文件設置
# 具體作用?
# 針對一組參數,當每次使用都會使用不同數據信息
# 如何使用?
# 我們只需要在需要導入的地方采用${變量名}就可以使用
我們首先給出一張CSV文件導入Jmeter的展示圖:
我們在使用時,同樣采用$符進行數據導入,注意key值是我們在CSV數據文件設置里設置的變量名稱:
函數參數
最后我們介紹一下函數參數:
- 函數 —— 隨機數據
我們同樣給出基本介紹:
# 如何定義?
# 我們點擊工具欄-選擇函數助手對話框-彈出對話框-選擇函數類型(這里我們僅介紹__counter計數器)
# 具體作用?
# 自動生成不重復的數據,讓每個用戶每次循環都獲取到不同的數據,且不需要提前定義
# 如何使用?
# 我們只需要在需要導入的地方采用${函數名}就可以使用
我們給出函數定義界面展示:
最后我們給出一個數據使用展示:
匯總展示
最后我們分別給出四種參數化處理的優缺點:
# 全局變量
# 作用:定義全局變量
# 局限性:每次取值(無論用戶)都是固定值
# 用戶參數
# 作用:保證不同用戶針對同一參數,取到不同數據
# 局限性:用戶在多次循環中會取到同一參數,導致數據重復
# 數據文件
# 作用:保證不同用戶在不同循環中取到不同參數
# 局限性:需要手動設置數據,當用戶循環過多,數據設置過多顯得繁雜
# 函數參數
# 作用:自動生成不重復的數據,讓每個用戶每次循環都獲取到不同的數據,且不需要提前定義
# 局限性:針對特定要求的場景,無法使用,泛用性較低(例如需要輸入正確的賬號密碼進行登錄時)
Jmeter斷言介紹
下面我們來介紹Jmeter中的結果自動判斷工具:
- 我們的Jmeter本身有一個響應碼自動判斷,若結果并非200就會進行報錯顯示
- 但是存在某些情況,即使響應碼為200但也可能因為結果不對從而導致功能不符合需求
- 所以我們需要學習斷言,我們采用斷言來完成字段的匹配,若字段不符合我們的需求則報錯顯示
響應斷言
我們首先給出一張響應斷言頁的圖片:
由于頁面內容過多無法在圖中展示所有字段含義,我們單獨在下面介紹上述字段意義:
# 1.響應斷言下方的名稱和注釋就是該響應斷言的展示屬性
# 2.apply to 這里我們選擇默認 Main sample only 即可
# 3.測試字段主要是指我們是根據response的哪一部分來進行斷言匹配
# 響應文本:來自服務器的響應文本,即主題
# 響應代碼:響應狀態碼,例如200
# 響應信息:響應的信息,例如OK
# 響應頭:響應頭部
# 請求頭:請求頭部
# URL樣本:請求URL路徑
# 文本:響應的整個文本信息
# 請求數據:請求數據
# 忽略狀態:請注意這里是復選框,因為我們的斷言有響應碼自動判斷機制,如果我們需要判斷響應碼為非200狀態,我們需要將其勾選防止報錯
# 4.模式匹配規則
# 包括:文本包含指定的正則表達式
# 匹配:整個文本完全匹配指定的正則表達式
# 相等:整個返回結果文本完全匹配指定的字符串
# 字符串:返回結果文本包含指定的字符串
# 否:當存在多個測試模式時,默認為and(當全部滿足才通過斷言),如果勾選這里相當于!(全部不滿足才通過斷言)
# 或者:當存在多個測試模式時,默認為and(當全部滿足才通過斷言),如果勾選這里相當于or(存在一個滿足就通過斷言)
# 當然否和或者你也可以一起使用,相當于!or(存在一個不滿足就通過斷言)
# 5.測試模式
# 我們可以添加多個測試模式
# 測試模式其實就是斷言的判斷值,與response進行比較
# 其實整體如果采用pytest展示
# 結果值 比較方式 預期值 --> ${測試字段} ${模式匹配規則} ${測試模式}
# text == "百度一下,你就知道"
我們使用斷言一般是放在請求的下層,當請求執行后就會采用請求返回的response來進行斷言判斷:
JSON斷言
下面我們來介紹JSON斷言,同樣我們直接給出一張圖片:
我們已經介紹過上述概念了,我們首先給出一個請求所獲取的返回結果:
下面我們來獲取上述JSON中的某個字段來進行匹配判斷:
時間斷言
除了上述我們對結果進行斷言判斷外,我們有時還需要進行性能測試,我們就需要判斷在規定時間內是否滿足條件:
- ”斷言持續時間”就是專門用來進行時間判斷的斷言
我們直接給出一張斷言持續時間界面圖:
我們同樣給出一個簡單的結果實例展示:
Jmeter關聯介紹
我們在使用Jmeter時難免會遇到關聯關系:
- 當請求之間有依賴關系,就被稱為關聯
- 例如一個請求的請求參數是另一個請求的請求響應結果
正則表達式提取器
我們首先來介紹正則表達式提取器:
# 正則表達式我這里給出簡單定義,因為大部分人之前應該已經學習過這部分知識
# 就是一個公式,或者說一套規則,使用這套規則可以從任意字符串中提取出想要的數據內容
# 公式格式:左邊界 + (匹配符號) + 右邊界
# 我們可以通過該公式進行其部分數據內容的提取
# 我們常用的匹配符號主要包含以下三種:
# .:是通配符,可以代表任意字符(除換行回車)
# *: 代表前面的字符出現0次或者多次
# .*匹配規則:找到左邊界值后,往右查找有邊界,找到最后面的右邊界,中間的所有數據都被記錄下來
# ?: 代表非貪婪匹配,找到左邊界后,往右查找匹配右邊界,只要有匹配的右邊界就停止繼續查找;再次查找
# 1. 正常響應結果查找
# 公式格式:左邊界(.*)右邊界
# 這種就是獲取結果的一種表達,但是該公式會導致如果存在多個標簽符號,可能會出現跨越多個標簽的結果
# 例如如果我們使用 <title>(.*)</title>
# 如果我們尋找的文本是"<title>百度一下,你就知道</title><title>百度一下,你就知道</title>"
# 上述情況我們就會提取到 "百度一下,你就知道</title><title>百度一下,你就知道"
# 公式格式:左邊界(.*?)右邊界
# 經過上述版本的優化非貪婪匹配,我們獲取到第一個右邊界就停止匹配
# 例如如果我們使用 <title>(.*?)</title>
# 如果我們尋找的文本是"<title>百度一下,你就知道</title><title>百度一下,你就知道</title>"
# 上述情況我們就會提取到 "百度一下,你就知道"
# 2. 文本數據結果查找
# 我們在使用過程中也可能出現以下格式:(分別表示 城市號、地區號、個人號碼)
021-1234-1234
022-1234-1235
023-1234-1236
024-1234-1237
025-1234-1238
026-1234-1239
027-1234-1230
# 那么我們在匹配時就可以采用多個正則表達式進行匹配
# 我們可以使用:(.*?)-(.*?)-(.*?)\n 進行匹配,需要注意\n,因為我們的數據是存在換行的
# 最后我們還需要注意,我們這里由于是多行數據,所以最后我們的獲取的數據其實也是多行的,我們后續是需要進行處理的
我們首先給出案例圖來進行介紹:
我們首先給出正則表達式的正常使用示例圖:
然后我們通過一張圖來展示模板和匹配數字組的格式:
XPath提取器
下面我們來介紹XPath提取器,其實就是一個html提取器:
- XPath提取器主要針對HTML格式的響應結果數據進行提取
我們在Selenium的介紹文章里已經介紹過XPath的具體匹配原則,這里我把介紹文本粘貼了一下方便大家查看:
# 首先我們還是給出XPath的使用格式
element = driver.find_element(By.XPATH,xpath)
# XPath一般分為四種定位方法,我們會在下面一一展示
# 1. 路徑-定位
# 路徑定位一般劃分為絕對路徑定位和相對路徑定位
# 絕對路徑定位:以 /html根節點 開始,使用/來分隔元素層級
# 例如/html/body/div/fieldset/p[1]/input,表示html層級下的body層級下的....的第一個p下的input元素
# 需要注意我們的html元素是以1開頭,并不是以0開頭,這里的1就是指一組p標簽的第一個元素
driver.find_element(By.XPATH,"/html/body/form/div/fieldset/p[1]/input").send_keys("admin")
# 相對路徑定位:以 //確定元素 開始,后續使用/來分隔元素層級
# 例如//p[@id='p1']/input,表示id為p1的p標簽元素下的input元素
# 我們通常使用//來表示第一個可以確認的相對路徑的元素,而這個元素通常采用標簽名開頭,我們可以使用[]來加上其對應的屬性來確定元素
# 我們通常在[]里添加單個屬性或多個屬性來確定元素,我們通常使用@屬性名=屬性值的格式來表示,例如@id='p1'
driver.find_element(By.XPATH,"http://p[@id='p1']/input").send_keys("123")
# 2. 利用元素屬性-定位
# 一個元素通常會有多個屬性,包括id,name以及自定義屬性等
# 例如//input[@id='passwordA'],表示該id為passwordA的input元素
driver.find_element(By.XPATH,"http://input[@id='passwordA']").send_keys("123")
# 3. 屬性與邏輯結合-定位
# 如果我們出現元素內含有多個屬性,且每個屬性都有多個元素共享,我們就不能使用單個屬性進行元素定位
# 所以我們需要使用邏輯方法來進行多屬性判定,例如and,or等方法
driver.find_element(By.XPATH,"http://input[@id='passwordA' and @placeholder='密碼A']").send_keys("123")
# 4. 層級與屬性結合-定位
# 如果通過元素自身的信息不方便直接定位到該元素,則可以先定位到其父級元素,然后再找到該元素
# 例如我們所需要定位的input上沒有任何獨立的屬性,但是它的父類有獨立屬性,那么我們就可以根據父元素去定位子元素
driver.find_element(By.XPATH,"http://*[@id='p1']/input").send_keys("123")
# 最后我們介紹幾個XPATH的常用的延申內置屬性方法
# 下面的*表示任意元素,這個是HTML中所定義的內容
# 文本內容是xxx的元素
driver.find_element(By.XPATH,"http://*[text()="xxx"]")
# 屬性中含有xxx的元素
driver.find_element(By.XPATH,"http://*[contains(@attribute,'xxx')]")
# 屬性以xxx開頭的元素
driver.find_element(By.XPATH,"http://*[starts-with(@attribute,'xxx')]")
那么我們首先還是給出XPath的展示圖:
我們同樣給出一張簡單示例圖:
JSON提取器
最后我們再來介紹一個JSON提取器,同樣也是很簡單的格式:
- JSON提取器主要針對返回結果是JSON的響應結果數據進行提取
我們同樣首先給出一張展示圖并進行解釋:
我們給出一張簡單實例圖解釋:
Jmeter屬性介紹
下面我們來介紹Jmeter的屬性相關信息:
- 我們前面使用的關聯僅僅能在同一個線程組中進行使用,若我們想在不同線程組中使用就需要采用屬性
- 我們需要將我們所需要使用到的數據定義成Jmeter的全局變量,然后我們才能在不同線程組中使用該屬性
Jmeter屬性的設置同樣需要函數來進行set和get操作:
- 首先我們需要有一個線程組1,然后線程組1里調用請求,我們采取JSON取樣器獲得請求中的city屬性:
- 我們在獲取數據之后,我們首先需要去創建函數,我們可以直接書寫函數,也可以采用工具書寫:
- 然后我們需要采用一個BeanShell取樣器來進行函數執行:
- 如果我們希望調用我們定義的全局變量,我們同樣需要使用函數,我們同樣去獲取函數:
- 最后我們只需要在另一個線程組里的請求里直接使用該函數即可,不需要額外操作:
Jmeter數據庫連接
首先我們介紹一下Jmeter連接數據庫的主要作用:
- 用作請求參數化:例如登錄界面所需賬號密碼,可以直接從數據庫獲取
- 用作結果的斷言:例如我們通過查詢獲取的數據,我們可以判斷該數據是否真實存在,與數據庫信息進行比較
- 用作清除無用數據:當我們重復使用某功能時,可能存在某個字段不能重復使用,那么我們就需要在調用該功能之前刪除該字段
- 用作準備測試數據:當我們需要大量數據時,我們可以直接從數據庫中獲取大量數據進行調用
接下來我們就來講解如何進行數據庫連接:
- 首先我們需要對Jmeter添加對應的數據庫jar包,下載后放在lib目錄的ext目錄下即可(下載方法在末尾):
- 然后我們在Jmeter里面配置JDBC Connection Configuration信息:
- 然后我們就可以通過JDBC請求來書寫數據庫代碼來進行數據獲?。?/li>
- 最后我們就可以采用這個JDBC Request去做一些斷言之類的操作:
Jmeter邏輯控制器
我們在進行Jmeter操作的時候可能會進行過濾或者重復操作等,我們就會使用到邏輯控制器
If邏輯控制器
首先我們來介紹if邏輯控制器:
- If邏輯控制器用來控制它下面的測試元素是否執行
然后我們給出一張if邏輯控制器的展示圖進行參數介紹:
while邏輯控制器
下面我們來介紹while邏輯控制器:
- 當我們需要某些特定語句去進行多次執行時,我們可以采用循環邏輯控制器
- 如果我們該線程組下所有請求都在while邏輯控制器內,那么和線程組中控制循環次數的效果是一樣的,這里就是為了單個請求做重復操作而設置的
我們直接給出邏輯控制器的展示圖進行參數介紹:
Foreach邏輯控制器
最后我們介紹一個ForEach邏輯控制器,它是用于對組中元素均執行所創建的控制器:
- 一般和用戶自定義變量和正則表達式一同使用,用于使用該組中所有元素去執行請求
我們首先給出Foreach邏輯控制器的展示界面:
我們這里只介紹foreach如何與用戶自定義變量來結合使用,其實原理都是相同的,針對組我們都可以采用foreach進行遍歷操作:
- 定義用戶自定義變量:
- 書寫foreach控制器:
- 最后我們在HTTP請求中調用我們的kw即可,我們會在結果樹中查看到三個結果:
Jmeter定時器介紹
最后我們來介紹Jmeter中最常用的三種定時器:
- 定時器主要是方便我們通過控制dps和time來進行壓力測試或性能測試等
同步定時器
我們首先來介紹同步定時器:
- 阻塞線程,當在規定時間內達到一定線程數后,將這些線程一同釋放,主要用于進行并發壓力測試
我們直接介紹同步定時器的展示界面:
常數吞吐量定時器
下面我們來介紹常量吞吐量定時器:
- 用于控制單個用戶的dps查詢速度,常用于進行穩定測試或長時間壓力測試
我們直接給出常數吞吐量定時器的展示界面:
固定定時器
最后我們來介紹固定定時器:
- 用于控制該請求在多久之后進行執行,用于驗證一些時間關系
我們直接給出固定定時器的展示界面:
結束語
這篇文章中詳細介紹了性能測試以及性能測試工具Jmeter的詳情使用,希望能為你帶來幫助
下面給出我學習和書寫該篇文章的一些參考文章,大家也可以去查閱:
- 黑馬課程:01.性能測試_階段總體目標和課程安排_嗶哩嗶哩_bilibili
- CSDN下載攻略:mysql數據庫鏈接驅動jar包的下載(Jmeter中使用為例)_mysql驅動jar包下載-CSDN博客
總結
以上是生活随笔為你收集整理的一篇文章带你掌握性能测试工具——Jmeter的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 抖店是什么
- 下一篇: 我的 2023 年,父亲肺癌,失业,失恋