『動善時』JMeter基礎 — 40、JMeter中ForEach控制器詳解

繁華似錦Fighting 發表於 2021-06-10

1、什麼是邏輯控制器

JMeter官網對邏輯控制器的解釋是:“Logic Controllers determine the order in which Samplers are processed.”

意思是說,邏輯控制器可以控制取樣器(Samplers)的執行順序。

由此可知,控制器需要和取樣器一起使用,否則控制器就沒有什麼意義了。放在控制器下面的所有采樣器,都會當做一個整體,執行時也會一起被執行。

JMeter提供了多種邏輯控制器,它們各個功能都不相同,大概可以分為兩種使用型別:

  • 控制測試計劃執行過程中,節點的邏輯執行順序,如:ForEach Controller(ForEach控制器),Loop Controller(迴圈控制器)、If Controller(如果if控制器)等;
  • 對測試計劃中的指令碼進行分組,方便JMeter統計執行結果,以及進行指令碼的執行時控制等,如:Throughput Controller(吞吐量控制器)、Transaction Controller(事務控制器)等。

2、ForEach控制器介紹

ForEach控制器一般和使用者自定義變數一起使用,從使用者自定義變數中讀取一系列相關的變數。

ForEach控制器遍歷讀取不同的變數值,來控制其下的取樣器或控制器執行一次或多次。

說明:

  1. 從上文中看到了一組資料,就說明這樣的資料,通常為一個陣列。
  2. 可以使用ForEach控制器遍歷迴圈,說明這組資料有一定的規範和順序標識。
  3. 看到使用者自定義變數,就說明也可以用到引數化,從資料檔案中讀取資料。同理也可以從之前的請求介面中提取到需要的資料,進行遍歷迴圈。

新增ForEach控制器元件操作:選中“執行緒組”右鍵 —> 新增 —> 邏輯控制器 —> ForEach控制器

介面如下圖所示:

image

ForEach控制器元件介面說明:

  • 名稱ForEach控制器元件的自定義名稱,見名知意最好。
  • 註釋:即新增一些備註資訊,對該ForEach控制器元件的簡短說明,以便後期回顧時檢視。
  • 輸入變數字首:輸入需要遍歷的這一組資料的字首,例如:appid_1appid_2,則appid就是字首。
    提示:包括使用者自定義變數,或者是引數化檔案中的資料都要這樣命名才能遍歷。
  • 開始迴圈欄位(不包含):迴圈的起始位置,如填0,實際是從第一個開始。預設為空也可。(親測可以)
  • 結束迴圈欄位(含):迴圈結束的位置,如填4,實際第4個不會被使用,只會到第3個。預設為空也可以,程式會迴圈執行到最後一個變數,再停止。(親測可以)
  • Add "_" before number ?: 是否在上面輸入的變數後增長下劃線“_”。例如不勾選此項,變數為appid1, appid2...以此類推。勾選此項後,變數名變為appid_1, appid_2...以此類推。
    預設為勾選,預設的最好不要動,按照上面的變數名整理資料就好。在日常工作中,看準備資料的情況,來決定是否取消勾選。

3、ForEach控制器的使用

我們以一個學院系統為例,完成以下步驟:

  1. 先查詢出所有學院的列表。
  2. 把列表中的學院ID都提取出來,也就是得到我們需要一組資料。
  3. 然後使用ForEach控制器,迴圈遍歷這些資料。
  4. 從而根據每個學院ID,單獨檢視學院的資訊。

(1)測試計劃內包含的元件

新增元件操作步驟

  1. 建立測試計劃。
  2. 建立執行緒組:選中“測試計劃”右鍵 —> 新增 —> 執行緒(使用者) —> 執行緒組
  3. 線上程組中,新增取樣器”HTTP請求“元件:選中“執行緒組”右鍵 —> 新增 —> 取樣器 —> HTTP請求
  4. 在取樣器中,新增後置處理器“JSON提取器”元件:選中“取樣器”右鍵 —> 新增 —> 後置處理器 —> JSON提取器
  5. 線上程組中,新增邏輯控制器“ForEach控制器”元件:選中“執行緒組”右鍵 —> 新增 —> 邏輯控制器 —> ForEach控制器
  6. 在邏輯控制器中,新增取樣器“HTTP請求”元件:選中“邏輯控制器”右鍵 —> 新增 —> 取樣器 —> HTTP請求
  7. 線上程組中,新增監聽器“察看結果樹”元件:選中“執行緒組”右鍵 —> 新增 —> 監聽器 —> 察看結果樹

最終測試計劃中的元件如下:

image

點選執行按鈕,會提示你先儲存該指令碼,指令碼儲存完成後會直接自動執行該指令碼。

(2)獲取學院列表請求內容

標準的Get請求,填寫請求的基本要素即可。

如下圖所示:

image

返回的資料為JSON格式的資料,如下圖:

image

(3)JSON提取器內容

JSON提取器需要做的就是把每個學院的ID提取出來,存放到執行緒變數中,然後提供給後邊的請求使用。

編輯內容如下:

我們把變數的名字定義為depid,這樣提取出來的變數名就會變為depid_1depid_2,以此類推。

然後使用 JSON PATH 表示式來,提取我們需要的資料。

最後填寫-1,表示儲存所有提取到的值,0表示隨機儲存一個提取到的值。

如下圖所示:

image

當然我們也可以使用正規表示式提取器元件來提取我們需要的資料,結果是一樣的。

如下圖所示:

image

最後我們可以使用Debug Sampler元件,來檢視我們提取的值,是否儲存線上程變數中了。

如下圖所示:

image

(4)ForEach控制器內容

ForEach控制器中所編寫的內容:

  1. 輸入變數字首:就是我們上圖中,存線上程變數中資料名稱的統一字首,為depid
  2. 在哪個變數開始遍歷迴圈:0表示從第一個變數開始,因為不包含開頭,也就是從depid_1變數開始。也可以預設不填寫(親測可以,但最好還是寫上)。
  3. 在哪個變數停止遍歷迴圈:一共有6個變數,因為包含結尾,所以填寫6。也可以預設不填寫(親測可以,但最好還是寫上)。
  4. 輸出變數名稱:也就是在其他的請求中,可引用這個變數的名字,我就定義為dep_id

如下圖所示:

image

(5)檢視學院請求內容

也是一個標準的Get請求,只需要填寫請求的基本資訊即可。

然後我們再需要引入資料的地方,進行引數化變數的引用。

因為該請求在ForEach控制器的控制下,所以ForEach控制器每次遍歷迴圈得到的學院ID,都傳送到請求裡的dep_id變數中,這樣就能檢視對應的學院資訊了。

如下圖所示:

image

(5)檢視結果

執行指令碼,檢視結果,如下圖所示:

image

從上圖中我們可以看到,通過每個學院的ID,單獨檢視了自己學院的資訊。

這樣我們就完成了,介紹ForEach控制器是如何使用的。

提示:關於其他的控制器,我們以後用到,在詳解的進行說明。