文章目錄
- 前言
- Jmeter簡介
- 安裝與配置
- JDK安裝與配置
- JMeter安裝與配置
- 打開JMeter
- 方式一
- 方式二
- 設置Jmeter語言為中文
- 方法一(僅一次性)
- 方法二(永久設置成中文)
- Jmeter文件常用目錄
- 元件與組件
- 元件
- 組件
- 元件的作用域
- 元件的執行順序
- 第一個案例
- 添加線程組
- 添加 HTTP 請求
- 添加查看結果樹
- 響應結果亂碼問題
- 線程組
- 并行與串行
- 線程組的分類
- 線程組參數詳解
- HTTP請求
- HTTP請求參數詳解
- 查看結果樹
- HTTP信息頭管理器
- HTTP請求默認值
- HTTP Cookie管理器(HTTP Cookie Manager)
- 參數化
- 用戶定義變量(全局變量)
- 用戶參數
- CSV數據文件方式
- CSV數據文件設置參數詳解
- 函數
- 計數器${__counter(,)}
- 斷言
- 響應斷言
- JSON斷言
- 斷言持續時間
- Jmeter關聯
- 正則表達式提取器
- XPath提取器
- JSON提取器
- Jmeter屬性
- Jmeter錄制腳本(僅作介紹)
- Jmeter直連數據庫
- 邏輯控制器
- 如果(if)控制器
- 循環控制器
- Foreach控制器
- 定時器
- 同步定時器
- 常數吞吐量定時器
- 固定定時器
- 參考目錄
前言
閱讀本文前請注意最后編輯時間,文章內容可能與目前最新的技術發展情況相去甚遠。歡迎各位評論與私信,指出錯誤或是進行交流等。
Jmeter簡介
JMeter是一個純Java編寫的開源軟件,主要用于進行接口測試和性能測試。它支持測試的應用/服務/協議包括Web (HTTP, HTTPS)、SOAP/REST Webservices、FTP、Database via JDBC等。我們最常使用的是HTTP和HTTPS協議。
安裝與配置
JDK安裝與配置
因為jmeter是java開發的,所以運行的時候必須先要安裝jdk才可以。請注意,Jmeter對于JDK的版本有一定的要求,可以在下文Jmeter下載地址中查看,一般要求Java 8+。關于JDK的安裝與配置請各位自行資料,網上已有圖片配合的詳細安裝教程。
JMeter安裝與配置
下載地址:Apache JMeter - Download Apache JMeter
打開JMeter
注意:不管用使用哪一種方式打開,都會打開一個cmd窗口。如果關閉這個cmd窗口,打開的jmeter也會被關閉。
方式一
Jmeter下載后無需安裝,解壓后即可使用。解壓后到其apache-jmeter/bin目錄如下,雙擊jmeter.bat 即可以運行。
方式二
配置環境變量,利用cmd控制臺打開Jmeter。有需求的朋友請自行上網查閱資料進行配置。
設置Jmeter語言為中文
雖然Jmeter自帶的翻譯并不準確,但由于網上大部分的博客以及學習資料都是中文語言的Jmeter。因此,建議將Jmeter設置為中文。
方法一(僅一次性)
方法二(永久設置成中文)
找到jmeter下的bin目錄,打開jmeter.properties 文件
第三十七行,修改為language=zh_CN,并去掉前面的#。重新啟動Jmeter即可
Jmeter文件常用目錄
元件與組件
Jmeter進行接口測試和性能測試,并不是使用代碼來實現。而是使用已經封裝好的元件和組件進行操作。
元件
元件:多個具有類似功能的組件的容器(集合,類似于面向對象中的類)
Jmeter中的元件按功能分為這么多類,如上圖所見。例如 取樣器元件,其中的組件主要功能都是發送請求。
組件
組件:實現獨立的某個功能(類似于方法)
例如,取樣器中的組件都是用于發送請求的。但HTTP請求是用于發送HTTP請求的,JDBC Request組件是用于連接數據庫 并進行發送請求的。
元件的作用域
如圖,如果(if)控制器是HTTP請求2的父節點會對其起作用。注:如果(if)控制器屬于邏輯控制器元件,HTTP請求屬于取樣器元件。
固定定時器是HTTP請求3的子節點,該定時器只對HTTP請求3起作用。
固定定時器1的父節點是線程組(并不是取樣器),那么其作用域就是該線程組下的所有節點。
圖中的例子僅供理解與學習,現實的腳本設計不會如此混亂。
元件的執行順序
第一個案例
添加線程組
右鍵點擊“測試計劃” -> 添加 -> 線程(用戶) -> 線程組,添加測試需要的線程組
添加 HTTP 請求
JMeter的HTTP請求是測試中常用的功能,用于模擬用戶向服務器發送HTTP請求并獲取響應。
右鍵點擊線程組 -> 添加 -> 取樣器 -> HTTP請求,添加一個HTTP請求
點擊HTTP請求,輸入請求所需信息 http://www.baidu.com/s?ie=utf-8&wd=jmeter 參考下圖
添加查看結果樹
JMeter 的結果查看樹用于查看和分析HTTP請求的響應結果。
右鍵點擊線程組 -> 添加 -> 監聽器 -> 查看結果樹,添加一個查看結果樹
將查找下方的響應數據格式改為 HTML Source Formatted(自行指定響應數據的展現格式),點擊上方的綠色三角按鈕,運行http請求
運行結果如下
取樣器結果
HTTP響應體內容為,搜索返回結果頁面標題為“JMeter性能測試_百度搜索”,與之前設置的查詢參數相吻合。
響應結果亂碼問題
注:從此處開始介紹一些常用的元件和組件,其余沒有提到的元件和組件可自行查閱資料和查看Jmeter自帶文檔學習
線程組
作用:控制JMeter將用于執行測試的線程數,也可以把一個線程理解為一個測試用戶。
并行與串行
如上圖可知,我們設置了三個線程組。且內部有不同的HTTP請求,從執行結果來看。HTTP請求發送順序是隨機的,并不是按照從上到下的順序。因此,多個線程組默認是并行的。
點擊測試計劃,勾選獨立運行每個線程組(例如在一個組運行結束后啟動下一個),即可實現串行。
線程組的分類
即,Setup線程組會在其他所有線程組之前執行,Teardowm會在其他所有線程組之后執行。
線程組參數詳解
HTTP請求
作用:向服務器發送HTTP和HTTPS請求
位置:選中線程組->右鍵->添加->取樣器->HTTP請求
HTTP請求參數詳解
注:如果要一次性添加多個參數,可以將參數的鍵值對復制到剪切板,點擊窗口最下方的從剪切板添加按鈕即可批量添加參數。
查看結果樹
作用:查看HTTP請求的請求和響應結果
位置:選中測試計劃/線程組->右鍵->添加->監聽器->查看結果樹
注:對于取樣結果 尤其是響應數據 我們可以通過切換數據展現方式進行查看,例如圖中默認的是Text方式,可以點擊切換成想要的方式 例如HTML Json等格式
HTTP信息頭管理器
作用:給HTTP請求添加請求頭信息,信息頭即請求頭。
位置:點擊HTTP請求->右鍵->添加->配置元件->HTTP信息頭管理器
添加方式與HTTP請求的查詢參數方式相同, 也是用鍵值對的方式表示。
HTTP請求默認值
作用:針對HTTP請求中的相同部分(例如:協議、IP地址、端口、編碼格式)進行統一設置
位置:測試計劃->右鍵->添加->配置元件->HTTP請求默認值
HTTP Cookie管理器(HTTP Cookie Manager)
作用:如果你有一個 HTTP 請求,其返回結果里包含一個 cookie,那么 Cookie 管理器會自動將該 cookie 保存起來,而且以后所有的對該網站的請求都使用同一個 cookie
位置:右鍵 -> 添加 -> 配置元件 -> HTTP Cookie管理器
選項(Options)
(1)每次反復清除Cookies?:每次迭代時,都將 Cookies 清空
(2)Use Thread Group configuration to control cookie clearing:用戶線程組去配置清空 Cookie
(3)Cookie 格式
standard:標準格式
standard-strict:嚴格格式
ignoreCookies:此規格忽略所有 Cookie。被用來防止 HttpClient 接受和發送的 Cookie
netscape:是最原始的 Cookies 規范,同時也是 RFC2109 的基礎。盡管如此,還是在很多重要的方面與 RFC2109 不同,可能需要特定服務器才可以兼容
default:默認
rfc2109:是 HttpClient 使用的默認 Cookies 協議
rfc2965:定義了版本2并且嘗試去彌補在版本1中 Cookie 的 rfc2109 標準的缺點。規定 rfc2965 最終取代 rfc2109 發送 rfc2965 標準 Cookies 的服務端,將會使用 Set-Cookie2 header 添加到 Set-Cookie Header 信心中,rfc2965 Cookies 是區分端口的
compatibility:推薦選擇此種策略。這種兼容性設計要求是適應盡可能多的不同的服務器,盡管不是完全按照標準來實現的。如果你遇到了解析 Cookies 的問題,你就可能要用到這一個規范。有太多的 web 站點是用 CGI 腳本去實現的,而導致只有將所有的 Cookies 都放入 Request header 才可以正常的工作。這種情況下最好設置 http.protocol.single-cookie-header 參數為 true
存儲在Cookie管理器中的Cookie:表示已經存儲的Cookie,用戶也可以手動添加
參數化
參數化測試:把測試數據組織起來,用不同的測試數據調用相同的測試方法,實現測試數據與測試方法的分離。
用戶定義變量(全局變量)
作用:定義全局變量
位置:測試計劃/線程組–>配置元件–>用戶定義的變量
變量聲明也是用鍵值對的方式表示。
使用方法:在需要變量處,使用${變量名}引用。
用戶參數
假設有多個用戶同時請求, 每個用戶在登錄請求時需要不同的用戶名和密碼進行登錄,可以使用用戶參數。
作用:針對同一種方法,當不同的用戶來訪問時,可以獲取到不同的值。
位置:線程組–>前置處理器–>用戶參數
添加變量(變量可多個),用戶即是變量的值。
由于有兩個用戶,我們將線程組的線程數改為2,模擬兩個用戶。
隨后建立HTTP請求,訪問百度。并在參數中引用用戶參數,使用方法也是${變量名}。
創建查看結果數后運行。
從結果看,一共發送了兩次請求,兩次請求引用的參數分別就是設置好的兩個用戶參數。
CSV數據文件方式
作用:在多次循環中,取到不同的值。
位置:線程組—>配置元件—>CSV數據文件設置(CSV Data Set Config)
CSV數據文件設置參數詳解
使用步驟:
-
定義csv文件
-
添加線程組,設置循環次數為3(根據CSV文件的行數來確定,該例子為3)
-
添加CSV數據文件設置,文件名選擇CSV文件路徑即可。變量名稱用于Jmeter中引用,可自行指定,并不要求與CSV文件中的嚴格相同。由于我們定義的CSV首行是數據,所以不忽略首行。分隔符CSV文件中使用的是逗號
-
添加HTTP請求并引用參數,引用參數的方法同樣是${變量名}
-
添加查看結果數并執行
函數
Jmeter內部已定義好了一些函數供用戶使用,函數格式為雙下劃線開頭,后面跟著函數名稱,且函數名稱嚴格區分大小寫。
位置:Jmeter菜單欄->工具->函數助手對話框
以下為一些常用的函數
${__counter(,)} 計數器
${__dateTimeConvert(,)} 時間格式轉換
${__digest(,)} 加密 簡單加密 *****
${__intSum(,)} 整數相加函數
${__P(,)} 獲取屬性函數 *****
${__property(,)} 獲取屬性函數 *****
${__setProperty(,)} 設置屬性函數 *****
${__Random(,)} 隨機數
${__RandomString(,)} 隨機字符串
${__threadNum} 獲取線程號函數
${__time(,)} 獲取當前時間戳函數 *****
${__timeShift(,)} 數據格式化
${__V(,)} 拼接函數 *****
本文以計數器函數為例進行介紹,其他函數以及具體用法可以參考網絡資料以及Jmeter自帶的文檔。
計數器${__counter(,)}
在函數助手對話框中選擇counter函數,點擊生成,即可獲得計數器函數表達式${__counter(,)}。且生成了一個從1開始的計數器函數,初始值從1開始
添加一個訪問百度的HTTP請求,且引用計數器函數。使用方法在參數中直接引用
${__counter(,)},并將線程組循環次數進行調整。此處例子將循環次數設置為10
點擊執行并查看結果,從結果樹中我們可以看到。進行了10次請求,且每次引用的參數即計數器函數每次遞增。
注意:計數器函數每次遞增只能加1,若想用遞增加2或遞增更多的時候,需要使用配置原件中的 “計數器”;
斷言
斷言:讓程序自動判斷實際結果是否與預期結果一致
響應斷言
作用:對HTTP請求的任意格式的響應結果進行斷言
位置:測試計劃->線程組->HTTP請求->右鍵->添加->斷言->響應斷言
忽略狀態是復選框,由于Jmeter會自動判斷狀態碼,并將例如400等狀態碼判為錯誤。假如我們就是要模擬錯誤,就選擇忽略狀態。
如果填寫了多個預期結果,他們是邏輯與的關系。
JSON斷言
作用:對HTTP請求的JSON格式的響應結果進行斷言
位置:測試計劃->線程組->HTTP請求->右鍵->添加->斷言->JSON斷言
Assert JSON Path exists:填寫JSON元素所在的路徑,$為根節點。例 $.weatherinfo.city,斷言根節點下的weatherinfo節點,weatherinfo節點下的city節點值。
Additionally assert value:勾選之后,才能填寫Expected Value(期望值)。即JSON節點的值與期望值進行對比是否相等,如果此外還勾選了Match as regular expression,則在期望值框里輸入正則表達式,進行對比結果。
斷言持續時間
作用:測試HTTP請求的響應時間是否滿足需求
位置:測試計劃->線程組->HTTP請求->右鍵->添加->斷言->斷言持續時間
Jmeter關聯
當請求之間有關聯, 比如一個請求的參數是另一個請求的響應數據,這時候就需要用到關聯處理來進行提取響應數據中的值。
正則表達式提取器
作用:針對任意格式的響應結果進行提取
位置:測試計劃->線程組->HTTP請求->右鍵->添加->后置處理器->正則表達式提取器
關于正則表達式如何書寫,有需要的朋友請自行上網查閱。此外,可以用網頁版的正則表達式測試器來判斷自己所書寫的正則表達式是否正確。
模板中提到的正則表達式中的多個提取值,指的是 如果正則表達式中有多個(),也就是一次匹配中提取多個值,要取第一個()中的值,就填寫數字幾 且前后用$符號。
匹配數字指的是,正則表達式匹配到多組數值,取多組數值中的哪一個。
假如有多組數據,匹配數字為-1,那就是全部取值,那么引用參數中存儲的是一個列表形式,
在引用列表中其中一個參數,格式是${變量名_索引}
XPath提取器
作用:針對HTML格式的響應數據進行提取
位置:測試計劃->線程組->HTTP請求->右鍵->添加->后置處理器->XPath提取器
JSON提取器
作用:針對JSON格式的響應數據進行提取
位置:測試計劃->線程組->HTTP請求->右鍵->添加->后置處理器->JSON提取器
Jmeter屬性
作用:當有關聯的兩個請求不在同一個線程組中時,可以使用Jmeter屬性進行數據傳遞。
位置:測試計劃->線程組->右鍵->添加->取樣器->BeanShell取樣器
要使用BeanShell取樣器進行屬性設置, 要搭配其他的提取器和函數助手進行使用。
工作流程:提取器將數據提取后保存到變量中,通過_setProperty函數將提取器提取的變量值保存到Jmeter屬性中,在要使用該Jmeter屬性的地方通過_property函數引用。
設置函數_setProperty,這里表示Jmeter屬性的變量名稱為pro_city,其值為${city}(該值一般由提取器提取),點擊生成函數。
使用函數_property,在屬性名稱中輸入要使用的Jmeter屬性,點擊生成即可。The result of the function is 表示pro_city中值是什么。
操作步驟
- 添加線程組1
- 在線程組1下添加HTTP請求
- 添加JSON提取器(僅作演示)將HTTP請求響應結果 提取存為變量city
- 添加BeanShell取樣器 利用函數_setProperty,將JSON提取器變量city 設置為Jmeter屬性
- 添加線程組2
- 在線程組2下添加HTTP請求(并讀取Jmeter屬性)
Jmeter錄制腳本(僅作介紹)
用于在沒有API文檔時,編寫HTTP請求。Jmeter作為代理服務器,攔截和轉發請求與響應數據。(功能與抓包工具一樣)
Jmeter直連數據庫
使用場景
- 請求需要的參數, 從數據庫中獲取
- 斷言的預期結果從數據庫中獲取
- 清理接口測試后所留下的測試數據
- 通過數據庫獲取大量的測試數據
操作步驟,以mysql數據庫為例
位置:測試計劃->線程組->右鍵->添加->配置元件->JDBC Connection Configuration
Password:連接數據庫密碼,如實填寫
配置完成后,相當于連接數據庫成功,接下來就要執行SQL語句。
添加JDBC請求
位置:測試計劃->線程組->右鍵->添加->取樣器->JDBC Request
通過JDBC Request的SQL語句將返回結果存在變量里,在要使用的地方通過${變量名_索引}的方式進行引用
邏輯控制器
如果(if)控制器
作用:控制它下面的Jmeter組件是否運行
位置:測試計劃->線程組->右鍵->添加->邏輯控制器->if控制器
利用JS語法的方式書寫,表示判斷 變量name是否等于itcast 且注意要加雙引號 并不勾選下面的Interpret Condition as Variable Expression
循環控制器
作用:通過設置循環次數,實現循環發送請求
位置:測試計劃->線程組->右鍵->添加->邏輯控制器->循環控制器
思考:線程組也可以設置循環次數,為什么還要使用循環控制器?
答:線程組會使其下的所有HTTP請求循環一定次數,循環控制器會使其下的HTTP請求循環一定次數。他們兩的作用范圍不同,循環控制器可實現更精準的范圍控制。
此外,假設線程組設置了循環M次, 其下循環控制器又設置了循環N次, 那么循環控制器下的HTTP請求會循環執行 M*N 次
Foreach控制器
作用:遍歷變量中的值(值以列表的方式存在),搭配正則表達式提取器等進行使用。
位置:測試計劃->線程組->右鍵->添加->邏輯控制器->Foreach控制器
由上文的正則表達式提取器內容可知,如果變量值是列表形式,那么使用其中的某個值則是${變量名_索引}。所以 變量名即是輸入變量前綴,且在提取的時候要添加下劃線。因此需要勾選Add’_’ before number ?
如果列表是用戶自定義的數據,沒有下劃線 而是${變量名索引}的方式 那就取消勾選。
要循環使用Foreach控制器提取的變量 通過${輸出變量名稱}引用
定時器
同步定時器
作用:先阻塞線程,當在規定時間內達到一定的線程數量后,這些線程會在同一時間點一起釋放,瞬間產生很大的壓力,用于模擬高并發場景。
位置:測試計劃->線程組->右鍵->添加->定時器->Synchronizing Timer
此處,設置的并發線程數應該為小于等于線程數n,如果大于的話 則取n。
常數吞吐量定時器
作用:讓Jmeter按照指定的吞吐量執行, 以每分鐘為單位,大多用于模擬系統穩定運行下的吞吐量,進行穩定測試。
位置:測試計劃->線程組->右鍵->添加->定時器->Constant Throughout Timer
固定定時器
作用:讓其父節點等待設定的時間后運行。
位置:測試計劃->線程組->右鍵->添加->定時器->固定定時器
本文關于Jmeter的部分使用介紹就到此為此了, 關于更多的Jmeter使用方法請各位自行查閱資料,或者參考Jmeter自帶文檔。
參考目錄
https://blog.csdn.net/u014045237/article/details/143368211
https://blog.csdn.net/cool_tao6/article/details/142441207
https://blog.csdn.net/qq_45138120/article/details/130478599
https://www.bilibili.com/video/BV12Q4y1C7Wf
https://www.bilibili.com/video/BV19Q4y167Qo
https://www.bilibili.com/video/BV1Ne411M7Gb