在本系列文章的上一篇中,我們介紹了開源測試工具 JMeter,並以一個簡單的HTTP測試為例一窺JMeter的能力。在本篇文章中,我們將進一步介紹JMeter豐富的元件,以幫助大家構建複雜場景的測試指令碼。
JMeter的測試指令碼在介面中以「樹」的形式呈現,儲存後的測試指令碼jmx檔案本身也是xml格式。JMeter指令碼樹以測試計劃(Test Plan)為根節點,所有的測試元件都會被包含在測試計劃中。測試計劃中可以配置被整個測試計劃中的元件呼叫的自定義變數、執行緒組執行模式、測試中使用的庫檔案等。
在測試計劃中使用多種測試元件,就可以構建豐富的測試場景。JMeter中的測試元件大致有以下幾類:執行緒組、取樣器、邏輯控制器、監聽器、配置元件、斷言、定時器、前置處理器、後置處理器。接下來將分別介紹,並對主要的元件進行詳細說明。
一、執行緒組
執行緒組元件是所有測試計劃的入口。所有的取樣器和控制器必須放線上程組下。一個執行緒組可以看作一個虛擬使用者池,其中的每個執行緒都可以理解為一個虛擬使用者,多個虛擬使用者同時去執行相同的一批次任務。每個執行緒之間都是隔離的,互不影響的。一個執行緒的執行過程中,操作的變數不會影響其他執行緒的變數值。
執行緒組的介面如下圖:
線上程組介面中可以設定以下資料,進行執行緒組的控制:
取樣器錯誤後要執行的動作
這幾個配置項控制了「當遇到錯誤的時候測試的執行策略」是否會繼續執行。
- 繼續:忽略錯誤,繼續執行
- 啟動下一程式迴圈: 忽略錯誤,執行緒當前迴圈終止,執行下一個迴圈。
- 停止執行緒:當前執行緒停止執行,不影響其他執行緒正常執行。
- 停止測試:整個測試會在所有當前正在執行的執行緒執行完畢後停止
- 立即停止測試:整個測試會立即停止執行,當前正在執行的取樣器可能會被中斷。
執行緒數
執行緒數也就是併發使用者數,每個執行緒將會完全獨立地執行測試計劃,互不干擾。測試中使用多個執行緒用於模仿對伺服器的併發訪問。
ramp-up時間
ramp-up時間用於設定啟動所有執行緒所需要的時間。例如:執行緒數設定為10,ramp-up時間設定為100秒,那麼JMeter將使用100秒使10個執行緒啟動並執行,每個執行緒將在前一個執行緒啟動後的10秒啟動。
如果ramp-up值設定得很小、執行緒數又設定得很大,剛開始執行測試時會對伺服器產生很大的壓力。
迴圈次數
設定結束前執行緒組中每個執行緒迴圈的次數。
延遲建立執行緒直到需要
預設情況下,測試開始的時候,所有執行緒就全部建立了。如果勾選了此選項,那麼執行緒在需要用到的時候才建立。
執行緒組排程器
排程器配置可以更靈活地控制執行緒組執行的時間
(1)持續時間:控制測試執行的持續時間,以秒為單位。
(2)啟動延遲:控制測試在多久後啟動執行,以秒為單位。
二、取樣器
取樣器是用來模擬使用者操作的,是向伺服器傳送請求、接收伺服器響應資料的執行單元。取樣器是包含線上程組內部的元件,因此它必須線上程組中新增。JMeter原生支援多種不同的取樣器,如TCP取樣器、HTTP請求、FTP請求、JDBC請求、Java請求等,每一種不同型別的取樣器根據設定的引數向伺服器發出不同型別的請求。
TCP取樣器
TCP 取樣器通過TCP/IP來連線指定伺服器,連線成功後向伺服器傳送訊息,然後等待伺服器回覆。
介面如圖:
TCP取樣器中可以設定的屬性有:
1.TCPClient classname
表示處理請求的實現類。預設使用org.apache.jmeter.protocol.tcp.sampler.TCPClientImpl, 使用普通文字進行傳輸。此外JMeter還內建支援BinaryTCPClientImpl和LengthPrefixedBinaryTCPClientImple, 前者使用十六進位制報文,後者在BinaryTCPClientImpl的基礎上增加了2個位元組的長度字首。
也可以通過繼承org.apache.jmeter.protocol.tcp.sampler.TCPClient來提供自定義的實現類。
2.目標伺服器設定
「伺服器名稱或IP」和「埠號」指定了伺服器應用的主機名/IP地址和埠號。
3.連線選項
- Re-use connection:: 如果選中,這個連線會一直處於開啟狀態,否則讀取到資料後就關閉。
- 關閉連線:如果選中,這個連線在TCP取樣器執行完畢之後就會被關閉。
- 設定無延遲:如果選中,Nagle演算法將被禁用,允許小資料包的傳送。
- SO_LINGER:用於控制在關閉連線之前是否要等待緩衝區中的資料傳送完成。
- 行尾 (EOL)位元組值:用於判斷行結束的位元組值,如果指定的值大於127或者小於-128,會跳過EOL檢查。比如伺服器端返回的字串都是以回車符結尾,那麼我們可以將該選項設定成10
4.超時時間:
- Connect Timeout:連線超時
- Response Timeout:響應超時
5.要傳送的文字
請求傳送的報文文字
6.登陸配置
設定連線使用的使用者名稱和密碼
HTTP請求取樣器
HTTP取樣器向web伺服器傳送HTTP/HTTPS請求。
1.名稱和註釋
2 .請求協議
向目標伺服器傳送請求時使用的協議,可以是HTTP、HTTPS或FILE,預設為HTTP。
3.域名或IP地址
請求傳送的目標伺服器名稱或IP地址。
4.埠號
Web服務監聽的埠號,HTTP預設埠為80,HTTPS預設埠443。
5.請求方法
傳送請求的方法,常用GET、POST、DELETE、PUT、TRACE、HEAD、OPTIONS等。
6 .路徑
要請求的目標URL路徑(不包括伺服器地址和埠)。
7.內容編碼
適用於POST、PUT、PATCH和FILE這幾種請求方式,對請求內容進行編碼的方法
8.更多請求選項
- 自動重定向:重定向不會被視為單獨的請求,不被JMeter記錄。
- 跟隨重定向:每次重定向都被視為單獨的請求,都會被JMeter記錄。
- 使用KeepAlive:如果選中,JMeter和目標伺服器之間通訊時會在請求頭中加入Connection: keep-alive。
- 對POST使用multipart/form-data:如果選中,將使用multipart/form-data 或 application/x-www-form-urlencoded傳送請求。
9.引數
JMeter將使用引數鍵值對來生成請求引數,並根據請求方法以不同方法傳送這些請求引數。例如:GET,DELETE請求,引數會附加到請求URL。
10.訊息體資料
如果希望傳輸JSON格式的引數,需要在請求頭中配置Content-Type為application/json
11.檔案上傳
在請求中傳送檔案,通常HTTP檔案上傳行為可以通過這種方式模擬。
三、邏輯控制器
JMeter 邏輯控制器可以對元件的執行邏輯進行控制,JMeter 官網是這樣解釋的:「Logic Controllers determine the order in which Samplers are processed」。也就是說邏輯控制器可以控制取樣器(samplers)的執行順序,因此控制器需要和取樣器一起使用。除僅一次控制器外,其他邏輯控制器可以相互巢狀。
JMeter 中的邏輯控制器主要分為兩類:
- 控制測試計劃執行過程中節點的邏輯執行順序,如:迴圈控制器、If 控制器等;
- 對測試計劃中的指令碼進行分組、方便 JMeter 統計執行結果以及進行指令碼的執行時控制等,如:吞吐量控制器、事務控制器。
事務控制器
有時候我們想統計一組相關請求的的整體響應時間,這種情形就需要藉助事務控制器。
事務控制器會對該控制器下所有子節點的取樣器執行消耗時間進行統計。如果事務控制器下定義了多個取樣器,所有取樣器都執行成功時,整個事務才能算成功。
如下圖新增事務控制器:
事務控制器的配置項有:
1.Generate parent sample
如果選中,事務控制器將作為其他取樣器的父級樣本,否則事務控制器僅作為獨立的樣本。
例如,未勾選情況下彙總報告如下:
勾選情況下彙總報告如下:
2.include duration of timer and pre-post processors in generated samle:
指定是否包含定時器,如果勾選將在取樣器執行前與執行後加上延時。
僅一次控制器
僅一次控制器,顧名思義就是隻執行一次的控制器,即線上程組下的迴圈執行過程中對該控制器下的請求只執行一次。對於需要登入的測試,可以考慮將登入請求放在僅一次控制器中,因為登入請求只需執行一次即可建立會話。
如下圖新增僅一次控制器:
如果我們將執行緒組迴圈次數設定為 2,執行後檢視結果樹,可看到僅一次控制器下的請求“HTTP請求3”只執行了1次,其它請求執行了2次
四、監聽器
監聽器是用於對測試結果資料進行處理和視覺化展示的一系列元件。察看結果樹、 圖形結果、聚合報告等都是我們經常用到的監聽器元件。
察看結果樹
該元件以樹形結構展示了每一個取樣器的結果、請求內容、響應時間、響應碼、響應內容等資訊,檢視這些資訊可以輔助分析是否存在問題。它提供多種的檢視格式和篩選方法,也可以將結果寫入指定檔案進行批量分析處理。
五、配置元件
配置元件用於提供對靜態資料配置的支援。它可以定義在測試計劃層級下,也可以定義線上程組或取樣器層級下,定義在不同層級,作用域也不同。配置元件主要有使用者自定義變數、CSV資料檔案設定、TCP取樣器配置、HTTP Cookie管理器等。
使用者自定義變數
通過設定一系列的變數,達到在效能測試過程中可以隨機選取變數的目的。變數名可以在作用域內引用,通過${變數名}方式來引用變數。
除了“使用者自定義變數”這個元件外,測試計劃和HTTP請求等多個元件中也可以定義變數:
例如:在HTTP請求中引用了已定義的變數:
檢視執行結果,能看到確實獲取到了變數的取值:
CSV資料檔案設定
在效能測試過程中我們往往需要一些引數化的輸入引數,比如登入操作裡面的使用者名稱密碼。當併發量比較大的時候 ,執行時生成資料會對CPU和記憶體造成較大的負擔,而CSV資料檔案配置可以作為這種場景下所需的引數來源。
CSV資料檔案設定中部分引數的說明如下:
- 變數名稱:定義CSV檔案中的引數名,定義後可在指令碼在以${變數名}的方式引用
- 遇到檔案結束符再次迴圈:如果設定為True,允許對CSV檔案迴圈取值
- 遇到檔案結束符停止執行緒:如果設定為True,則讀取完CSV檔案中的記錄後停止執行
- 執行緒共享模式:設定線上程及執行緒組間共享的模式
六、斷言
斷言即檢查介面的返回是否符合預期。斷言是自動化測試指令碼中舉足輕重的一環,因此要十分重視。
JMeter 常用斷言主要有響應斷言(Response Assertion)、JSON斷言(JSON Assertion)、大小斷言(Size Assertion)、斷言持續時間(Duration Assertion)、beanshell 斷言(Beanshell Assertion)等,這裡我們只介紹經常要用到的 JSON斷言。
JSON 斷言
用於對 JSON 格式的響應內容進行斷言。
下圖在一個HTTP取樣器上新增 JSON 斷言:
JSON斷言配置項有:
- Assert JSON Path exists:需要斷言的 JSON 表示式
- Additionally assert value:如果要根據值去斷言,請勾選
- Match as regular expression:如果要根據正規表示式去斷言,請勾選
- Expected Value:期望值
- Expect null:如果期望是 null 則勾選
- Invert assertion:取反
其中 JSON path 中的「根成員物件」總是被稱為$
,可以通過 「dot–notation」(.號)或 「bracket–notation」([]號)這兩種不同的風格來表示,比如 $.message[0].name
或 $['message'][0]['name']
。
下面以請求 http://www.kuaidi100.com/query 為例,其中 $.message
表示響應 json 物件的中 message
,勾選 Additionally assert value
表示要根據 message
的值去判斷,Expected value
為 ok
表示判斷 message
的值是否為 ok
。
執行指令碼,檢視結果,可看到斷言是通過的
斷言的判斷條件主要包括:如果響應結果不是 json 格式的,失敗;如果 json path 找不到元素,失敗;如果 json path 找到元素,沒有設定條件,通過;如果 json path 找到元素,但不符合條件,失敗;如果 json path 找到元素,且符合條件,通過;如果 json path 返回的是一個陣列,會迭代判斷是否有元素符合條件,有則通過,沒有則失敗。回到“JSON斷言”,勾選 Invert assertion
執行指令碼,檢視結果,可看到斷言是失敗的
七、定時器
在效能測試中,訪問請求之間的停頓時間被稱之為思考時間。在實際操作中,停頓時間可以是內容查詢、閱讀等花費的時間,而定時器正是用來模擬這種停頓時間。其中:
- 同一作用域下的所有定時器優先於 取樣器之前執行。
- 如果希望定時器僅應用於其中一個取樣器,則把定時器加入到該取樣器的子節點。
JMeter定時器主要包括:固定定時器(Constant Timer),統一隨機定時器(Uniform Random Timer),精準吞吐量定時器(Precise Throughput Timer),常數吞吐量定時器(Constant Throughput Timer),高斯隨機定時器(Gaussian Random Timer),JSR223 定時器(JSR223 Timer),泊松隨機定時器(Poisson Random Timer),同步定時器(Synchronizing Timer),BeanShell 指令碼編寫定時器(BeanShell Timer)。
固定定時器
固定定時器,即配置每個請求之間的間隔時間為固定值。
下圖在一個事務控制器上新增固定定時器:
將執行緒延遲分別配置為 100 和 1000後,執行指令碼
檢視錶格結果中的資料,其中1、2是配置為 100 毫秒時的執行結果,4、5是配置為 1000 毫秒時的執行結果,可看到 4、5 的間隔時間明顯比 1、2 的間隔時間長
常數吞吐量定時器:
常數吞吐量定時器用於控制請求按指定的吞吐量去執行。
下圖在一個事務控制器上新增常數吞吐量定時器:
配置目標吞吐量為 120(注意單位是分鐘),基於計算吞吐量選擇“當前執行緒組中的所有活動執行緒(共享)”
執行指令碼,檢視結果,可看到吞吐量基本維持在 2/每秒(120/60)
八、前置處理器和後置處理器
前置處理器是取樣器請求之前執行一些操作,經常用於在取樣器請求執行前修改引數,設定環境變數,或更新未從響應文字中提取的變數。
同樣的,後置處理器是在取樣器請求之後執行一些操作。有時候伺服器的響應資料在後續請求中需要用到,我們就需要對這些響應資料進行處理。比如獲取響應中的jwt token,在後續請求中使用以進行身份驗證,這時就會使用後置處理器。
以上就是JMeter主要的測試元件介紹,大家可以在實戰中嘗試使用。下期文章我們將講解 JMeter 中的 MQTT 外掛使用。