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控制器是如何使用的。
提示:關於其他的控制器,我們以后用到,在詳解的進行說明。