在目前的中大型企業中,僅僅進行功能測試已經不足以滿足企業的需求,在重大客戶基數下效能測試將會直接影響到使用者體驗
所以在這篇文章中我們將會學習效能測試的相關知識以及常用工具Jmeter
我們將會從以下角度進行介紹:
首先我們需要去系統的瞭解一下效能測試的相關資訊
首先我們需要了解我們為什麼需要學習效能測試:
接下來我們需要理解效能主要針對什麼:
那麼效能測試就是在多種情況下對效能情況進行測試得出結果:
最後我們簡單講一下效能測試的目的:
我們在之前的文章中已經學習了功能測試,那麼我們簡單給出兩者的區別:
# 功能測試
# 目的:主要為了驗證系統的功能需求規格是否滿足產品需求
# 正向功能測試:採用完整正確的測試用例進行測試,判斷是否滿足產品需求
# 逆向功能測試:採用不完整或部分錯誤或錯誤的測試用例進行測試,判斷是否滿足產品需求
# 效能測試
# 目的:主要為了判斷產品是否滿足其業務需求場景
# 時間效能測試:採用業務需求場景下的測試用例獲取最終時間結果,判斷是否滿足產品需求
# 資源效能測試:採用業務需求場景下的測試用例獲取計算機資源佔比,判斷是否滿足產品需求
我們還需要知道其兩者之間的先後順序關係:
我們下面來介紹效能測試的多種測試方式
首先我們需要介紹基準測試:
我們給出一個簡單範例來說明基準測試:
我們在最開始採用一種情況進行測試並得到結果進行記錄,後續我們採用其他方式進行測試並與基準測試結果進行對比
基準測試:專案1.0版本,測試機設定(8G+16G),單使用者查詢一萬條資料採用3.0s
後續測試:專案1.0版本,測試機設定(8G+32G),單使用者查詢一萬條資料採用2.0s
後續測試:專案1.1版本,測試機設定(8G+16G),單使用者查詢一萬條資料採用2.5s
那麼基準測試的用途也很明顯:
我們同樣首先來介紹負載測試的意義:
我們給出一個簡單範例來說明負載測試:
針對負載測試我們還需要知道這些內容:
負載測試的用途主要針對客戶需求:
我們首先給出穩定性測試的概念:
我們現實中其實存在很多案例:
負載測試的用途主要針對產品永續性:
我們首先給出壓力測試的概念:
針對壓力測試主要分為兩方面的壓力測試:
我們分別給出兩個案例:
# 持續高壓下壓力測試
# 例如B站中某個視訊爆火,在一段時間內,該視訊的點選率一直上升,一直呼叫get介面
# 那麼我們就需要去測試該介面在高負荷情況下(超過正常呼叫頻率)在一段時間內(一天或三天)是否能夠正常呼叫且無錯誤
# 超高壓情況下恢復測試
# 例如某個功能爆火,導致該功能的點選量/介面呼叫率突然提升超過預期,導致該介面/資料庫資訊報錯
# 那麼我們就需要測試在該功能崩潰情況下,是否能在較短時間內恢復該功能的正常執行/介面呼叫無異常
我們同樣給出並行測試的概念:
我們在日常生活中可以見到很多案例:
但是我們需要注意到的是並行測試和負載測試雖然都是測試資源消耗或者說是資源的最大承受量,但兩者是不同的:
其實並行測試的主要測試點更像是我們作業系統中出現的死鎖情況:
我們在進行效能測試時,當然不能只根據我們的感覺來判斷該效能是否符合標準,因此就出現指標這一概念
首先我們來介紹響應時間:
我們可以簡單給出一張圖片進行解釋:
我們的響應時間通常是我們進行效能測試最直接的判斷結果:
但我們還需要注意一點:
我們來簡單介紹一下吞吐量:
吞吐量主要分為兩種:
TPS每秒事務數
QPS每秒查詢數
我們首先來介紹TPS:
我們採用一張圖片解釋:
我們再來介紹QPS:
我們同樣採用一張圖片解釋:
我們來簡單介紹一下資源利用率:
我們常見的一些計算機資源包括有:
首先我們直接給出一張效能測試流程圖:
首先我們來講解效能測試需求分析:
我們通常將效能測試需求分析劃分為四步:
# 1.明確被測系統
# 我們首先需要了解我們所測試的系統的業務功能和技術架構
# 我們需要去了解我們所測試的系統的常用模組,並瞭解其執行步驟
# 2.明確測試內容
# 在產品給出需求的情況下,我們直接去測試產品需求點即可
# 若產品未給出需求,那麼我們主要針對使用者使用最頻繁的部分進行測試或者針對效能過低的部分進行測試優化
# 3.明確測試策略
# 該測試策略就是我們前面所提到的測試分類方法
# 該測試策略並非需要全部執行,我們需要針對不同情況採用不同測試策略進行測試
# 4.明確測試指標
# 同樣,我們以產品的需求為主,如果存在需求,則滿足需求即可
# 若不存在需求,我們可以參考其他軟體或之前版本的測試資料進行判斷其指標
測試計劃其實主要依照公司主管所制定的計劃:
我們給出一張測試用例的常用模板圖即可:
我們的效能測試通常通過工具進行測試:
我們的效能測試執行大概劃分為四階段:
# 1.建立測試環境
# 搭建效能測試環境,包括硬體環境,軟體環境,網路環境
# 2.編寫測試指令碼
# 按照效能測試需求用例,使用效能測試工具書寫測試指令碼
# 3.效能測試監控
# 一般我們所使用的指令碼工具都會存在效能測試監控視窗,我們只需要檢視資料是否存在問題即可
# 4.執行測試指令碼
# 設定效能執行場景,執行效能測試,收集測試結果並與指標進行對比
我們在執行測試用例之後會獲取到其效能測試結果,我們只需要對比即可:
我們在測試結束之後通常需要去書寫測試報告,主要是為了我們後續測試作為對照,主要包含以下內容:
接下來我們開始正式介紹Jmeter工具的使用
其實除了Jmeter之外,我們還有很多效能測試工具,其中之前比較出名的就是Loadrunner,我們這裡簡單介紹一下兩者的區別:
# 首先我們來簡單說一下Loadrunner
# Loadrunner實際上算是一款很知名的效能測試工具
# Loadrunner的主要特點是:高收費,佔用記憶體較大,功能全面無閹割,同時可模擬上萬人同步操作
# 而Jmeter其實就是針對Loadrunner所做出來的閹割版效能測試工具
# 但是由於Jmeter的免費且開源使得它在如今社會滿足企業需求且可以由我們自己插入第三方外掛
# Jmeter的主要特點是:免費且開源,佔用記憶體極小,基本滿足企業需求,同時可模擬千人同步操作,可以手動匯入第三方實現企業需求
# 且兩者都包容多協定,像我們常用的Http,Https,FTP等協定,兩者都可以使用
# 且兩者都存在監聽件,我們所做的效能操作都會直接體現在監聽件中,不需要我們手動記錄
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工具的相關元件圖,我們會在下面進行解釋:
下面我們依次來介紹上述元件的作用:
# 取樣器
# 取樣器就是用來傳送請求的元件,我們在頁面上點選按鈕其實就是傳送請求,這裡就是模擬傳送請求
# 邏輯控制器
# 邏輯控制器就是控制我們的元件是否執行,包含我們常用的if,while,foreach等
# 前置處理器
# 前置處理器是對我們的請求引數在執行前進行處理
# 後置處理器
# 後置處理器是對我們請求後所返回的響應進行處理
# 斷言
# Python中常用的判斷結果是否符合預期的功能
# 定時器
# 定時器主要用來控制我們多久後執行該取樣器(傳送請求)
# 設定元件
# 設定元件內的元件都是用於進行初始化的東西
# 監聽器
# 監聽器主要是用來獲取我們使用取樣器傳送請求後的響應資料相關資訊
接下來我們需要知道元件的作用範圍都在哪裡:
# Ø取樣器:核心,沒有作用域
# Ø邏輯控制器:只對其子節點中的取樣器和邏輯控制器起作用
# Ø其他元件:
# •如果是某個取樣器的子節點,則該元件只對其父節點起作用
# •如果其父節點不是取樣器,則其作用域是該元件父節點下的其他所有後代節點(包括子節點,子節點的子節點等)
我們還需要注意其執行順序:
# 在同一個作用域(目錄/級別/縮排)的不同元件的執行順序:
# 設定元件 - 前置處理程式 - 定時器 - 取樣器 - 後置處理程式 - 斷言 - 監聽器
# 在同一個作用域(目錄/級別/縮排)的相同元件的執行順序:
# 從上到下的順序依次執行
我們給出一張圖,並給出它的執行順序,大家可以明白其作用範圍:
首先我們給出一個最簡單的案例進行展示:
# 步驟
# 1.啟動Jmeter
# 2.在「測試計劃」下新增執行緒組
# 3.在「執行緒組」下新增「http請求」取樣器
# 4.填寫「http請求」取樣器資訊
# 5.在「執行緒組」下新增「檢視結果樹」監聽器
# 6.點選啟動按鈕,並檢視結果
我們這裡首先給出http請求的介面展示,後續我們會詳細介紹:
然後我們這裡直接啟動,給出檢視結果樹的執行介面展示:
在瞭解其元組具體資訊之前,我們首先需要了解一下執行緒組:
# 執行緒組一共只有三種,我們右鍵測試計劃就可以建立執行緒組,這裡不給圖片展示了
# 1.執行緒組
# 控制Jmeter用於執行測試的一組使用者,用於執行測試用例,可以有1個或者多個(並行/序列),後續我們會給出具體引數資訊設定
# 2.Setup執行緒組
# 預測試操作,所有指令碼之前執行
# 類似於Pytest裡面的Setup方法
# 3.Teardown執行緒組
# 測試後操作,所有指令碼之後執行
# 類似於Pytest裡面的Teardown方法
我們給出執行緒組的展示圖並說明其具體使用引數資訊:
而最後我們在給出一個小貼士,是關於執行緒組的並行或序列啟動的開關按鈕:
我們直接給出Jmeter請求的一張展示圖,並在該展示圖上進行介紹:
除了這些請求之外,我們在請求時,還需要傳遞引數資訊:
我們給出一張展示圖:
我們順便給出一張檢視結果樹的請求和響應展示圖:
我們在之前的自動化測試中也學習到了引數化,現在我們來學習Jmeter的引數化設定:
我們首先學習Jmeter引數化最基本的全域性變數:
首先我們進行一些全域性變數資訊的講解:
# 如何定義?
# 我們可以線上程組下,建立設定元件的使用者定義的變數
# 具體作用?
# 定義一些全域性變數方便我們頻繁使用,例如我們頻繁使用某些欄位或某些資料,我們就可以定義為全域性變數進行使用
# 如何使用?
# 我們只需要在需要匯入的地方採用${變數名}就可以使用
我們直接給出全域性變數定義的介面:
我們再給出一張使用圖:
同樣我們首先給出使用者引數的相關概念:
我們先來進行簡單介紹:
# 如何定義?
# 我們可以線上程組下,建立前置處理器的使用者引數
# 具體作用?
# 針對一組引數,當不同使用者使用時,會獲取不同的資料
# 如何使用?
# 我們只需要在需要匯入的地方採用${變數名}就可以使用
我們首先給出一張使用者引數設定圖:
然後我們再給出一張使用圖或者說我們的設定圖:
我們首先給出資料檔案的相關定義:
我們同樣給出介紹:
# 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中的結果自動判斷工具:
我們首先給出一張響應斷言頁的圖片:
由於頁面內容過多無法在圖中展示所有欄位含義,我們單獨在下面介紹上述欄位意義:
# 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中的某個欄位來進行匹配判斷:
除了上述我們對結果進行斷言判斷外,我們有時還需要進行效能測試,我們就需要判斷在規定時間內是否滿足條件:
我們直接給出一張斷言持續時間介面圖:
我們同樣給出一個簡單的結果範例展示:
我們在使用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提取器,其實就是一個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,"//p[@id='p1']/input").send_keys("123")
# 2. 利用元素屬性-定位
# 一個元素通常會有多個屬性,包括id,name以及自定義屬性等
# 例如//input[@id='passwordA'],表示該id為passwordA的input元素
driver.find_element(By.XPATH,"//input[@id='passwordA']").send_keys("123")
# 3. 屬性與邏輯結合-定位
# 如果我們出現元素內含有多個屬性,且每個屬性都有多個元素共用,我們就不能使用單個屬性進行元素定位
# 所以我們需要使用邏輯方法來進行多屬性判定,例如and,or等方法
driver.find_element(By.XPATH,"//input[@id='passwordA' and @placeholder='密碼A']").send_keys("123")
# 4. 層級與屬性結合-定位
# 如果通過元素自身的資訊不方便直接定位到該元素,則可以先定位到其父級元素,然後再找到該元素
# 例如我們所需要定位的input上沒有任何獨立的屬性,但是它的父類別有獨立屬性,那麼我們就可以根據父元素去定位子元素
driver.find_element(By.XPATH,"//*[@id='p1']/input").send_keys("123")
# 最後我們介紹幾個XPATH的常用的延申內建屬性方法
# 下面的*表示任意元素,這個是HTML中所定義的內容
# 文字內容是xxx的元素
driver.find_element(By.XPATH,"//*[text()="xxx"]")
# 屬性中含有xxx的元素
driver.find_element(By.XPATH,"//*[contains(@attribute,'xxx')]")
# 屬性以xxx開頭的元素
driver.find_element(By.XPATH,"//*[starts-with(@attribute,'xxx')]")
那麼我們首先還是給出XPath的展示圖:
我們同樣給出一張簡單範例圖:
最後我們再來介紹一個JSON提取器,同樣也是很簡單的格式:
我們同樣首先給出一張展示圖並進行解釋:
我們給出一張簡單範例圖解釋:
下面我們來介紹Jmeter的屬性相關資訊:
Jmeter屬性的設定同樣需要函數來進行set和get操作:
首先我們介紹一下Jmeter連線資料庫的主要作用:
接下來我們就來講解如何進行資料庫連線:
我們在進行Jmeter操作的時候可能會進行過濾或者重複操作等,我們就會使用到邏輯控制器
首先我們來介紹if邏輯控制器:
然後我們給出一張if邏輯控制器的展示圖進行引數介紹:
下面我們來介紹while邏輯控制器:
我們直接給出邏輯控制器的展示圖進行引數介紹:
最後我們介紹一個ForEach邏輯控制器,它是用於對組中元素均執行所建立的控制器:
我們首先給出Foreach邏輯控制器的展示介面:
我們這裡只介紹foreach如何與使用者自定義變數來結合使用,其實原理都是相同的,針對組我們都可以採用foreach進行遍歷操作:
最後我們來介紹Jmeter中最常用的三種定時器:
我們首先來介紹同步定時器:
我們直接介紹同步定時器的展示介面:
下面我們來介紹常數吞吐量定時器:
我們直接給出常數吞吐量定時器的展示介面:
最後我們來介紹固定定時器:
我們直接給出固定定時器的展示介面:
這篇文章中詳細介紹了效能測試以及效能測試工具Jmeter的詳情使用,希望能為你帶來幫助
下面給出我學習和書寫該篇文章的一些參考文章,大家也可以去查閱: