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控制器遍歷讀取不同的變數值,來控制其下的取樣器或控制器執行一次或多次。
說明:
- 從上文中看到了一組資料,就說明這樣的資料,通常為一個陣列。
- 可以使用ForEach控制器遍歷迴圈,說明這組資料有一定的規範和順序標識。
- 看到使用者自定義變數,就說明也可以用到引數化,從資料檔案中讀取資料。同理也可以從之前的請求介面中提取到需要的資料,進行遍歷迴圈。
新增ForEach控制器元件操作:選中“執行緒組”右鍵 —> 新增 —> 邏輯控制器 —> ForEach控制器
。
介面如下圖所示:
ForEach控制器元件介面說明:
- 名稱:ForEach控制器元件的自定義名稱,見名知意最好。
- 註釋:即新增一些備註資訊,對該ForEach控制器元件的簡短說明,以便後期回顧時檢視。
- 輸入變數字首:輸入需要遍歷的這一組資料的字首,例如:
appid_1
、appid_2
,則appid
就是字首。
提示:包括使用者自定義變數,或者是引數化檔案中的資料都要這樣命名才能遍歷。 - 開始迴圈欄位(不包含):迴圈的起始位置,如填0,實際是從第一個開始。預設為空也可。(親測可以)
- 結束迴圈欄位(含):迴圈結束的位置,如填4,實際第4個不會被使用,只會到第3個。預設為空也可以,程式會迴圈執行到最後一個變數,再停止。(親測可以)
Add "_" before number ?
: 是否在上面輸入的變數後增長下劃線“_”
。例如不勾選此項,變數為appid1
,appid2
...以此類推。勾選此項後,變數名變為appid_1
,appid_2
...以此類推。
預設為勾選,預設的最好不要動,按照上面的變數名整理資料就好。在日常工作中,看準備資料的情況,來決定是否取消勾選。
3、ForEach控制器的使用
我們以一個學院系統為例,完成以下步驟:
- 先查詢出所有學院的列表。
- 把列表中的學院ID都提取出來,也就是得到我們需要一組資料。
- 然後使用ForEach控制器,迴圈遍歷這些資料。
- 從而根據每個學院ID,單獨檢視學院的資訊。
(1)測試計劃內包含的元件
新增元件操作步驟:
- 建立測試計劃。
- 建立執行緒組:
選中“測試計劃”右鍵 —> 新增 —> 執行緒(使用者) —> 執行緒組
。 - 線上程組中,新增取樣器”HTTP請求“元件:
選中“執行緒組”右鍵 —> 新增 —> 取樣器 —> HTTP請求
。 - 在取樣器中,新增後置處理器“JSON提取器”元件:
選中“取樣器”右鍵 —> 新增 —> 後置處理器 —> JSON提取器
。 - 線上程組中,新增邏輯控制器“ForEach控制器”元件:
選中“執行緒組”右鍵 —> 新增 —> 邏輯控制器 —> ForEach控制器
。 - 在邏輯控制器中,新增取樣器“HTTP請求”元件:
選中“邏輯控制器”右鍵 —> 新增 —> 取樣器 —> HTTP請求
。 - 線上程組中,新增監聽器“察看結果樹”元件:
選中“執行緒組”右鍵 —> 新增 —> 監聽器 —> 察看結果樹
。
最終測試計劃中的元件如下:
點選執行按鈕,會提示你先儲存該指令碼,指令碼儲存完成後會直接自動執行該指令碼。
(2)獲取學院列表請求內容
標準的Get請求,填寫請求的基本要素即可。
如下圖所示:
返回的資料為JSON格式的資料,如下圖:
(3)JSON提取器內容
JSON提取器需要做的就是把每個學院的ID提取出來,存放到執行緒變數中,然後提供給後邊的請求使用。
編輯內容如下:
我們把變數的名字定義為depid
,這樣提取出來的變數名就會變為depid_1
,depid_2
,以此類推。
然後使用 JSON PATH 表示式來,提取我們需要的資料。
最後填寫-1
,表示儲存所有提取到的值,0表示隨機儲存一個提取到的值。
如下圖所示:
當然我們也可以使用正規表示式提取器元件來提取我們需要的資料,結果是一樣的。
如下圖所示:
最後我們可以使用Debug Sampler元件,來檢視我們提取的值,是否儲存線上程變數中了。
如下圖所示:
(4)ForEach控制器內容
ForEach控制器中所編寫的內容:
- 輸入變數字首:就是我們上圖中,存線上程變數中資料名稱的統一字首,為
depid
。 - 在哪個變數開始遍歷迴圈:0表示從第一個變數開始,因為不包含開頭,也就是從
depid_1
變數開始。也可以預設不填寫(親測可以,但最好還是寫上)。 - 在哪個變數停止遍歷迴圈:一共有6個變數,因為包含結尾,所以填寫6。也可以預設不填寫(親測可以,但最好還是寫上)。
- 輸出變數名稱:也就是在其他的請求中,可引用這個變數的名字,我就定義為
dep_id
。
如下圖所示:
(5)檢視學院請求內容
也是一個標準的Get請求,只需要填寫請求的基本資訊即可。
然後我們再需要引入資料的地方,進行引數化變數的引用。
因為該請求在ForEach控制器的控制下,所以ForEach控制器每次遍歷迴圈得到的學院ID,都傳送到請求裡的dep_id
變數中,這樣就能檢視對應的學院資訊了。
如下圖所示:
(5)檢視結果
執行指令碼,檢視結果,如下圖所示:
從上圖中我們可以看到,通過每個學院的ID,單獨檢視了自己學院的資訊。
這樣我們就完成了,介紹ForEach控制器是如何使用的。
提示:關於其他的控制器,我們以後用到,在詳解的進行說明。