Jmeter(十) – 從入門到精通 – JMeter邏輯控制器 – 中篇(詳解教程)

Jmeter(十) – 從入門到精通 – JMeter邏輯控制器 – 中篇(詳解教程)

1.簡介

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

意思是說,邏輯控制器可以控制採樣器(samplers)的執行順序。由此可知,控制器需要和採樣器一起使用,否則控制器就沒有什麼意義了。放在控制器下面的所有的採樣器都會當做一個整體,執行時也會一起被執行。

JMeter邏輯控制器可以對元件的執行邏輯進行控制,除僅一次控制器外,其他可以嵌套別的種類的邏輯控制器。

2.邏輯控制器分類

JMeter中的Logic Controller分為兩類:
(1)控制測試計劃執行過程中節點的邏輯執行順序,如:Loop Controller、If Controller等;
(2)對測試計劃中的腳本進行分組、方便JMeter統計執行結果以及進行腳本的運行時控制等,如:Throughput Controller、Transaction Controller。

3.預覽邏輯控制器 

首先我們來看一下JMeter的邏輯控制器,路徑:線程組(用戶)->添加->邏輯控制器(Logic Controller);我們可以清楚地看到JMeter5中共有17個邏輯控制器,如下圖所示:

如果上圖您看得不是很清楚的話,宏哥總結了一個思維導圖,關於JMeter5的邏輯控制器類型,如下圖所示: 

 通過以上的了解,我們對邏輯控制器有了一個大致的了解和認識。下面宏哥就給小夥伴或則童鞋們分享講解一些通常在工作中會用到的邏輯控制器。 

4.常用邏輯控制器詳解

  這一小節,宏哥就由上而下地詳細地講解一下常用的邏輯控制器。

4.1Critical Section Controller

我們先來看一下,官方原汁原味的解釋:The Critical Section Controller ensures that its children elements (samplers/controllers, etc.) will be executed by only one thread as a named lock will be taken before executing children of controller.

宏哥這個二把刀的翻譯,給你們翻譯一下這段鳥語看看到底是什麼意思,大致意思是: Critical Section Controller(臨界區控制器),確保它的子元素(samplers /控制器等)在執行控制器的子程序之前只執行一個線程作為指定的鎖。呵呵!看到這句話是不是覺得一頭霧水啊,摸一摸自己所剩無幾的頭髮陷入沉思中…..沒有關係的,不要糾結了,宏哥後邊會用具體實例講解一下,看完實例后,再回過頭來閱讀這句話,你就會恍然大悟了。

 1、我們先來看看這個Critical Section Controller長得是啥樣子,路徑:線程組 > 添加 > 邏輯控制器 > 臨界部分控制器,如下圖所示:

2、關鍵參數說明如下:

Name:名稱,可以隨意設置,甚至為空;

Comments:註釋,可隨意設置,可以為空;

Lock name:鎖名稱,這裏可以填入其子節點下執行的線程的名稱,這個線程作為一個全局鎖存在

4.1.1實例講解 

這部分主要是通過配合實例我們來理解一下開始那句話到底什麼意思。

1、宏哥這裏先說一個訪問宏哥博客園的JMeter系列文章的測試場景:我們第一步首先要訪問博客園的首頁,第二步找到宏哥的訪問宏哥博客園的首頁,第三步點擊JMeter類別。按順序完成三步,才能完成這個測試場景。那麼我們根據這個場景用JMeter來添加多個請求的取樣器。如下圖所示:

2、腳本調試是通了,運行JMeter,查看結果樹,如下圖所示:

3、從上個圖,查看結果樹中显示請求結果數據不是按照順序請求,不符合預期,這個時候增加一個critical section controller(臨界部分控制器),增加一個鎖,就能控制執行順序。如下圖所示:

4、腳本調試是通了,運行JMeter,查看結果樹,可以清楚地看出來是按預期的順序執行請求的。但是這樣響應時間會過長,這個後邊再做講解。如下圖所示: 

 4.1.2鎖名分類

(1)鎖名為空,認為每個鎖為不同的鎖

1、宏哥通過具體實例,來看一下,創建鎖名為空的臨界部分控制器,如下圖所示:

2、運行JMeter,查看結果樹,如下圖所示:

(2)鎖名相同,多個鎖認為是同一個鎖,同一個時間點只能存在一個運行中

1、宏哥通過具體實例,來看一下,創建鎖名相同的臨界部分控制器,如下圖所示:

2、運行JMeter,查看結果樹,如下圖所示:

(3)鎖名為變量,根據變量值來判斷是不是屬於同一個鎖,變量值為相同時,則認為是同一個鎖

1、宏哥通過具體實例,來看一下,創建鎖名為變量的臨界部分控制器,如下圖所示:

2、運行JMeter,查看結果樹,如下圖所示:

4.2ForEach Controller

ForEach 控制器:一般搭配用戶變量使用。依次調用用戶定義的變量,直到最後一個,結束循環。為了滿足ForEach Controller提取數據,變量命名的格式一般為“變量名_数字”,其中数字從1開始。
1、即遍歷循環控制器,顧名思義是定義一個循環規則。
2、用來遍歷當前元素的所有可執行場景。
3、在用戶自定義變量中讀取一系列相關的變量,該控制器下的採樣器或控制器都會被執行一次或多次,每次讀取不同的變量值。
4、這個控制器一般配合配置元件 → 正則表達式提取器來一起使用,可對頁面上的某些元素進行重複處理。

1、我們先來看看這個ForEach Controller長得是啥樣子,路徑:線程組 > 添加 > 邏輯控制器 > ForEach控制器,如下圖所示: 

2、關鍵參數說明如下:

Name:名稱,可以隨意設置,甚至為空;

Comments:註釋,可隨意設置,可以為空;

Input variable prefix:輸入變量前綴,可以在“用戶自定義變量”中定義一組變量,循環控制器可以從中獲取到變量對應的值,然後作為循環控制器的循環條件,還可以輸出變量作為取樣器的參數。

Start index for loop:循環變量下標起點。循環指數開始(唯一)→ 遍歷查詢的變量範圍,開始的值(這裏如果不填寫,默認從 1 開始,如果沒有 1 開始的變量,執行時會報錯)

End index for loop:循環變量下標終點。循環指數結束(包含)→ 遍歷查詢的變量範圍,結束的值

Output variable name:輸出變量名稱,循環控制器生成的變量名稱。後續可通過${}引用

Add “_” before number ?: 變量前綴后是否加“_”作為分隔符。如果定義的變量名中有下劃線的話就要勾選此項,否則找不到;反之,沒有的話不要勾選,否則同樣找不到變量

4.2.1實例講解

1、首先在自定義5個前綴為 北京宏哥 的變量,值分別為 a b c d e。並且 北京宏哥 後面的数字是連續的,如果不連續,則不會被循環到,如下圖所示:

2、配置ForEach控制器,如下圖所示:

3、添加請求 訪問博客園首頁 + 輸出值:${宏哥},輸出值是在控制器的輸出變量 宏哥,通過 ${宏哥} 取到輸出變量的值,如下圖所示:

4、添加查看結果樹,運行JMeter,查看結果樹,如下圖所示: 

注意:敲黑板,敲腦袋!!!

1、輸入變量的後綴數值一定要連續,比如 北京宏哥_1, 北京宏哥_2, 北京宏哥_3 … 這樣,如果中間有不連續的,循環會中斷

2、循環開始的設定:如果變量為北京宏哥_1, 北京宏哥_2, 北京宏哥_3,而設定的開始為 1,則會從北京宏哥_2 開始循環

3、循環結束的設定:如果變量有3個 北京宏哥_1, 北京宏哥_2, 北京宏哥_3,而設定的結束為5,則只會循環 北京宏哥_1, 北京宏哥_2, 北京宏哥_3 ,如果設定的結束為2,則會循環  北京宏哥_1, 北京宏哥_2 。

4.3Include Controller

Include控制器用來導入外部的測試片段(非完整的測試計劃),在執行時會執行導入的測試計劃,但是被導入的測試計劃有特殊要求,它不能有線程組,只能包含簡單的控制器及控制器下的元件。換句話說就是相當於加了一個執行單元,一個封裝了的業務操作單元,類似我們程序開發中的函數(方法)一樣。例如一個查詢學生信息的業務操作我們用取樣器來模擬,然後放到簡單控制器中作為一個執行單元,別的地方也要用到時,我們可以不用重複造輪子直接引用過來。

一般來說,Include控制器和測試片段(Test Fragment)配合使用的比較常見。

1、我們先來看看這個include Controller長得是啥樣子,路徑:線程組 > 添加 > 邏輯控制器 > Include控制器,如下圖所示:

2、關鍵參數說明如下:

Name:名稱,可以隨意設置,甚至為空;

Comments:註釋,可隨意設置,可以為空;

Filename:文件名,必輸字段,如果沒有,就會報錯。通過Filename的路徑和文件名引用外部的jmx文件。

宏哥推薦小夥伴或者童鞋們可以將 Include控制器 Module控制器(傳送門)一起對比着學習,Include控制器 是從外部文件引用,只能引用整個測試片段的內容,Module控制器 是從內部文件中引用,引用上相對比較靈活,可以只引用部分測試片段或模塊內容。這樣一內一外不僅容易理解也容易記憶和學習。

4.3.1實例

(1)當Filename路徑的值為空,程序執行報錯,腳本執行中止,不會繼續執行下面的腳本內容。

1、首先創建一個Filename路徑為空的測試計劃,如下圖所示:

2、運行JMeter,查看結果樹(程序執行報錯,腳本執行中止,不會繼續執行下面 訪問博客園首頁 的取樣器),如下圖所示: 

(2)當Filename路徑中的文件不存在,程序直接彈窗報錯並停止執行。

1、首先創建一個Filename路徑中的文件不存在的測試計劃,點擊“保存”按鈕的時候,就會直接彈窗報錯。如下圖所示:

(3)當Filename路徑的文件中不包含測試片段,跳過控制器,繼續向下執行。

1、首先創建一個外部引用沒有測試片段的測試計劃,如下圖所示:

2、創建一個Filename路徑的文件中不包含測試片段的測試計劃,將上邊的外部引用-無測試片段文件添加到Include控制器中,如下圖所示:

3、運行JMeter,查看結果樹(跳過控制器,繼續向下執行 訪問博客園首頁 的取樣器),如下圖所示: 

(3)當Filename路徑的文件中包含測試片段,執行完控制器,再繼續向下執行。

1、首先創建一個外部引用有測試片段的測試計劃,如下圖所示:

2、創建一個Filename路徑的文件中包含測試片段的測試計劃,將上邊的外部引用-有測試片段文件添加到Include控制器中,如下圖所示:

3、運行JMeter,查看結果樹(執行完控制器里的測試片段,再繼續向下執行 訪問博客園首頁 的取樣器),如下圖所示: 

到這裏,大家應該理解了  Include Controller 和  Test Fragment 了吧。宏哥的理解就是,Test Fragment 相當於一個獨立的部分,可以被其他測試計劃引用,實現 樣例的片段化,模塊化,遇到重複需要的,比如登錄、註冊之類的,就可以用Test FragmentInclude Controller 了。這樣可以避免重複造輪子,做許多無用功。

5.小結

   好了,今天關於邏輯控制器的上篇就講解到這裏,這一篇主要介紹了 Critical Section ControllerForEach ControllerInclude控制器

 

您的肯定就是我進步的動力。如果你感覺還不錯,就請鼓勵一下吧!記得隨手點波  推薦  不要忘記哦!!!

別忘了點 推薦 留下您來過的痕迹

 

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

USB CONNECTOR掌控什麼技術要點? 帶您認識其相關發展及效能

台北網頁設計公司這麼多該如何選擇?

※智慧手機時代的來臨,RWD網頁設計為架站首選

※評比南投搬家公司費用收費行情懶人包大公開

※回頭車貨運收費標準