Jmeter 主要概念
JMeter 工具與其他性能測試工具在原理上完全一致魏宽,工具本身包含4個(gè)部分院仿。
1. 負(fù)載發(fā)生器
用于產(chǎn)生負(fù)載,通常以多線程或多進(jìn)程的方式模擬用戶行為凄诞。
2. 用戶運(yùn)行器
通常是一個(gè)腳本運(yùn)行引擎强饮,用戶運(yùn)行器附加在線程或者進(jìn)程上由桌,根據(jù)腳本要求模擬指定的用戶行為。
3. 資源監(jiān)視器
用于獲取測試過程中服務(wù)器邮丰、負(fù)載機(jī)的資源數(shù)據(jù)
4. 報(bào)表生成器
根據(jù)測試中獲得的數(shù)據(jù)生成報(bào)表行您,提供可視化的數(shù)據(jù)顯示方式
Jmeter 的主要元件
1. Test plan(測試計(jì)劃)
Test Plan 元素:控制型元素。只能存在于樹形結(jié)構(gòu)的根節(jié)點(diǎn)剪廉。它代表了整個(gè)測試方案娃循,測試人員可以在這里設(shè)置一些全局性的內(nèi)容,例如全局變量(注意全局變量是 Thread Local)斗蒋、ClassPath 配置(如果希望在 Jmeter 中調(diào)用自己的 Java 類就需要在這里設(shè)置了)淮野。
啟動(dòng) Jmeter 后捧书,Jmeter 會(huì)自動(dòng)生成一個(gè)空的測試計(jì)劃,用于可以基于該測試計(jì)劃建立自己的測試計(jì)劃骤星。
注意:里面名稱和注釋沒有什么好說的,重點(diǎn)注意的是 獨(dú)立運(yùn)行每個(gè)線程組(例如在一個(gè)組運(yùn)行結(jié)束后啟動(dòng)下一個(gè))
例子:創(chuàng)建 A爆哑、B 兩個(gè)線程組洞难。
如果不勾選獨(dú)立運(yùn)行每個(gè)線程組,這兩個(gè)線程組就一起跑揭朝。我們添加兩個(gè) HTTP 請(qǐng)求队贱,小a和小b
我們添加個(gè)監(jiān)聽器(添加方式這里先不說,看后面文章)跑一次看一下潭袱。
如果勾選獨(dú)立運(yùn)行每個(gè)線程組柱嫌,會(huì)嚴(yán)格遵守順序 AB 從上往下依次運(yùn)行。
2. Thread Group(線程組)
Thread Group 元素:控制型元素屯换。只能存在于 Test Plan 元素之下编丘。它代表了一組行為相似的用戶,通常我們把一類用戶的動(dòng)作放在同一個(gè) Thread Group 下彤悔,這樣就可以模擬多個(gè)這樣的用戶了嘉抓。在這里可以配置模擬用戶的個(gè)數(shù)(線程的個(gè)數(shù))、循環(huán)次數(shù)晕窑、執(zhí)行時(shí)間等抑片。
一個(gè)線程組可以看做是一個(gè)虛擬用戶組,Thread Group 中的每個(gè)線程都可以理解為一個(gè)虛擬用戶杨赤。Thread Group 中包含的線程數(shù)量在測試執(zhí)行過程中是不會(huì)發(fā)生改變的敞斋。
Jmeter 中每個(gè)測試計(jì)劃至少需要包含一個(gè)線程組,當(dāng)然也可以在一個(gè)線程中創(chuàng)建多個(gè)線程組疾牲,那么多個(gè)線程組之間又會(huì)怎樣的順序執(zhí)行(串行還是并行)植捎?在測試計(jì)劃下面多個(gè)線程是并行執(zhí)行的,也就是說這些線程組是同時(shí)被初始化并同時(shí)執(zhí)行線程組下的 Sampler(采樣器) 的说敏。
線程組有三個(gè)鸥跟,用法如下。
Thread Group:線程組(操作)---2
setUp Thread Group:初始化(登錄)---1
TearDown Thread Group:結(jié)束-恢復(fù)(登出)---3
線程組參數(shù)詳解
線程組主要包括三個(gè)參數(shù):線程數(shù)盔沫、準(zhǔn)備時(shí)長(Ramp-Up Period(in seconds))医咨、循環(huán)次數(shù)。
線程數(shù):虛擬用戶數(shù)架诞。一個(gè)虛擬用戶占用一個(gè)進(jìn)程或線程拟淮。設(shè)置多少虛擬用戶數(shù)在這里也就設(shè)置多少個(gè)線程數(shù)。
準(zhǔn)備時(shí)長:設(shè)置的虛擬用戶數(shù)需要多長時(shí)間全部啟動(dòng)谴忧。如果線程數(shù)為20很泊,準(zhǔn)備時(shí)長為10角虫,那么需要10秒鐘啟動(dòng)20個(gè)線程。也就是每秒鐘啟動(dòng)2個(gè)線程委造。
循環(huán)次數(shù):每個(gè)線程發(fā)送請(qǐng)求的次數(shù)戳鹅。如果線程數(shù)為20,循環(huán)次數(shù)為100昏兆,那么每個(gè)線程發(fā)送100次請(qǐng)求枫虏。總請(qǐng)求數(shù)為 20*100=2000爬虱。如果勾選了 “永遠(yuǎn)”隶债,那么所有線程會(huì)一直發(fā)送請(qǐng)求,一直到選擇停止運(yùn)行腳本跑筝。
設(shè)置合理的線程數(shù)對(duì)于能否達(dá)到測試目標(biāo)有 決定性的影響死讹。另外設(shè)置合理的循環(huán)次數(shù)也很重要,除了上面介紹的固定循環(huán)次數(shù)與永遠(yuǎn)外曲梗;也可以靈活的選擇設(shè)定測試運(yùn)行時(shí)間赞警。勾選 “調(diào)度器”,進(jìn)行調(diào)度器配置稀并。
有個(gè)誤區(qū)這里要注意一下仅颇,看一下下面兩張圖的配置。
雖然結(jié)果不一樣碘举,但是它們最終產(chǎn)生的都是10個(gè)請(qǐng)求忘瓦。
第一張圖:5秒鐘啟動(dòng)5個(gè)用戶,一秒鐘啟動(dòng)一個(gè)用戶引颈,用表格查看結(jié)果會(huì)發(fā)現(xiàn)一個(gè)特點(diǎn)耕皮,感覺是5秒鐘啟動(dòng)10個(gè),這只是表面現(xiàn)象蝙场,它是這么做的我在第1秒第一個(gè)用戶被啟之后隔了1秒啟動(dòng)第2個(gè)凌停,在啟第2個(gè)的同時(shí)第1個(gè)要執(zhí)行第二次的循環(huán),所以感覺是5秒啟動(dòng)10個(gè)請(qǐng)求售滤。記住一個(gè)原理罚拟,它啟動(dòng)之后不等你響應(yīng),但是它在表格查看結(jié)果里面感覺它是等響應(yīng)的完箩。因?yàn)樵诒砀癫榭唇Y(jié)果里面它是等響應(yīng)的赐俗,等你得了響應(yīng)它才顯示出來,所以表格查看結(jié)果顯示里面顯示和發(fā)的不一定同步的弊知,顯示一般會(huì)滯后阻逮,你1秒發(fā)一個(gè),可能我等的時(shí)間很長秩彤。
第二張圖:5秒啟10個(gè)叔扼,只管發(fā)出去事哭。
3. 斷言元件
- 3.1.1 響應(yīng)斷言
響應(yīng)斷言:通過檢查服務(wù)器的響應(yīng)數(shù)據(jù):是否符合預(yù)期想要的數(shù)據(jù),判斷任務(wù)是否成功
注意:增加響應(yīng)斷言要注意一個(gè)細(xì)節(jié)問題瓜富,在Jmeter中作用域非常關(guān)鍵鳍咱,元件一旦放錯(cuò)了,很有可能你得到的結(jié)果跟你的場景效果完全不一樣食呻。
你想去判別哪個(gè)請(qǐng)求流炕,就放在哪個(gè)請(qǐng)求里面去不能放外面,因?yàn)閷?duì)于我們來說有三種作用域仅胞,第一種測試計(jì)劃的(全局的)、第二種線程組的(第二級(jí)別的全局)剑辫、第三個(gè)是請(qǐng)求的干旧,不同的作用域代表的效果不一樣。
-3.2.2 斷言持續(xù)時(shí)間
斷言持續(xù)時(shí)間:判斷是否在給定的時(shí)間內(nèi)給出響應(yīng)結(jié)果
例子:
協(xié)議:http
ip地址:xxxx(如果是域名就寫域名)
端口:xxxx
路徑:我們這里不需要進(jìn)行操作直接寫 / 就好妹蔽。
斷言里面寫上匹配的內(nèi)容椎眯。
4. 監(jiān)聽元件——查看結(jié)果樹
請(qǐng)求寫好之后,添加監(jiān)聽元件胳岂,監(jiān)聽元件主要常用的有查看結(jié)果樹编整、聚合報(bào)告、表格查看結(jié)果乳丰、圖形結(jié)果掌测,我們這里使用第一個(gè)查看結(jié)果樹。
注意:查看結(jié)果樹如果斷言成功它沒有顯示产园,如果斷言失敗它是有顯示的(顯示紅色)汞斧。看具體某個(gè)請(qǐng)求的請(qǐng)求響應(yīng)結(jié)果明細(xì),可以使用查看結(jié)果樹
下面截圖一個(gè)斷言成功什燕,一個(gè)斷言失敗的粘勒。
查看結(jié)果樹里面是有非常多內(nèi)容的,請(qǐng)求下面有2個(gè)一個(gè)是 Request Body(請(qǐng)求體) 另一個(gè)是 Request Headers(請(qǐng)求頭) 屎即,有響應(yīng)數(shù)據(jù)和取樣器庙睡,里面請(qǐng)求方式響應(yīng)體的內(nèi)容都有,可以多研究一下技俐。
4.1 監(jiān)聽元件-聚合報(bào)告
所謂聚合報(bào)告相當(dāng)于一個(gè)匯總的報(bào)告乘陪,它會(huì)把所有請(qǐng)求放在一塊。 聚合報(bào)告一般是一個(gè)綜合報(bào)告虽另,里面會(huì)顯示整個(gè)跑的一個(gè)場景暂刘。匯總報(bào)告--匯總結(jié)果,可以使用聚合報(bào)告
里面的中位數(shù)和百分位單位是 毫秒 叫響應(yīng)時(shí)間捂刺,平均數(shù)只能參考不能看谣拣,因?yàn)檫@個(gè)東西太坑了募寨,比如考試全班平均分70分,兩級(jí)分化特別嚴(yán)重森缠。還有工資被平均了拔鹰,這里大家都懂的哈。
這里一般看90%的比較多贵涵。
這里有個(gè)要注意的地方列肢,如果我只想清除聚合報(bào)告的數(shù)據(jù)該怎么清?上面有兩個(gè)掃把宾茂,這里點(diǎn)擊左邊這把瓷马,刪除當(dāng)前的。如果點(diǎn)擊右邊的就會(huì)把監(jiān)聽器所有的數(shù)據(jù)都清空了跨晴。
4.2 監(jiān)聽元件-表格查看結(jié)果
如果想看每個(gè)請(qǐng)求的詳情欧聘,可以用表格查看結(jié)果,這是一個(gè)顆粒度問題端盆。里面的1-1怀骤,第一個(gè)1是第1個(gè)線程組的編號(hào),第二個(gè)1是用戶焕妙。
4.3 監(jiān)聽元件-圖形結(jié)果
這個(gè)組件是在聚合報(bào)告(Aggregate report)的基礎(chǔ)之上增加了圖形化展示蒋伦,把數(shù)據(jù)轉(zhuǎn)化成柱狀圖的形式展示,并且可以編輯圖形展示的樣式焚鹊,以圖形化展示結(jié)果痕届。
5. 定時(shí)器元件
5.1 固定定時(shí)器 Constant Timer
固定定時(shí)器一般叫思考時(shí)間,所謂思考時(shí)間就是盡可能模擬用戶使用情況寺旺。比如下面有個(gè)線程組爷抓,我希望首頁登錄完之后,b請(qǐng)求等2秒鐘時(shí)間阻塑。
這里就需要增加固定定時(shí)器蓝撇,這里要注意作用域,固定定時(shí)器是一個(gè)前置的處理程序陈莽,是先運(yùn)行固定定時(shí)器渤昌,再運(yùn)行請(qǐng)求的。這里我們要放置在b里面走搁,運(yùn)行b之前先等待2秒鐘独柑。
**5.2 同步定時(shí)器 **
作用:
模擬并發(fā)。設(shè)置一個(gè)閥值(請(qǐng)求數(shù)量)私植,當(dāng)請(qǐng)求數(shù)達(dá)到這個(gè)閥值時(shí)忌栅,允許請(qǐng)求同時(shí)發(fā)出。例如:想測試一座橋的并發(fā)(忽略載重等其他因素曲稼,只考慮通過)索绪,那么并發(fā)的請(qǐng)求就是類似于多少輛車可同時(shí)通過橋湖员,而車輛一般情況下是不可能同時(shí)通過橋的,因而我們可以在橋頭A瑞驱,設(shè)置一個(gè)集合點(diǎn)娘摔,等車輛數(shù)滿足一定的數(shù)量,同時(shí)讓車輛通過此橋唤反。
同步定時(shí)器有兩個(gè)參數(shù)需要填寫凳寺,第一個(gè)模擬用戶的數(shù)量,第二個(gè)超時(shí)時(shí)間以毫秒為單位彤侍。這里面的兩個(gè)0標(biāo)識(shí)不限制不設(shè)置肠缨,第一個(gè)0標(biāo)識(shí)全部,第二個(gè)0表示超時(shí)盏阶,不等到那個(gè)人我一直等下去怜瞒。
6.邏輯控制器
僅一次控制器:只運(yùn)行一次,這個(gè)請(qǐng)求只運(yùn)行一遍般哼,如果2個(gè)用戶運(yùn)行2遍,以用戶為單元惠窄。
轉(zhuǎn)換控制器(switch Controller) 選擇控制器蒸眠,比如我有a用戶,它里面有兩種場景1業(yè)務(wù)和2業(yè)務(wù)杆融。不是讓他一直運(yùn)行1或者一直運(yùn)行2楞卡,我現(xiàn)在想讓他交替運(yùn)行。就可以用轉(zhuǎn)換控制器脾歇,什么時(shí)候條件滿足選擇1蒋腮,什么時(shí)候條件滿足選擇2。
添加轉(zhuǎn)換控制器要把請(qǐng)求放進(jìn)去藕各,Switch Value 的值是從下標(biāo)0開始的池摧。0代表的首頁訪問,這里填寫0就只運(yùn)行首頁訪問激况。Switch Value 這里的值可以通過參數(shù)化隨機(jī)數(shù)來做作彤。
循環(huán)控制器 就是控制循環(huán)的次數(shù),跟代碼中的while一樣乌逐,不過多解釋
事務(wù)控制器 訂單提交竭讳,其會(huì)調(diào)用多個(gè)接口。首先我們要區(qū)分一個(gè)問題浙踢,打個(gè)比方我們點(diǎn)擊一個(gè)登陸按鈕或者查詢訂單的绢慢,我們按鈕按下去會(huì)發(fā)送多個(gè)請(qǐng)求到服務(wù)器,這個(gè)要理解叫事務(wù)數(shù)洛波,Jmeter最小單元是請(qǐng)求胰舆,如果說一個(gè)動(dòng)作或業(yè)務(wù)他的一步操作有很多請(qǐng)求的話我不可能去把它自己加起來骚露。
例子:比如下面線程組-2有兩個(gè)請(qǐng)求。這個(gè)查詢操作有兩個(gè)操作a和b請(qǐng)求思瘟,如果我們直接運(yùn)行的話荸百,在聚合報(bào)告中我們可以看到有2個(gè)(圖2)。如果我想看這個(gè)查詢的功能具體響應(yīng)時(shí)間到底是多少呢滨攻,我得自己加够话。會(huì)很麻煩。
為了解決上面的問題光绕,我們可以增加 事務(wù)控制器 女嘲,然后把請(qǐng)求都放到事務(wù)控制器里面,可以看到數(shù)據(jù)都幫我們統(tǒng)計(jì)出來了(圖2)诞帐,用表格查看結(jié)果里面顯示了有3個(gè)請(qǐng)求欣尼,是因?yàn)槭聞?wù)控制里面有兩個(gè)選項(xiàng),如果不勾的話
查詢-事務(wù)
就會(huì)單獨(dú)顯示停蕉,它是一個(gè)總和在查看結(jié)果樹里面是3個(gè)(但是事務(wù)請(qǐng)求里面沒有東西愕鼓,因?yàn)樗且粋€(gè)虛擬的就為了統(tǒng)計(jì)一個(gè)東西剥险。)望门,
事務(wù)控制器里面有兩個(gè)選項(xiàng)。Generate parent sample 如果選中呆万,則生成樣本為其他樣本的父項(xiàng)(圖2)蚓挤,這里注意勾選之后如果一個(gè)請(qǐng)求失敗這個(gè)事務(wù)就失敗了磺送。勾選之后意味著他們就是一個(gè)整體。如果不勾選樣本將作為獨(dú)立樣本生成(圖3)灿意,那個(gè)失敗就會(huì)顯示出來估灿。
Include duration of timer and pre-post processors in generated sample:是否在生成樣本中包括計(jì)時(shí)器,預(yù)處理和后處理延遲缤剧。默認(rèn)值為false馅袁。一般不建議選擇。因?yàn)檫x擇會(huì)把一些額外時(shí)間算入總時(shí)間鞭执,勾選則會(huì)把其他時(shí)間算入事務(wù)總數(shù)司顿。勾完之后如果整個(gè)事務(wù)里面添加固定定時(shí)器,他會(huì)算2次的兄纺。