每天15分鐘JMeter入門篇(三):認(rèn)識(shí)JMeter的邏輯控制器

文章已遷移到CSDN:博客地址:https://blog.csdn.net/xiaomacaicai/category_11196823.html
文章歡迎轉(zhuǎn)載,還請(qǐng)注明出處http://www.itdecent.cn/nb/50563030,十分感謝
通過閱讀以下內(nèi)容,你可以:

  1. 了解JMeter中的邏輯控制器。
  2. 沒有了。

這次的文章就是講邏輯控制器的。
從這篇開始,我們才開始真正接觸到JMeter的核心功能。在上一篇文章中我們用JMeter實(shí)現(xiàn)了一個(gè)簡(jiǎn)單的并發(fā)場(chǎng)景,其中用到了一個(gè)事務(wù)控制器,它就是JMeterd的邏輯控制器之一。
JMeter的強(qiáng)大來源于BeanShell、邏輯控制器、公式,當(dāng)然它還有很多很炫的功能,但是我認(rèn)為這三個(gè)功能構(gòu)成了JMeter的核心。簡(jiǎn)單的說,學(xué)習(xí)邏輯控制器的意義在于我們可以設(shè)定JMeter性能測(cè)試的行為,復(fù)雜的性能測(cè)試場(chǎng)景都需要借助各種邏輯控制器的組合來實(shí)現(xiàn)。
看文章只能”知道“它是什么,還是要自己下去每個(gè)控制器實(shí)際用一遍,看到效果了,才能說自己會(huì)用了。

讓我們開始吧

在5.4.1.中,JMeter的邏輯控制器一共有17種,按照用途大體可以分為三類:事務(wù)控制器、循環(huán)控制器、行為控制器。所有的邏輯控制器如圖:


kongzhiqi.png

除了僅一次控制器,其他的控制器都可以互相嵌套,先死記住:只有僅一次控制器不能嵌套其他的控制器。
下面的內(nèi)容就是純文字介紹了。這里只能走馬觀花的介紹一遍,先有個(gè)概念吧。后續(xù)的文章里會(huì)用到這些邏輯控制器,到時(shí)再結(jié)合腳本做詳細(xì)介紹,不然寫的再多你也背不下來

如果(if)控制器

條件控制器,顧名思義是按照判斷條件是否成立,來決定其下面的元件是否執(zhí)行。跟編碼中的if判斷是一個(gè)概念。設(shè)置界面如下:


if.png

上圖中黃色高亮的部分是if判斷表達(dá)式的錄入框。如果你的JMeter沒有這種高亮效果,請(qǐng)升級(jí)到5.4.1

  • Use status of last sample 這應(yīng)該是5.4.1新增的,很贊的選項(xiàng),點(diǎn)一下它會(huì)替你生成${JMeterThread.last_sample_ok},它的作用是使用上一個(gè)取樣器的結(jié)果,非常的方便,不用自己寫一大堆的判斷了。
  • Interpret Condition as Variable Expression,勾選后控制器會(huì)使用變量表達(dá)式來判斷,例如${__javascript(.....)},如果勾選了則JMeter會(huì)計(jì)算javascript中表達(dá)式的值
  • Evaluate for all childrun 判斷條件是否針對(duì)所有子節(jié)點(diǎn)。如果啟用這個(gè)選項(xiàng),在有多個(gè)子節(jié)點(diǎn)嵌套的情況下容易導(dǎo)致邏輯混亂。默認(rèn)不勾選,就只會(huì)在if控制器入口的地方判斷一次,默認(rèn)狀態(tài)就已經(jīng)足夠滿足絕大部分的測(cè)試場(chǎng)景。

事務(wù)控制器

可以說是JMeter最核心的控制器了。事務(wù)控制器的最根本的作用是度量事務(wù)的性能,包括執(zhí)行次數(shù)、響應(yīng)時(shí)間、異常率、吞吐量(TPS),網(wǎng)絡(luò)流量。添加事務(wù)控制器后,我們就可以在聚合報(bào)告里看到這些指標(biāo)。
其中異常率,是事務(wù)控制器下所有的取樣器都執(zhí)行成功了,這個(gè)事務(wù)才算成功。
設(shè)置界面如下:

shiwu.png

之前我們的腳本中已經(jīng)添加過一個(gè)事務(wù)控制器和聚合報(bào)告了,具體的操作可以參考:每天15分鐘JMeter基礎(chǔ)篇(二):使用JMeter實(shí)現(xiàn)并發(fā)測(cè)試

循環(huán)控制器

循環(huán)控制器和while控制器一樣,都是用來循環(huán)執(zhí)行的。區(qū)別在于循環(huán)控制器是按照?qǐng)?zhí)行次數(shù)來控制的,也就是你可以設(shè)定元件執(zhí)行多少次;而while循環(huán)是按照條件表達(dá)式的結(jié)果來控制的,例如如果進(jìn)度為100%則退出while循環(huán)。
設(shè)置界面如下:


loop.png

特別注意那個(gè)循環(huán)次數(shù)中”永遠(yuǎn)“的復(fù)選框,如果勾選后,那么在腳本的持續(xù)運(yùn)行時(shí)間內(nèi),循環(huán)控制器下的元件會(huì)重復(fù)執(zhí)行;直到腳本停止。

while控制器

顧名思義,用來實(shí)現(xiàn)while循環(huán)功能,這是一個(gè)很有用的控制器,現(xiàn)在很多前后端分離架構(gòu)的系統(tǒng),都使用異步任務(wù)的方式來處理業(yè)務(wù)。例如導(dǎo)出100W條訂單的記錄需要10秒,程序并不會(huì)阻塞在那里,它會(huì)提交一個(gè)異步任務(wù)就直接返回,然后通過一個(gè)定時(shí)的進(jìn)程輪訓(xùn)任務(wù)進(jìn)度。那么在性能測(cè)試中如果沒有異步等待就會(huì)導(dǎo)致腳本提交頻率異常高。這里的異步任務(wù)等待就可以用while循環(huán)來實(shí)現(xiàn)。設(shè)置一個(gè)退出條件例如進(jìn)度100%或等待次數(shù)60次,不滿足時(shí)則一直循環(huán)。
界面如下:


image.png

注意那個(gè)Condition文本框,while循環(huán)的判斷條件就寫在那里。

臨界部分控制器

按照文檔,這個(gè)控制器的目的是為了控制并發(fā)場(chǎng)景下,各個(gè)元件執(zhí)行順序混亂的問題。但是實(shí)例看的不是很明白,JMeter在一個(gè)線程組下取樣器,本身就是按照順序執(zhí)行的呀。所以這里先Mark一下,等回頭學(xué)明白了我再修改補(bǔ)充。

Foreach控制器

作用是從【用戶自定義的變量】里讀取數(shù)據(jù),并執(zhí)行循環(huán)。界面如圖:


foreach.png

其中,輸入變量前綴是和另一個(gè)元件【用戶自定義的變量】配合使用的,這里你先可以簡(jiǎn)單的理解為:這里定義一個(gè)前綴例如TEST_,那么在腳本運(yùn)行的時(shí)候它會(huì)去【用戶自定義的變量】里循環(huán)讀取TEST_XX1,TEST_XX2的值,有多少個(gè)TEST_XX,就會(huì)循環(huán)多少次。
開始循環(huán)字段(不包含):循環(huán)變量的下標(biāo)的起點(diǎn);
結(jié)束循環(huán)字段(含):循環(huán)變量下標(biāo)的終點(diǎn)
輸出變量名稱:循環(huán)控制器生成的變量名稱,其他線程可以通過該名稱引用變量的值
數(shù)字之前加上下劃線,默認(rèn)勾選,使用起來會(huì)比較便利。

Include控制器

對(duì)于腳本設(shè)計(jì)來說一個(gè)非常重要的控制器,你可以將一個(gè)復(fù)雜的性能測(cè)試分為不同的測(cè)試場(chǎng)景,每個(gè)測(cè)試場(chǎng)景是一個(gè)TestPlan,每個(gè)TestPlan放到一個(gè)【測(cè)試片段】的元件中,有Include調(diào)用,它可以實(shí)現(xiàn)團(tuán)隊(duì)內(nèi)部的分工協(xié)作:你弄訂單的,我弄查詢的,設(shè)置好變量和參數(shù)化后各自提交,然后作為一個(gè)整體來執(zhí)行。在使用版本管理工具的團(tuán)隊(duì)中,這個(gè)控制器就顯得很重要了,它可以避免所有人的修改都提交到一個(gè)jmx文件中導(dǎo)致沖突。
Include控制器界面如圖:


include.png

配置界面沒什么需要特別解釋的,但是有兩點(diǎn)需要特別注意:

  1. Include只能包含測(cè)試片段,這是一個(gè)元件,后面會(huì)介紹,現(xiàn)在先知道他怎么用就行。測(cè)試片段里包含你的Jmx腳本;
  2. 如果測(cè)試片段的Jmx中包含有參數(shù)或者用戶定義的變量,那么這些變量需要定義在外部的測(cè)試計(jì)劃jmx中。不能只寫在測(cè)試片段的Jmx中。簡(jiǎn)單的說就是公共的變量和參數(shù)放在外部。

交替控制器

交替控制器的作用是,它下面節(jié)點(diǎn)的取樣器會(huì)以交替的方式執(zhí)行。這個(gè)控制器我用的很少,因?yàn)槲业男阅軠y(cè)試場(chǎng)景中暫時(shí)沒有碰到需要交替執(zhí)行的情況,只在排查問題時(shí)用到,也就是兩個(gè)請(qǐng)求反復(fù)交替執(zhí)行,先保存、再刪除,再保存,再刪除。
界面如圖:


jiaoti.png

僅一次控制器

不要看它的名字叫僅一次,就以為它沒什么用,實(shí)際上這個(gè)控制器用的很頻繁??紤]一下這個(gè)性能測(cè)試需求:要求測(cè)試以下性能測(cè)試場(chǎng)景,用戶A登錄系統(tǒng);提交訂單、查詢訂單、刪除訂單,100用戶在線(有稱之為100并發(fā)的)執(zhí)行20分鐘。你可能覺得把這五個(gè)請(qǐng)求搞出來放到腳本里,設(shè)置上100并發(fā)執(zhí)行時(shí)間20分鐘,然后直接run不就行了嗎?其實(shí)是不可以的。因?yàn)槟愕哪_本是循環(huán)執(zhí)行,每一次循環(huán)都是執(zhí)行一次用戶登錄,所以20分鐘執(zhí)行下來你的在線用戶肯定是高于100的,對(duì)吧。這個(gè)時(shí)候僅一次控制器就派上用場(chǎng)了,你可以把登錄的請(qǐng)求放在僅一次控制器中,這樣即使你執(zhí)行20分鐘,或者你循環(huán)執(zhí)行N次,你的登錄請(qǐng)求也只會(huì)執(zhí)行一次,這樣就能實(shí)現(xiàn)你有100個(gè)用戶登錄一次、循環(huán)執(zhí)行20分鐘業(yè)務(wù)的測(cè)試需求了。
要特別特別注意,在一個(gè)線程組中如果存在多個(gè)【僅一次控制器】,那么只有第一個(gè)【僅一次控制器】生效 ,其他的僅一次控制器仍然會(huì)每次循環(huán)時(shí)執(zhí)行節(jié)點(diǎn)下的取樣器。
設(shè)置界面如下,沒什么特別的配置,用法也很簡(jiǎn)單,把你的取樣器拖到這個(gè)節(jié)點(diǎn)下面就可以。

only.png

隨機(jī)控制器

我個(gè)人覺得一個(gè)很雞肋的控制器,它的作用是讓節(jié)點(diǎn)下的元件隨機(jī)執(zhí)行,每個(gè)元件只執(zhí)行一次。目前沒有碰到過需要使用它的場(chǎng)景

隨機(jī)順序控制器

我個(gè)人覺得它和隨機(jī)控制器一樣,也是一個(gè)有點(diǎn)很雞肋的控制器,它的作用是讓節(jié)點(diǎn)下的所有元件隨機(jī)執(zhí)行。目前沒有碰到過需要使用它的場(chǎng)景,注意它和隨機(jī)控制器的區(qū)別:例如有10個(gè)子元件,隨機(jī)控制器只會(huì)隨機(jī)執(zhí)行其中的1個(gè),其他9個(gè)不執(zhí)行;而隨機(jī)順序控制器會(huì)執(zhí)行全部的10個(gè),只是執(zhí)行順序隨機(jī)。

錄制控制器

錄制控制器其實(shí)跟腳本的執(zhí)行沒關(guān)系,它是用來錄制http請(qǐng)求的以生成測(cè)試腳本的,類似于Loadrunner里的record錄制功能。

Runtime控制器

它的作用就是控制它下面子元件的執(zhí)行時(shí)長(zhǎng)。你添加一個(gè)Runtime控制器,然后在它的下面添加一個(gè)查詢的Http取樣器,設(shè)置10秒。此時(shí)運(yùn)行的話,你會(huì)發(fā)現(xiàn)查詢的http取樣器運(yùn)行10秒后就結(jié)束了。


runtime.png

在復(fù)雜的性能測(cè)試場(chǎng)景中,我們總會(huì)有這樣的需求:整體場(chǎng)景執(zhí)行20分鐘,但是其中某些http請(qǐng)求只執(zhí)行一定時(shí)間就結(jié)束。有時(shí)在組合場(chǎng)景負(fù)載時(shí),為了排查特定并發(fā)場(chǎng)景我會(huì)使用該控制器。
如果Runtime(seconds)為0或者不填,則該控制器下的子元件不會(huì)執(zhí)行。

簡(jiǎn)單控制器

我個(gè)人認(rèn)為最廢柴的一個(gè)控制器,但是存在即合理,我覺得他的最大的作用可能就是嵌套其他控
制器了,我們可以用它來定義一個(gè)”執(zhí)行塊“,按照?qǐng)?zhí)行塊來對(duì)腳本進(jìn)行控制。我這邊很少用到它,界面如圖:


jiandan.png

設(shè)置界面都如此簡(jiǎn)單,果然是一個(gè)”簡(jiǎn)單控制器“

吞吐量控制器

不管你對(duì)吞吐量是怎么定義或者怎么理解的,這個(gè)吞吐量控制器都不是控制吞吐量的,按照官方文檔定義,他是用來控制它下面元件的執(zhí)行次數(shù)的。是執(zhí)行次數(shù),不是tps,也不是qts,也不是網(wǎng)絡(luò)吞吐量。是不是很蒙圈?


tuntuliang.png

Based on是控制器的控制模式,

  • Percent Executions是按照百分比控制;
  • Total Excetions 是按照吞吐量設(shè)置的值來控制
  • Per User 按照官方文檔,是指是否按照虛擬用戶數(shù)來計(jì)算執(zhí)行次數(shù)。PerUser對(duì)Percent Executions沒有任何影響。
    Percent Executions是最常用的選項(xiàng)

模塊控制器

模塊控制器可以在調(diào)用其他的測(cè)試片段。跟Include很像,但是它跟Include控制器不一樣的地方在于,它提供了在運(yùn)行時(shí)改變測(cè)試片段的能力,Include不行。當(dāng)測(cè)試開始執(zhí)行后,Include里所指向的測(cè)試元件就不可改變,模塊控制器則可以。簡(jiǎn)單的說,模塊控制器適用于手動(dòng)控制測(cè)試執(zhí)行過程,而Include則適合無人值守執(zhí)行或者執(zhí)行后不管
設(shè)置界面如下:


mokuai.png

Switch控制器

Switch控制器的作用類似于編程中的Switch,根據(jù)輸入值匹配不同的分支。界面如圖:


switch.png

其中Switch Value經(jīng)常和公式、變量一起配合使用。可以為數(shù)字,也可以為字符,

目前知識(shí)點(diǎn)就先整理到這里,后續(xù)的文章會(huì)穿插著詳細(xì)講解這些控制器的用法,這里就是先從概念上梳理一遍,目前只要知道JMeter有哪些控制器,都是干什么用的就行,至于具體怎么用,我覺得到時(shí)結(jié)合腳本實(shí)例來分析效果會(huì)更好

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容