1. 程式人生 > >Jmeter——ForEach Controller&Loop Controller

Jmeter——ForEach Controller&Loop Controller

今天來分享下Jmeter中的2款迴圈控制器,ForEach Controller和Loop Controller,在使用上還是有所區別。 # ForEach Controller ## ForEach Controller簡介 ForEach Controller可以理解為迭代器(iterator),就是遍歷當前符合條件的所有資料,可用於Jmeter指令碼中的引數化。 我們直接看圖來說,如下所示: ![](https://img2020.cnblogs.com/blog/1242227/202011/1242227-20201105155135057-670411253.png) 如上所示,就是ForEach Controller的配置介面,介面有如下引數,一一講解: - Name:控制器名稱,可根據使用者需要任意填寫,也可不填 - Comments:使用者可根據需要任意填寫,也可不填 - Input variable prefix:輸入變數字首,資料來源:①使用者可以在“使用者自定義變數”中定義一組變數,迴圈控制器可以從中獲取到變數對應值,然後作為迴圈條件;②使用者可將提取的引數作為迴圈條件 - Start index for loop(exclusive): 開始迴圈欄位,迴圈變數下標起點(不包含) - End index for loop(inclusive):迴圈變數下標終點(包含) - Output variable name:輸出變數名稱,迴圈控制器生成的變數名稱,引用時填寫的引數名稱與輸出變數名稱一致 - Add "\_"before number?:數字之前加上下劃線“\_”,變數字首是否加“_”作為分隔符 ## ForEach Controller使用 我們直接通過案例來看,ForEach Controller如何使用。如上所述,變數的來源,取自於2種情況,那我們就一一瞭解下。不過在操作之前,各自要有Jmeter環境哦,環境配置可以參考以前博文。 ### 使用者定義變數 使用者定義變數是配置元件中的一個元件,可定義引數,便於後續介面直接使用,也是引數化的一種方式。元件新增入口如下所示: ![](https://img2020.cnblogs.com/blog/1242227/202011/1242227-20201105160524493-290418344.png) 我們來定義一組資料,我就以自己的部落格為例了,配置引數後,如下所示: ![](https://img2020.cnblogs.com/blog/1242227/202011/1242227-20201105160628937-216297142.png) 我們可以看出,變數名稱是有規律可循的,都是以wd_number開頭。或許有疑問,為什麼要這樣來設定,繼續往下看,馬上就能知道其作用了。 引數來源我們配置好後,這就需要在ForEach Controller配置對應資料了,跟上節奏一起來。 我們在之前ForEach Controller簡介中瞭解到,有個引數是`Input variable prefix 輸入變數字首`,在這裡輸入的內容就是`wd_number`。因為我們在使用者定義變數的元件中,配置的一組資料都是以此開頭的。 `Start index for loop(exclusive)`和`End index for loop(inclusive)`可以不配置,非必填資料。如果配置的話,需要注意的是,起始位是不包含的,這個到時候具體看案例截圖就清楚。 `Output variable name`輸出變數,這個引數是用於後續引數的引用名稱,比如我們平時用到的正則提取器,也是需要定義一個變數的,同一個意思。 `Add "\_"before number` 這個是看各自定義的變數名稱是怎樣的,變數間有`_`,則需要勾選,沒有的話,不勾選即可。 配置結果如下所示: ![](https://img2020.cnblogs.com/blog/1242227/202011/1242227-20201105162645012-163140127.png) 我們再用`outwd`變數引用到對應介面引數中即可,如下所示: ![](https://img2020.cnblogs.com/blog/1242227/202011/1242227-20201105162430710-898320282.png) 到現在為止,已經完成了配置步驟,我們直接來執行指令碼,看下執行結果,如下所示: ![](https://img2020.cnblogs.com/blog/1242227/202011/1242227-20201105162719496-735765156.png) 從執行的結果可以看出,我們並沒有設定迴圈次數,可為什麼是5次了,是因為我們設定的變數只有5個,並且是依次替換變數請求介面,這不就是普通的引數化嘛,是不是很簡單。 剛才的結果,我們沒有配置迴圈的起止位,現在我們配置上起止位,配置如下: ![](https://img2020.cnblogs.com/blog/1242227/202011/1242227-20201105163013939-336350520.png) 再次執行指令碼,看下是什麼個結果,如下所示: ![](https://img2020.cnblogs.com/blog/1242227/202011/1242227-20201105163119921-1161074285.png) 從上圖執行的結果可以很清楚明瞭的看出其作用,起始位是`不包含`的,結束位是`包含`,配置為1和3,所以執行結果是取2和3的引數來請求介面。 ### 提取引數 提取引數同樣以部落格為例,每個人的部落格都有三個列表,閱讀排行榜、最新評論、推薦排行榜,剛好可以用於此demo。 可以看下資料,都是一個a標籤,如下所示: ![](https://img2020.cnblogs.com/blog/1242227/202011/1242227-20201105164626453-721644042.png) 通過使用者定義變數的方式,大家肯定有思路,提取引數如何實現了。 我們通過正則,將15條資料提取,並把對應引數配置到ForEach Controller即可。 那我們就先實現正則匹配這一步,正則相關知識自己另外補充,也可以參考我以前的博文,今天就不贅述了。我們觀察要提取的資料,都是有規律可循的,新增正則提取器,並配置如下所示: ![](https://img2020.cnblogs.com/blog/1242227/202011/1242227-20201105165156302-387176606.png) 這裡需要注意的是,`Match No.`,我們在這裡配置為`-1`,因為需要符合條件的所有值: - 配置為0,表示隨機值; - 配置為正整數,表示取匹配到的第幾個資料; - 配置為-1,表示取匹配到的所有資料。 正則配置好後,可以執行指令碼,看下是否正常提取到了資料,除錯也是寫指令碼的一部分工作。 我們再來配置ForEach Controller,如下所示: ![](https://img2020.cnblogs.com/blog/1242227/202011/1242227-20201105165903529-494697128.png) 再將輸出變數引用到對應介面引數中,如下所示: ![](https://img2020.cnblogs.com/blog/1242227/202011/1242227-20201105170005225-1934631544.png) 我們來執行指令碼,看下整體效果,如下所示: ![](https://img2020.cnblogs.com/blog/1242227/202011/1242227-20201105170146815-1277517650.png) 如上所示,分別請求了15次介面,使用起來是不是很方便,到此,是不是已經可以上手使用起來了,引數化就是這麼簡單。 # Loop Controller ## Loop Controller簡介 Loop Controller,功能擴充套件性不強,只能配置為無限迴圈和具體迴圈次數,主要用於測試介面重複呼叫的情況。 我們通過配置介面來了解下,如下所示: ![](https://img2020.cnblogs.com/blog/1242227/202011/1242227-20201105171121728-8048202.png) 根據上圖,來了解下引數配置: - Loop Controller:元件名稱 - Name:控制器名稱 - Comments:註釋 - Loop Count:設定執行次數,Infinite 勾選表示為永久執行 ## Loop Controller使用 Loop Controller使用很簡單,我們看了配置介面就很清楚,無非就是配置迴圈次數,或者一直無限迴圈。 ### 指定迴圈次數 我們通過案例來直觀的看下效果,我們配置迴圈次數為2,並執行指令碼,執行結果如下所示: ![](https://img2020.cnblogs.com/blog/1242227/202011/1242227-20201105172144047-1945240357.png) 我們從上圖可知,迴圈次數為2,每個介面呼叫了2次。比如有些業務,後端介面有做重複呼叫校驗的,就可以通過這種方式來驗證了。 ### 無限迴圈 配置為無限迴圈的話,顧名思義,那肯定是一直會執行指令碼,除非手動停止,指令碼才會停止執行。 好了,今天的2種迴圈控制器就介紹到這裡,綜上所述,如果用於引數化的話,大家肯定會使用ForEach Controller。2種控制器,各有功能,各取所需,希望對有需要的博友有所