動態

詳情 返回 返回

每週讀書與學習->JMeter主要元件詳細介紹(三)邏輯控制器 - 動態 詳情

每週讀書與學習是由清華大學出版社出版的《JMeter核心技術、性能測試與性能分析》一書的作者推出,分享作者多年的IT從業經歷,希望對很多計算機科學技術IT類專業畢業生以及IT從業者有所幫助。

1、邏輯控制器

在Jmeter中,邏輯控制器顧名思義就是用來控制性能測試執行的邏輯,通常用來控制採樣器的執行順序,同時也可以對Jmeter中的元件的執行邏輯進行控制,因為在做性能測試時,可能經常會遇到一些比較複雜的業務場景,那麼就可以使用邏輯控制器來完成一些特定的比較複雜的業務邏輯處理,如下圖所示。

從圖中可以看到,邏輯控制器通常主要包括:

  • IF控制器:通過IF條件判斷來控制性能測試腳本的運行,通常只有滿足IF控制器中的條件才會執行對應的測試腳本邏輯,如下圖所示,只有滿足圖中的Expression表達式的執行結果為true時,才會執行該控制器下的元件。Expression表達式的常用場景包括:
    • 對某個Jmeter中的變量判斷其結果是否為True,比如判斷取樣器的最後一次執行結果是否成功,可以在Expression中輸入${JMeterThread.last_sample_ok}。
    • 通過比較的方式來判斷某個變量是否滿足一定的條件,比如"${VAR}"=="abcd"表示某個變量VAR是否為abcd。
    • 使用腳本語言表達式的方式來判斷某個變量的值是否正確,比如${__jexl3(${VAR} == 23)}表示通過Jexl腳本語言表達式來判斷某個VAR變量的值是否等於23,比如${__groovy(vars.get("myMissing") != null )} 表示通過Groovy腳本語言表達式來判斷某個myMissing變量值不為空,通常支持的腳本語言包括Jexl、Groovy、JavaScript、BeanShell等。

如果對於Jmeter支持的多種腳本語言不熟悉,因為畢竟學習一門腳本語言需要一定的編程基礎,可以通過Jmeter中的函數助手來生成對應的腳本語言表達式,如下圖所示,圖中選中了Jexl3腳本語言,然後在JEXL expression to evaluate中輸入了需要判斷的條件,點擊生成按鈕即可生成對應的腳本語言表達式,Jmeter中的函數助手支持的腳本語言還包括了BeanShell、Groovy、JavaScript等。

  • 事務控制器:主要用於統計該控制器節點下的取樣器請求的處理時長等各種性能指標,該控制器界面包含如下兩個選項:
    • Generate parent sample:如果勾選表示該取樣器作為其他取樣器的父取樣器來生成性能測試的指標結果,簡單來説就是當該控制器下有多個取樣器時,會將所有的取樣器的性能指標合併在一起進行統計,否則表示該取樣器作為獨立取樣器來生成性能測試的指標結果,此時當該控制器下有多個取樣器時,將會分別展示每個取樣器的性能指標。
    • Include duration of timer and pre-post processors in generated sample:生成的取樣器的處理時長中是否需要包含定時器、前置處理器和後置處理器的時長,默認為不勾選。
  • 循環控制器:用於讓該控制器下的取樣器等元件可以循環執行,該取樣器界面上支持設置循環的次數,如下圖所示。

  • While控制器:用於讓控制器下的取樣器等元件在滿足條件判斷時持續執行,直到While條件為False時,退出While循環,在While控制器的條件判斷表達式中支持Groovy、Jexl等腳本語言表達式,表達式的結果必須要返回一個True或者False類型的布爾值。
    • 比如可以輸入${__jexl3(${var_result}==10)},用於表示判斷var_result這個變量的值是否等於10,如果不支持如何生成條件判斷表達式,可以藉助Jmeter中的函數助手來完成。
    • 當不輸入任何判斷條件時,當最後一個While循環執行失敗時,會直接退出循環,如下圖所示。

    • 當輸入判斷條件為LAST時,也是表示當最後一個While循環執行失敗時,會直接退出循環,同時在執行While控制循環之前,如果上一個取樣器請求執行失敗,那麼Jmeter將直接不會進入到While控制器進行任何執行,如下圖所示。

  • 臨界部分控制器:通常用於在多線程併發處理時控制取樣器等元件僅由一個線程來完成執行,因為該控制器支持使用鎖定的方式來控制該控制器下的取樣器等元件僅會讓一個線程來運行,如下圖所示,鎖名稱可以完全自定義,當在一個Jmeter測試計劃中存在多個臨界部分控制器時,建議每個臨界部分控制器的鎖名稱不要重複。

  • ForEach控制器:用於循環遍歷一組用户定義的相關變量的值,當將取樣器等其他元件添加到該控制器下之後,每個取樣器或者其他元件都會執行一次或者多次,每次會讀取到不同的變量值。ForEach控制器通常需要結合配置元件下的用户定義的變量一起使用,如下圖所示,在Jmeter的測試計劃下從配置元件中添加了如下所示的用户定義的變量。

在ForEach控制器中,定義瞭如何來遍歷上面的用户定義的變量,如下圖所示。

當運行圖中所示的測試計劃後,ForEach控制器會通過圖中定義的輸入變量前綴user 以及開始循環字段0和結束循環字段3去用户定義的變量中讀取對應的符合前綴條件的變量以及該變量對應的值,並且賦予給名為vuser的新的變量名,並且這個新的變量在該控制器下的所有取樣器或者其他元件中都可以通過${vuser}來引入使用,如下圖所示。由於符合ForEach控制器讀取條件的用户定義的變量總共有3個,所以ForEach控制器會讀取三次,並且其下對應的取樣器或者其他元件也會執行3次。

  • Include控制器:通過讀取外部的JMX文件(即Jmeter測試計劃保存後的文件)中的測試計劃來進行執行。
  • 交替控制器:通常用於讓交替控制器下的取樣器交替執行,如下圖所示,交替控制器會按照順序,每次從其下選取一個取樣器來進行交替執行。
  • 錄製控制器:錄製控制器其本質只是一個佔位符的作用,用於告訴代理服務器應該將取樣器結果記錄到哪裏,在性能測試運行時,本身沒有任何的效果。
  • 吞吐量控制器:主要用於對該控制器下的取樣器根據總吞吐量來控制其執行的頻率,支持按照執行總數和執行百分比來限制執行的頻率,當達到設置的閾值後,該控制器將直接停止執行。

  • 僅一次控制器:用於控制在多線程併發用户執行時,該控制器下的取樣器等元件每個線程都只會執行一次,如下圖所示,當設置有10個併發線程用户在執行100次循環時,僅一次控制器下的HTTP登錄請求取樣器總共只會執行10次,而且10個線程,每個線程都只會執行一次後,就不會再執行,這裏可以舉一個實際的例子,一個性能壓測時,需要先進行用户登錄,登錄完成後,再攜帶用户登錄的Cookie去完成後續的其他請求操作,那麼此時就需要用到僅一次控制器了,因為每個用户都只需要登錄一次,登錄成功後,就取得了登錄之後的Cookie了,由於Cookie是可以在有效期過期時間內一直可以繼續使用的,所以每個線程用户後續的其他請求操作就不需要再次進行登錄請求操作了。

  • 隨機控制器:當該控制器下有多個取樣器請求時,隨機控制器用於從該控制器下隨機選取一個取樣器進行執行,並且每次只會隨機選取一個,如下圖所示。

  • 隨機順序控制器:通常用於讓該控制器下的多個取樣器每次按照隨機的順序執行,並且確保每個取樣器都只會被執行一次,如下圖所示。

  • Runtime控制器:用於控制該控制器下的取樣器等元件的運行時長,單位為秒,在該時長內,取樣器或者其他元件會反覆運行,直到達到了該控制時長,如下圖所示。

  • 簡單控制器:通常用於對多個取樣器等元件進行簡單的分組管理,在性能測試時當存在多個不同取樣器或者其他元件並且需要對這些取樣器或者元件進行簡單的分組時才會用到該控制器,簡單控制器不會改變Jmeter運行的邏輯,如下圖所示。

  • 模塊控制器:用於將測試計劃中的某個控制器以及該控制器下的所有元件替換到當前測試計劃中進行執行,如下圖所示,其主要作用在於可以在多個不同的性能測試案例中進行切換,提高性能測試案例腳本的靈活度。

  • Switch控制器:用於通過該控制器界面上的Switch Value值來確定應該執行該控制器下的哪個子節點元件,如下圖所示。
    • 當Switch Value為空時,默認執行第1個子節點元件,即圖中的HTTP請求A。
    • 直接根據指定的子節點元件的名稱來執行,比如Switch Value輸入HTTP請求C時,會直接只執行HTTP請求C這個元件。
    • Switch控制器下的子節點元件從0開始計數,通過指定子節點元件所在的數值來確定執行哪個元件,比如Switch Value輸入2時,會直接只執行HTTP請求B這個元件,因為HTTP請求B這個元件恰好是排在第2位。

2、本次學習總結

  • 邏輯控制器的使用,包括IF控制器、事務控制器、循環控制器、While控制器、臨界部分控制器、ForEach控制器、Include控制器、交替控制器、錄製控制器、吞吐量控制器、僅一次控制器、隨機控制器、隨機順序控制器、Runtime控制器、簡單控制器、模塊控制器、Switch控制器等,建議讀者重點掌握IF控制器、循環控制器、While控制器、僅一次控制器、Switch控制器的使用。

在完成本次的學習後,讀者們需要能完成一些更加複雜的Jmeter性能測試腳本的編寫,因為在性能測試時,有時候會遇到一些邏輯很複雜的業務需求,這時候可能就會需要用到函數助手或者邏輯控制器來完成這些複雜的性能測試場景。

出處:本次學習的內容參考自清華大學出版社出版的《JMeter核心技術、性能測試與性能分析》一書

Add a new 評論

Some HTML is okay.