JMeter元件做用域實踐指南

從一個問題提及

對於如下測試腳本:正則表達式

爲了能調用進入房間接口,須要從考場接口獲取考場token。爲了調用考場接口,須要從登錄接口獲取登錄token。元件說明以下:測試

  • 學生登陸,提取登陸${token}傳入下個接口參數。線程

  • 添加HTTP Header Manager:3d

  • 考場token,提取考場${exam_token}傳入下個接口參數。code

  • 添加HTTP Header Manager:blog

    image-20201102153752646

  • 進入房間token

貌似挺合理,HTTP Header Manager會給下方的接口添加請求頭,運行結果然的如咱們所料麼?接口

運行順序

在回答這個問題以前,有必要搞懂JMeter元件的運行順序,它是由2 個維度來決定的:從上往下和元件類型。作用域

從上往下,即目錄樹從上往下。元件類型,分爲3類:io

  • 線程組、邏輯控制器。
  • 取樣器。
  • 配置元件、前置處理器、定時器、後置處理器、斷言、監聽器。

它們的運行順序以下:

  1. 配置元件(若是存在)

  2. 前置處理器(若是存在)

  3. 定時器(若是存在)

  4. 取樣器(若是存在)

  5. 後置處理器(若是存在且取樣器的結果不爲空)

  6. 斷言(若是存在且取樣器的結果不爲空)

  7. 監聽器(若是存在且取樣器的結果不爲空)

換句話說,假設咱們新建了1個線程,想用這個線程去發請求。

第一步,初始化配置,好比參數化、設置Header、Cookie等,用到配置元件。

第二步,可能須要給線程加點參數,好比用戶參數,用到前置處理器。

第三步,在發送請求前可能會等待一段時間,用到定時器。

第四步,發送請求,用到取樣器。

第五步,可能須要提取響應數據,好比正則表達式提取器、JMESPath提取器,用到後置處理器。

第六步,驗證結果符合預期,用到斷言。

第七步,查看請求響應數據和測試結果,用到監聽器。

實踐指南

對於如下所列元件:

image-20201102110655732

JMeter會按如下步驟運行:

  1. 線程組(若是有多個線程組能夠在測試計劃設置是順序執行仍是同時執行)
  2. 簡單控制器(父節點)
  3. HTTP Cookie管理器(配置元件)
  4. 用戶參數(前置處理器)
  5. Synchronizing Timer(定時器)
  6. HTTP 請求1(取樣器)
  7. 正則表達式提取器(後置處理器)
  8. 響應斷言(斷言)
  9. HTTP Cookie管理器(配置元件)
  10. 用戶參數(前置處理器)
  11. Synchronizing Timer(定時器)
  12. HTTP 請求2(取樣器)
  13. 正則表達式提取器(後置處理器)
  14. 響應斷言(斷言)
  15. HTTP 請求3(取樣器)
  16. 察看結果樹(嚴格來說是與第 6 步並行,也就是取樣器以後)

做用域

其中有個觀察做用域實際效果的關鍵元件:HTTP請求2,它的先後並無元件,可是也被做用上了。在JMeter中,同一層級的元件具備相同的做用域!

簡單控制器是一個執行單元,自己沒有內容,它的做用是把元件進行分組:

image-20201102114047379

由於簡單控制器經過分組給元件劃分了層級,因此簡單控制器下面的這些同層級元件,做用域相同,既會做用於 HTTP請求1,也會做用於HTTP請求2。注意了!配置元件、前置處理器、定時器、後置處理器、斷言、監聽器,這六個組件,會做用到範圍內的全部取樣器。

除了同級做用域,還有上下級,JMeter的上級做用域包含下級做用域,可是下級是不能做用到上級。好比HTTP請求3,簡單控制器下級的元件,是不會做用到HTTP請求3的。

回答開頭的問題

image-20201102153442568

HTTP Header Manager是配置元件,會做用到範圍內的全部取樣器。這裏有2個HTTP Header Manager,都位於同一層級,它們會一塊兒執行。在JMeter同一執行單元中,若是相同類型的元件有多個,那麼它們會被當作一個一塊兒執行!

測試一下,把最後一個HTTP Header Manager的authorization重命名爲authorization2,查看考場接口的Headers:

image-20201103151208796

兩個HTTP Header Manager都做用上了。

爲了不混亂,在實際使用時建議:

  • 根據前後順序,從上往下合理的放置元件的順序。
  • 對於配置元件、前置處理器、定時器、後置處理器、斷言這六類元件,它們都是爲取樣器服務的,若是隻想做用於單個取樣器,那麼最好放在這個取樣器的下級。

按照建議調整後的測試腳本以下:

image-20201103151848256

User Defined Variables和CSV Data Set Config,是配置元件,且跟取樣器同級,會同時做用到這 3 個取樣器上面。

小結

本文開頭引入了我在實際工做中碰到的問題,爲了解決,先搞懂了JMeter元件運行順序,而後參考了實踐指南,發現了同一層級做用域相同這個原理,總結出了使用建議,配置元件、前置處理器、定時器、後置處理器、斷言這六類元件,最好放在取樣器的下級,調整後腳本如期運行。

相關文章
相關標籤/搜索