每周讀書與學習->初識JMeter 元件(一)
每周讀書與學習是由清華大學出版社出版的《JMeter核心技術、性能測試與性能分析》一書的作者推出,分享作者多年的IT從業經歷,希望對很多計算機科學技術IT類專業畢業生以及IT從業者有所幫助。
Jmeter元件是使用Jmeter來完成性能測試的基礎,是整個Jmeter的核心,Jmeter是由很多個不同種類的元件來共同組成的,每個元件具有不同的功能,編寫Jmeter的性能測試腳本就是將多個功能不同的元件串聯起來完成一個性能測試場景的過程,如下圖所示,下圖中展示的就是Jmeter中常用到一些元件的種類,每個不同種類的元件可以在性能測試中起到不同的作用,通常需要不同的元件來共同協作,才能完成一個性能測試場景。

1、測試計劃
Jmeter 測試計劃是Jmeter中最底層的邏輯運行容器,是用來描述和組織一個性能測試腳本和測試場景的前提,所有的Jmeter元件都必須運行在一個測試計劃下面,如下圖所示。

從圖中可以看到,測試計劃主要包括:
- 測試計劃的名稱和注釋:整個測試計劃命名的名稱,和對該測試計劃的詳細注釋,通??梢宰远x填寫,當然建議最好能表達腳本的意義,方便將來對歷史腳本進行追溯時,能知道當初編寫的性能測試計劃和腳本的含義。
- 用戶定義的變量:Jmeter允許用戶在測試計劃中添加自定義的變量,這里定義的變量是整個測試計劃中使用到的全局變量。
- 獨立運行每個線程組:由于在測試計劃中,可以添加多個線程組,該選項主要用于控制多個線程組的執行順序。當勾選該選項時表示每個線程組都是獨立運行,通??梢宰龅桨凑枕樞騺韴绦忻恳粋€線程組,比如先運行線程組A,等待線程組A運行完后再運行線程組B,如果不勾選該選項時表示每個線程組可以同時并行運行,如下圖所示。

這個選項通常適用于混合場景的性能測試的需要,如下圖所示,以在淘寶商城購買商品為例。
- 用戶需要先登錄然后再查詢商品,而登錄只需要做一次,所以多個并發用戶登錄,可以設置成一個線程組A,用于并發完成用戶的登錄。
- 用戶登錄后,用戶就可以查詢商品或者提交訂單了,所以查詢商品和提交訂單是可以分別設置為一個線程組,而且這兩個線程組是可以并行運行的。
- 由于登錄時,每個用戶只需要執行一次,并且通常都是先登錄,然后再去查詢商品或者提交訂單,所以登錄和查詢商品或者提交訂單之間通常建議設置成串行執行。

- 主線程結束后運行tearDown線程組:表示是否當線程組停止運行時繼續運行tearDown線程組,一般很少用到該選項。
- 函數測試模式:表示是否保存性能測試的響應結果數據或者性能樣本數據,如果勾選后,通常會消耗比較大的本地磁盤IO資源,一般不建議勾選,除非是在做性能測試腳本調試時需要特殊定位問題才建議勾選,并且在問題定位完成后,就去掉該選項的勾選。
- 添加目錄或jar包到ClassPath:用于向Jmeter中添加第三方的jar包,在前面已經提到Jmeter底層是基于Java 語言來開發的,這個功能就是用于向Jmeter中添加第三方的外部Jar包,比如我們需要通過JDBC的協議對SQL Server 數據庫進行性能壓測,但是由于Jmeter自身沒有自帶連接SQL Server數據庫的驅動Jar包,所以就需要用到這個功能來添加一個SQL Server的驅動Jar包以完成通過JDBC協議來對SQL Server數據庫做性能壓測。
2、線程組
通常情況下,每個性能測試場景都需要先在Jmeter界面上創建一個線程組,然后才能運行后續的性能測試腳本,因為性能壓測通常都是需要模擬大量的用戶來進行并發操作,那么就需要線程組來通過多個線程的方式來模擬產生大量的用戶。線程組主要控制整個性能測試的運行開始時間以及運行時長、線程數量(即并發用戶數)等,如下圖所示。

從圖中可以看到線程組主要包括:
- 名稱和注釋:線程組的命名,尤其是當一個測試計劃中包含多個線程組時,通常建議需要填寫線程組的名稱和注釋,方便區分以及將來對歷史腳本進行追溯時,能知道當初創建線程組的明確含義。
- 在取樣器錯誤后要執行的動作:
- 繼續:表示當取樣器發生報錯時,線程組繼續往下執行,這也是默認選項。
- 啟動下一進程循環:表示忽略當前的取樣器報錯,繼續開始下一個性能壓測循環。
- 停止線程:表示退出當前取樣器報錯所在的線程,讓該線程不再運行,由于一個線程組中通常會包含多個線程,此處的停止線程僅僅是停止當前取樣器報錯所在的線程,并不是停止所有的線程,如下圖所示。
-
停止測試:等待當前取樣器報錯所在的線程運行結束當次測試后,停止整個性能測試。
立即停止測試:不做任何等待,直接停止整個性能測試。

- 線程屬性:線程屬性用于設置線程組中線程的運行參數,線程屬性主要包括:
- 線程數:用于設置該線程組需要啟動的線程數(并發用戶數)。
- Ramp-Up時間(秒):表示設置的線程數需要在多久內創建完成,此處的時長單位為秒。
- 循環次數:表示循環進行性能壓測的次數,當勾選永遠選項時,表示性能壓測一直運行,直到手工停止。
- Same user on each iteration:如下圖所示,表示線程每次循環迭代運行時,每個線程都使用同一個用戶,Jmeter做性能壓測時,通常每次循環迭代運行時都需要通過參數化的形式去獲取一個用戶,當勾選了該選項時,線程每次循環迭代運行時不再重新去從參數化用戶中獲取一個新用戶,當用戶參數化數據中的用戶多于線程組的線程數時,會導致超出線程數的剩余用戶將永遠不會被用到。
- 延遲創建線程直到需要:表示是否要延遲創建線程,如果不勾選該選項,會在線程組初始化時,就會直接創建好預先已經設置的線程數量。
- 調度器:用于設置性能壓測持續的時長以及運行啟動的延遲時長,設置時長時的單位為秒。

3、配置元件
在Jmeter中配置元件主要用于完成性能測試中需要的一些配置信息的配置以用來初始化變量或者參數的默認值、比如讀取指定的CSV文件數據、設置公共請求參數、賦予變量值等,以便在后續性能測試腳本中能被取樣器直接使用等,如下圖所示。

從圖中可以看到配置元件通常包括:
- CSV Data Set Config:表示從指定路徑的CSV 數據中讀取和設置配置信息。
- HTTP信息頭管理器:表示設置HTTP請求的信息頭管理器,這里的HTTP請求通常指的就是HTTP請求的取樣器,每一個HTTP 請求都有請求頭信息,而且通常會有默認的請求頭信息,如果不使用默認的信息頭信息,可以通過HTTP信息頭管理器來進行修改。
- HTTP Cookie管理器:表示自定義設置HTTP請求的Cookie,Cookie通常是由服務器返回到瀏覽器并直接保存在瀏覽器上的一小塊數據,瀏覽器在之后的的請求中,都會攜帶著這一小塊的數據,如下圖所示,Cookie的作用通常用于區分是否是同一個用戶發送的請求,Cookie通常分為如下幾種。
- 會話Cookie:指的是該Cookie的生命周期是會話級的,當會話關閉時(比如瀏覽器關閉),Cookie就會失效。
- 持久 Cookie:指的是可以長期使用的Cookie,但是通常也會帶有具體的過期日期,并且可以在不同的瀏覽器中都可以使用。

- HTTP緩存管理器:指的是HTTP請求的緩存管理設置,通常用于在性能測試中模擬瀏覽器的緩存行為,HTTP緩存管理器用于設置JMeter 如何處理 HTTP 請求的緩存。
- HTTP請求默認值:用于設置HTTP請求的默認值,比如請求的協議、服務端的IP或者域名地址、服務端的端口號、默認的HTTP請求參數等。
- Bolt Connection Configuration:用于配置Bolt 協議連接,Bolt 是一種基于TCP的網絡應用連接協議,比如連接Neo4j數據庫(一個高性能的NOSQL圖形數據庫)時,采用的就是這種協議。
- 計數器:通常用于在測試時,生成連續不重復的數字,計數器的用途通常用于生成一個唯一的數字或者Id,比如當向數據庫中插入數據時,需要保證數據的唯一性,就可以用計數器來構造唯一不重復的數據。當定義了一個計數器后,就可以通過引用名稱來引用這個計數器,此時就可以把計數器當成一個變量來引用和使用。
- DNS緩存管理器:通常用于設置自定義的DNS解析,其實就是在Jmeter中設置了一個自定義域名和服務端IP的映射關系,當訪問自定義的域名時,就直接將請求發送到對應的服務端IP上。
- FTP默認請求:用于設置FTP取樣器請求的默認配置,包括FTP服務端的IP、端口號、遠程文件的路徑等信息。
- HTTP授權管理器:用于設置和管理HTTP 請求的授權認證方式,當HTTP 服務端需要做授權認證時,就需要用到該授權管理器,授權管理器允許為服務端指定一個或者多個認證用戶,并且為這些認證用戶指定默認的用戶名和密碼,使用的場景通常是在一些服務端身份證驗證的網站中,當用戶瀏覽某個頁面時,會自動彈出一個身份認證的登錄界面或者登錄對話框,Jmeter在遇到這種場景時,就會自動傳入默認設置的授權認證信息,授權認證時需要在Jmeter界面中設置的參數配置包括:
- Base URL:用于設置與待鑒權的一個或者多個HTTP URL地址匹配的部分或者完整URL地址。
- Username:用于設置待授權的用戶名。
- Password:用于設置待授權的用戶名對應的密碼。
- Domain:用于設置待授權的域名地址。
- Realm:用于設置待授權的領域。
- Mechanism:用于設置身份驗證類型,JMeter可以根據使用的Http請求取樣器來執行不同類型的身份驗證,比如當Http請求取樣器的客戶端實現為 純Java語言實現時(即客戶端實現的下拉框選擇為Java),其Mechanism為BASIC,而當為HttpClient4實現時, Mechanism則可以支持BASIC、 DIGEST 和Kerberos這三種類型,如下圖所示。

- JDBC Connection Configuration:用于設置JDBC取樣器請求的默認配置信息,通常包括JDBC URL、JDBC 驅動的Class名稱、用戶名、密碼、JDBC的超時配置等信息,具體包含的詳情如下:
- Variable Name for created pool:用于設置創建的連接池的變量名稱,在Jmeter測試計劃中可以同時創建多個JDBC Connection Configuration,然后在每個JDBC Connection Configuration中設置一個不同的變量名稱,然后每個JDBC取樣器可以綁定對應的不同的連接池變量,因為在一個Jmeter測試計劃中,可以創建多個JDBC取樣器。
- Max Number of Connections:用于設置連接池中最大的連接數,如果將其設置為0,則表示Jmeter多并發用戶線程中,每個線程都可以獲得自己的連接池,并且每個線程自己的連接池中都只有1個線程,以達到每個線程之間不會共享連接,如果需要使用共享連接池,那么建議需要將最大的連接數設置為與線程總數相同,以確保線程不會相互等待連接釋放。
- Max Wait (ms):設置Jmeter嘗試檢索獲取連接的最大等待時長,單位為毫秒,如果超出該時長,會拋出異常,如果設置為0或者小于0則表示設置為無限期等待。
- Time Between Eviction Runs (ms):用于設置空閑對象驅逐線程運行之間會休眠的時長,單位為毫秒,默認為“60000”,即1分鐘,空閑對象驅逐線程通常用于對一些空閑不用的連接進行釋放以節省服務器端相關資源的開銷。
- Auto Commit:用于設置是否打開連接的事務自動提交,在數據庫操作中通常是有事務的,數據庫事務通常具有如下特性。
- 原子性:事務是一個不可分割的工作單位,要么全部執行,要么全部不執行。如果事務中的任何一步操作失敗,整個事務都會被回滾,回到操作之前的狀態,不會造成數據的損壞或不一致。
- 一致性:事務在執行前后,數據庫從一個一致性狀態轉移到另一個一致性狀態。即使在事務執行過程中出現異常,數據庫也會通過回滾操作,將數據恢復到一致性狀態。
- 隔離性:事務的執行不會受到其他事務的影響,每個事務在執行過程中都應該感覺不到其他事務的存在。即使多個事務同時操作同一數據,也不會互相干擾。隔離性能夠防止并發事務導致的數據異常和不一致問題。
- 持久性:一旦事務被提交,其所做的修改將會永久保存在數據庫中,并且即使系統發生故障,這些修改也不會丟失。數據庫系統會將事務的修改持久化到磁盤中,以保證數據的持久性。
-
- Transaction isolation:用于設置數據庫事務的隔離級別,如果數據庫操作時,不設置事務隔離級別,可能會導致如下問題:
- 臟讀:一個事務會讀取了另一個事務還沒有提交的數據。
- 不可重復讀:一個事務的操作會引起另一個事務前后兩次讀取到的數據不一致。
- 幻讀:一個事務的操作導致另一個事務前后兩次查詢到的數據量不一樣多。
在Jmeter中,支持的隔離級別選項如下:
- TRANSACTION_NONE: 表示設置為無事務,即表示不使用事務。
- TRANSACTION_READ_UNCOMMITTED:表示設置為允許讀取其他還沒有被提交到數據庫的并發事務做出的修改,在所有的有效的事務級別中,這個事務在查詢時,查詢是最快的,因為不存在太多的事務等待。
- TRANSACTION_READ_COMMITTED:表示設置為可以讀取已經被提交到數據庫中的其他并發事務所做出的修改,如果其他的并發事務修改了數據,但是還沒提交,那么在該事務級別下查詢數據時,該數據是不會被查詢出來的。
- TRANSACTION_SERIALIZABLE:表示設置為等待其他的所有事務提交后才能執行當前的數據庫操作,這個事務隔離級別通常是最慢的,因為此時所有的事務都是串行執行的,后一個事務必須等前面一個事務提交后才能執行。
- DEFAULT:每個數據庫的默認隔離級別不一樣,比如常用的MySQL數據庫中的默認隔離級別為TRANSACTION_REPEATABLE_READ。
- TRANSACTION_REPEATABLE_READ:表示設置為數據讀取操作可以重復執行,即表示每次讀取同樣的數據應該總是得到同樣的結果,這個事務級別比TRANSACTION_SERIALIZABLE要快,但是比其他的事務隔離級別都要慢。
- 自定義編輯:允許用戶自己自定義輸入事務隔離級別的類型。
-
- Pool Prepared Statements:設置連接池中待準備的SQL語句的最大數量,如果設置為0表示最大數量不受限制,如果設置為-1表示禁用該功能。
- Preinit Pool:用于設置連接池是否可以立即初始化,默認為False,此時使用此連接池的JDBC取樣器可能會在首次查詢時使用的時長較久,因為此時整個連接池的連接建立時間都包含在內。
- Init SQL statements separated by new line:用于設置初始化的SQL語句,該SQL語句可以在連接池創建時,就立即執行,但是這些SQL語句僅在配置的連接池創建連接時執行一次。
- Test While Idle:用于設置是否開啟測試連接池是否可用的空閑連接。
- Soft Min Evictable Idle Time(ms):用于設置每個連接在連接池中可以空閑的最短時長,當超過該時長時可能就會被空閑對象驅逐線程驅逐,單位為毫秒。
- Validation Query:用于設置數據庫的查詢驗證,通常用于保持數據庫的連接或者檢查數據庫當前的狀態是否正常以及是否可以正常響應查詢,比如在MySQL、MariaDB、SQL Server 、PostgreSQL等數據庫中,可以設置為select 1。
- Database URL:用于設置數據庫的JDBC連接地址。
- JDBC Driver class:用于設置JDBC驅動的Class 名稱,常見數據庫的JDBC Driver class如下所示。
- Oracle數據庫:oracle.jdbc.OracleDriver
- DB2數據庫:com.ibm.db2.jcc.DB2Driver
- MySQL數據庫:com.mysql.jdbc.Driver
- SQL Server數據庫:com.microsoft.sqlserver.jdbc.SQLServerDriver 或者com.microsoft.jdbc.sqlserver.SQLServerDriver
- PostgreSQL數據庫:org.postgresql.Driver
- MariaDB數據庫:org.mariadb.jdbc.Driver
- Username:用于設置數據庫的用戶名。
- Password:用于設置數據庫的密碼。
- Connection Properties:用于設置建立JDBC連接時需要自定義指定的連接屬性,比如在Oracle數據庫中,可以自定義設置internal_long=sysdba。
- Java 默認請求:用于設置Jmeter中自帶的Java取樣器的默認配置信息。
- Keystore Configuration:用于設置Keystore,通常在HTTPS請求協議中會被使用到,使用該配置時需要先導入到Java密鑰庫中,Keystore配置包括預加載、別名變量、索引等選項。
- LDAP擴展請求默認值:用于設置LDAP擴展請求取樣器的默認值的配置,LDAP是一種網絡傳輸的應用層協議,Jmeter支持對LDAP服務做性能壓測。
- LDAP默認請求:用于設置LDAP請求取樣器的默認請求值的配置。
- 登錄配置元件/素:用于設置登錄配置的用戶名和密碼,通常用于用戶身份認證的場景設置。
- Random Variable:用于設置獲取隨機值,并且可以將該隨機值賦予給一個變量,然后在Jmeter中,可以直接引用這個變量來產生隨機數。
- 簡單配置元件:指可以通過簡單的方式來配置元素的值。
- TCP取樣器配置:用于設置TCP請求取樣器的默認配置,Jmeter 支持直接對TCP協議的服務發起性能壓測請求,該配置界面支持的配置如下。
- TCPClient classname:用于設置TCP客戶端的類名。
- 服務器名稱或IP:用于設置TCP服務端的域名或者IP。
- 端口號:用于設置TCP服務端的端口號。
- 連接超時:用于設置TCP連接的超時時長,單位為毫秒。
- 響應超時:用于設置TCP請求的響應超時時長,單位為毫秒。
- Re-use connection:如果選中該選項,TCP連接將始終保持打開狀態。否則,當數據被讀取完后,它將關閉。
- 關閉連接:如果選中該選項,則在運行取樣器結束后將關閉連接。
- 設置無延遲:用于是否將nodelay 屬性設置為true。
- SO_LINGER:用于設置在socket連接創建時,指定延遲時長,單位為秒。如果將延遲的時長設置為0,將可以避免大量TCP連接狀態為TIME_WAIT的連接存在,TIME_WAIT是TCP連接中的一種中間狀態,用于確保連接可靠關閉的關鍵狀態,通常持續60秒左右,但是如果大量的連接都處于TIME_WAIT狀態,將會導致連接不能及時釋放,從而導致性能測試時,連接不夠用,從而造成一定的性能瓶頸。
- 行尾(EOL)字節值:用于設置行尾的字節值,如果將其設置為-128到+127范圍之外的值,則可以跳過TCP請求中的EOL檢查。
- 要發送的文本:設置TCP請求需要發送的文本內容。
- 用戶定義的變量:用于設置用戶自定義的全局變量,該全局變量可以在整個Jmeter性能測試計劃中生效和使用。
4、本次學習總結
本次主要是對Jmeter中的元件做一個基礎的入門介紹,Jmeter元件是使用Jmeter來完成性能測試的基礎,也是核心,所以本章的內容是讀者們需要重點進行掌握的,通過本章的學習,建議讀者們需要掌握:
- Jmeter測試計劃以及線程組的使用。
- 配置元件的使用,包括CSV Data Set Config、HTTP信息頭管理器、HTTP Cookie管理器、HTTP緩存管理器、HTTP請求默認值、Bolt Connection Configuration、計數器、DNS緩存管理器、FTP默認請求、HTTP授權管理器、JDBC Connection Configuration、Java 默認請求、Keystore Configuration、LDAP擴展請求默認值、LDAP默認請求、Random Variable、簡單配置元件、TCP取樣器配置、用戶定義的變量等,其中CSV Data Set Config、HTTP信息頭管理器、HTTP Cookie管理器、HTTP緩存管理器、HTTP請求默認值、HTTP授權管理器、JDBC Connection Configuration等配置元件在Jmeter性能測試中會經常被用到,建議讀者們進行重點掌握。
出處:本次學習的內容參考自清華大學出版社出版的《JMeter核心技術、性能測試與性能分析》一書
浙公網安備 33010602011771號