1 JMeter基礎(chǔ)
1.1 JMeter概述
JMeter簡(jiǎn)介
Apache JMeter?是Apache組織開(kāi)發(fā)的一款開(kāi)源軟件芒澜,是典型的純Java開(kāi)發(fā)的應(yīng)用程序汁尺,可以在不同平臺(tái)比如Windows、Linux或macOS系統(tǒng)上進(jìn)行軟件測(cè)試娇妓。JMeter主要用于應(yīng)用程序的功能負(fù)載測(cè)試以度量軟件的性能,也可以用于其他類(lèi)型的測(cè)試比如接口測(cè)試辫塌,API測(cè)試等漏策。
JMeter版本
JMeter不同的版本,功能有所差異臼氨,對(duì)JDK的支持也不盡相同掺喻。新的JMeter版本有些功能會(huì)逐漸改進(jìn)完善,還會(huì)引入新的功能組件,性能也會(huì)逐步提升。因此在JMeter官方網(wǎng)站的最佳實(shí)踐中储矩,建議用戶(hù)無(wú)論如何最好使用最新的JMeter版本感耙。
這里以最新的JMeter5.1.1版本進(jìn)行介紹。
JMeter GUI界面
當(dāng)JMeter以GUI模式運(yùn)行時(shí)持隧,窗口主要由三部分構(gòu)成:
1.功能區(qū)
上方菜單欄即硼,下方工具欄。菜單欄展示了JMeter提供的功能菜單舆蝴,而工具欄中的圖標(biāo)是常見(jiàn)功能的快捷方式谦絮。
2.視圖區(qū)
以樹(shù)狀結(jié)構(gòu)呈現(xiàn)JMeter元素,其中“Test Plane”是樹(shù)的根節(jié)點(diǎn)洁仗,每一個(gè)節(jié)點(diǎn)就是一個(gè)JMeter元素层皱。
在此區(qū)域可以添加、刪除節(jié)點(diǎn)赠潦,或者通過(guò)拖曳調(diào)整節(jié)點(diǎn)的位置叫胖。
3.內(nèi)容區(qū)
在視圖區(qū)選中一個(gè)JMeter元素節(jié)點(diǎn),相應(yīng)地在內(nèi)容區(qū)則會(huì)顯示該元素的內(nèi)容她奥∥驮觯可以對(duì)其內(nèi)容進(jìn)行查看、設(shè)置等操作哩俭。
1.2 JMeter測(cè)試組成
JMeter構(gòu)建測(cè)試類(lèi)似于組裝一臺(tái)智能電子設(shè)備绷跑,比如智能手機(jī)。智能手機(jī)由CPU凡资、內(nèi)存砸捏、輸入輸出設(shè)備(比如USB接口,攝像頭等)隙赁、屏幕垦藏、電池等一系列物理部件構(gòu)成的。
JMeter測(cè)試也是由一系列JMeter元素組合起來(lái)構(gòu)成的伞访,JMeter提供了構(gòu)建測(cè)試的所有元素掂骏,你可以隨心所欲的將這些元素組裝起來(lái)完成你想要的測(cè)試。
JMeter元素有以下四種類(lèi)型的測(cè)試元素:
1)測(cè)試計(jì)劃
2)線程組
3)組件
包含配置元件厚掷、定時(shí)器弟灼、前置處理器级解、后置處理器、斷言與監(jiān)聽(tīng)器
4)控制器
包括取樣器和邏輯控制器
1.2.1 測(cè)試計(jì)劃
測(cè)試計(jì)劃描述了JMeter測(cè)試在運(yùn)行時(shí)執(zhí)行的一系列步驟袜爪。完整的測(cè)試計(jì)劃由一個(gè)或多個(gè)線程組蠕趁、邏輯控制器薛闪、取樣器辛馆、監(jiān)聽(tīng)器、定時(shí)器豁延、斷言和配置元件組成昙篙。
測(cè)試計(jì)劃元素是JMeter測(cè)試樹(shù)的根節(jié)點(diǎn),是唯一的诱咏,所有的測(cè)試元素節(jié)點(diǎn)都位于根節(jié)點(diǎn)之下苔可。
1.2.2 線程組
在手工測(cè)試中,測(cè)試用例由測(cè)試工程師手動(dòng)執(zhí)行完成袋狞。而性能測(cè)試與自動(dòng)化測(cè)試的測(cè)試用例由選擇的測(cè)試工具代替測(cè)試工程師來(lái)執(zhí)行焚辅。JMeter執(zhí)行測(cè)試的任務(wù)是由線程組來(lái)完成的。打個(gè)比方苟鸯,線程組相當(dāng)于手工測(cè)試中執(zhí)行測(cè)試用例的測(cè)試工程師同蜻。
線程組控制JMeter用來(lái)執(zhí)行測(cè)試的線程數(shù)。要模擬多少個(gè)用戶(hù)(稱(chēng)之為虛擬用戶(hù))來(lái)執(zhí)行測(cè)試早处,可以通過(guò)修改線程組的線程數(shù)來(lái)實(shí)現(xiàn)湾蔓。比如將線程數(shù)設(shè)置為10,表示模擬10個(gè)用戶(hù)執(zhí)行測(cè)試砌梆。
所有的取樣器與邏輯控制器都必須位于線程組下默责,從這個(gè)角度理解,JMeter測(cè)試計(jì)劃真正開(kāi)始于線程組咸包。其他元素桃序,例如監(jiān)聽(tīng)器,可以直接放在測(cè)試計(jì)劃下烂瘫,在這種情況下媒熊,它們將作用于所有的線程組。
一個(gè)測(cè)試計(jì)劃下可以有多個(gè)線程組忱反,在測(cè)試計(jì)劃中可以配置以并行或順序方式啟動(dòng)多個(gè)線程組泛释。
1.2.3 組件
JMeter中最基本的元素為元件,元件是JMeter測(cè)試中的最小功能單元温算,每個(gè)元件都具有某種特定的功能怜校。比如“HTTP Request”取樣器元件,可以實(shí)現(xiàn)HTTP請(qǐng)求發(fā)送的功能注竿。
JMeter提供了很多元件茄茁,為了方便用戶(hù)使用與管理眾多的元件魂贬,JMeter將多個(gè)功能類(lèi)似或邏輯上相關(guān)的元件歸為一類(lèi),稱(chēng)為組件裙顽。JMeter包含六大組件: 配置元件付燥、定時(shí)器、前置處理器愈犹、后置處理器键科、斷言、監(jiān)聽(tīng)器漩怎。
配置元件
配置元件與取樣器密切相關(guān)勋颖。類(lèi)似于配置文件之于軟件,軟件配置文件可以影響軟件的行為勋锤;同樣通過(guò)配置元件可以新增或修改請(qǐng)求內(nèi)容饭玲,實(shí)現(xiàn)對(duì)請(qǐng)求的自定義。
定時(shí)器
默認(rèn)情況下叁执,JMeter線程按順序執(zhí)行取樣器而不會(huì)出現(xiàn)暫停的情況茄厘。通過(guò)將定時(shí)器添加到線程組來(lái)指定延遲。如果不加延遲谈宛,JMeter可能會(huì)在很短的時(shí)間內(nèi)發(fā)送過(guò)多的請(qǐng)求到服務(wù)器次哈,導(dǎo)致服務(wù)器負(fù)載過(guò)重而崩潰。
定時(shí)器可以使在其作用范圍內(nèi)的每個(gè)取樣器執(zhí)行前延遲一段時(shí)間入挣。
前置處理器
前置處理器在進(jìn)行取樣器請(qǐng)求之前執(zhí)行一些操作亿乳。
如果前置處理器附加到取樣器元素,那么它將在該取樣器元素運(yùn)行之前執(zhí)行径筏。
前置處理器經(jīng)常用于在運(yùn)行之前修改取樣器請(qǐng)求的設(shè)置葛假,或更新未從響應(yīng)文本中提取的變量。
后置處理器
后置處理器在取樣器請(qǐng)求完成后執(zhí)行一些操作滋恬。
如果后置處理器附加到取樣器元素聊训,那么它將在該取樣器元素運(yùn)行之后執(zhí)行。
后處理器通常用于處理響應(yīng)數(shù)據(jù)恢氯,從中提取需要的值带斑。
斷言
斷言用于驗(yàn)證取樣器請(qǐng)求或?qū)?yīng)的響應(yīng)是否返回了期望的結(jié)果。
JMeter測(cè)試是否執(zhí)行成功勋拟,結(jié)果是否預(yù)期勋磕,都可以通過(guò)添加斷言來(lái)進(jìn)行驗(yàn)證。
監(jiān)聽(tīng)器
監(jiān)聽(tīng)器可以在JMeter執(zhí)行測(cè)試的過(guò)程中搜集相關(guān)的數(shù)據(jù)敢靡,并將這些數(shù)據(jù)不同的形式挂滓,比如樹(shù)、圖啸胧、報(bào)告等呈現(xiàn)出來(lái)赶站。
比如幔虏,“圖形結(jié)果”監(jiān)聽(tīng)器繪制響應(yīng)時(shí)間的曲線圖,“查看結(jié)果樹(shù)”監(jiān)聽(tīng)器顯示取樣器請(qǐng)求和響應(yīng)的詳細(xì)信息等贝椿。
此外想括,有些監(jiān)聽(tīng)器還可以將搜集到的測(cè)試數(shù)據(jù)保存到文件中以供以后使用。
1.2.4 控制器
取樣器
取樣器用于構(gòu)建發(fā)給服務(wù)器處理的請(qǐng)求烙博,即告訴JMeter怎樣將請(qǐng)求發(fā)送到服務(wù)器瑟蜈。例如,若要發(fā)送HTTP請(qǐng)求习勤,可以選擇“HTTP Request”取樣器踪栋,同時(shí)還可以通過(guò)添加配置元件來(lái)自定義請(qǐng)求焙格。
邏輯控制器
取樣器請(qǐng)求默認(rèn)是以先后順序依次執(zhí)行的图毕,某些情況下滿(mǎn)足了復(fù)雜的業(yè)務(wù)/場(chǎng)景需求。通過(guò)邏輯控制器可以控制JMeter發(fā)送請(qǐng)求的邏輯眷唉,來(lái)實(shí)現(xiàn)復(fù)雜的業(yè)務(wù)/場(chǎng)景予颤。比如有選擇性執(zhí)行某些請(qǐng)求,循環(huán)執(zhí)行請(qǐng)求冬阳,整體執(zhí)行邏輯上有依賴(lài)關(guān)系的請(qǐng)求蛤虐,交替執(zhí)行請(qǐng)求等。
1.3 JMeter執(zhí)行順序與作用域
1.3.1 執(zhí)行順序
類(lèi)似于運(yùn)算符或操作符的優(yōu)先級(jí)肝陪,當(dāng)JMeter測(cè)試中包含多個(gè)不同的元素時(shí)驳庭,哪些元素先執(zhí)行,哪些元素后執(zhí)行氯窍,并不是嚴(yán)格按照它們出現(xiàn)的先后順序依次有序執(zhí)行的饲常,而是會(huì)遵循一定的內(nèi)部規(guī)則,我們稱(chēng)之為JMeter元素的執(zhí)行順序狼讨,一般情況下JMeter元素按照如下順序依次執(zhí)行:
0. 配置元件
1. 定時(shí)器
2. 前置處理器
3. 取樣器
4. 后置處理器
5. 斷言
6. 監(jiān)聽(tīng)器
一個(gè)簡(jiǎn)單的例子:
其中①為取樣器贝淤、②為配置元件、③為定時(shí)器政供、④為監(jiān)聽(tīng)器播聪、⑤為前置處理器、⑥為后置處理器布隔、⑦為斷言离陶。
執(zhí)行順序?yàn)椋孩?->③-->⑤-->①-->⑥-->⑦-->④
1.3.2 作用域
JMeter測(cè)試樹(shù)中的元素可以分為兩類(lèi):層次結(jié)構(gòu)與順序結(jié)構(gòu)
層次結(jié)構(gòu)的元素包括:配置元件、定時(shí)器衅檀、前置處理器招刨、后置處理器、斷言與監(jiān)聽(tīng)器术吝;
順序結(jié)構(gòu)的元素包括:取樣器和邏輯控制器计济。
一般而言順序結(jié)構(gòu)的元素沒(méi)有作用域的概念茸苇,而作用域只針對(duì)具有層次結(jié)構(gòu)的組件。
JMeter作用域就是組件對(duì)取樣器有效的區(qū)域沦寂,在這個(gè)區(qū)域內(nèi)組件是起作用的学密。
層次結(jié)構(gòu)的元素作用域
具有層次結(jié)構(gòu)的元素的作用域規(guī)則如下:
(1)若其父節(jié)點(diǎn)為取樣器,則其只對(duì)該取樣器起作用传藏;
(2)若其父節(jié)點(diǎn)為邏輯控制器腻暮,則會(huì)影響邏輯控制器下的所有取樣器;
(3)若其父節(jié)點(diǎn)為線程組毯侦,則會(huì)影響線程組下的所有取樣器哭靖;
(4)若其父節(jié)點(diǎn)為測(cè)試計(jì)劃,則會(huì)影響測(cè)試計(jì)劃下的所有取樣器侈离。
一些例子:
1.父節(jié)點(diǎn)為取樣器
-Test Plan
-Thread Group
HTTP Request1
Response Assertion
View Results Treel
HTTP Request2
View Results Tree2
解析:
“Response Assertion”斷言的父節(jié)點(diǎn)為“HTTP Request1”取樣器试幽,則只會(huì)對(duì)“HTTP Request1”進(jìn)行斷言,不會(huì)斷言“HTTP Request2”取樣器卦碾。
2.父節(jié)點(diǎn)為邏輯控制器
-Test Plan
-Thread Group
-Loop Controller
Response Assertion
-HTTP Request1
View Results Treel
-HTTP Request2
View Results Tree2
解析:
“Response Assertion”斷言的父節(jié)點(diǎn)為“Loop Controller”邏輯控制器铺坞,“Response Assertion”會(huì)對(duì)邏輯控制下的“HTTP Request1”取樣器和“HTTP Request2”取樣器進(jìn)行斷言。
3.父節(jié)點(diǎn)為線程組
-Test Plan
-Thread Group
Response Assertion
-HTTP Request1
View Results Treel
-Loop Controller
-HTTP Request2
View Results Tree2
-HTTP Request3
View Results Tree3
解析:
“Response Assertion”斷言的父節(jié)點(diǎn)為“Thread Group”線程組洲胖,“Response Assertion”會(huì)對(duì)線程組下的“HTTP Request1”取樣器济榨、“HTTP Request2”取樣器與“HTTP Request3”取樣器進(jìn)行斷言。
4.父節(jié)點(diǎn)為測(cè)試計(jì)劃
-Test Plan
Response Assertion
-Thread Groupl
-HTTP Request1
View Results Treel
-Loop Controller
-HTTP Request2
View Results Tree2
-Thread Group2
-HTTP Request3
View Results Tree3
解析:
“Response Assertion”斷言的父節(jié)點(diǎn)為“Test Plan”測(cè)試計(jì)劃绿映,“Response Assertion”會(huì)對(duì)測(cè)試計(jì)劃下的“HTTP Request1”取樣器擒滑、“HTTP Request2”取樣器與“HTTP Request3”進(jìn)行斷言。
1.4 一個(gè)簡(jiǎn)單的JMeter測(cè)試計(jì)劃
以訪問(wèn)百度為例(https://www.baidu.com)叉弦。
按照如下步驟完成測(cè)試計(jì)劃:
1.在Test Plan節(jié)點(diǎn)上右鍵丐一,選擇Add->Treads(users)->Thread Group
? 在Tread Properties項(xiàng)下,設(shè)置“Number of Threads(users)”為1
2.在Thread Group節(jié)點(diǎn)上右鍵卸奉,選擇Add->Sampler->HTTP Request
? 在Web Server項(xiàng)下钝诚,設(shè)置“Server Name or IP”為www.baidu.com
? 在HTTP Request項(xiàng)下,設(shè)置“Path”為/
3.在HTTP Request節(jié)點(diǎn)上右鍵榄棵,選擇Add->Assertions->Response Assertion
? 在Field to Test項(xiàng)下凝颇,選擇“Response Code”
? 在“Patterns to Test”項(xiàng)下,點(diǎn)擊“Add”疹鳄,輸入200
4.繼續(xù)在HTTP Request節(jié)點(diǎn)上右鍵拧略,選擇Add->Listener->View Results Tree
5.點(diǎn)擊“Save”快捷按鈕,然后輸入測(cè)試計(jì)劃文件名瘪弓,保存
6.點(diǎn)擊“Start”快捷按鈕執(zhí)行測(cè)試垫蛆,可以在“View Results Tree”中查看測(cè)試結(jié)果。
JMeter測(cè)試查看結(jié)果樹(shù)顯示如下: