對於如下測試腳本:正則表達式
爲了能調用進入房間接口,須要從考場接口獲取考場token。爲了調用考場接口,須要從登錄接口獲取登錄token。元件說明以下:測試
學生登陸,提取登陸${token}
傳入下個接口參數。線程
添加HTTP Header Manager:3d
考場token,提取考場${exam_token}
傳入下個接口參數。code
添加HTTP Header Manager:blog
進入房間token
貌似挺合理,HTTP Header Manager會給下方的接口添加請求頭,運行結果然的如咱們所料麼?接口
在回答這個問題以前,有必要搞懂JMeter元件的運行順序,它是由2 個維度來決定的:從上往下和元件類型。作用域
從上往下,即目錄樹從上往下。元件類型,分爲3類:io
它們的運行順序以下:
配置元件(若是存在)
前置處理器(若是存在)
定時器(若是存在)
取樣器(若是存在)
後置處理器(若是存在且取樣器的結果不爲空)
斷言(若是存在且取樣器的結果不爲空)
監聽器(若是存在且取樣器的結果不爲空)
換句話說,假設咱們新建了1個線程,想用這個線程去發請求。
第一步,初始化配置,好比參數化、設置Header、Cookie等,用到配置元件。
第二步,可能須要給線程加點參數,好比用戶參數,用到前置處理器。
第三步,在發送請求前可能會等待一段時間,用到定時器。
第四步,發送請求,用到取樣器。
第五步,可能須要提取響應數據,好比正則表達式提取器、JMESPath提取器,用到後置處理器。
第六步,驗證結果符合預期,用到斷言。
第七步,查看請求響應數據和測試結果,用到監聽器。
對於如下所列元件:
JMeter會按如下步驟運行:
其中有個觀察做用域實際效果的關鍵元件:HTTP請求2,它的先後並無元件,可是也被做用上了。在JMeter中,同一層級的元件具備相同的做用域!
簡單控制器是一個執行單元,自己沒有內容,它的做用是把元件進行分組:
由於簡單控制器經過分組給元件劃分了層級,因此簡單控制器下面的這些同層級元件,做用域相同,既會做用於 HTTP請求1,也會做用於HTTP請求2。注意了!配置元件、前置處理器、定時器、後置處理器、斷言、監聽器,這六個組件,會做用到範圍內的全部取樣器。
除了同級做用域,還有上下級,JMeter的上級做用域包含下級做用域,可是下級是不能做用到上級。好比HTTP請求3,簡單控制器下級的元件,是不會做用到HTTP請求3的。
HTTP Header Manager是配置元件,會做用到範圍內的全部取樣器。這裏有2個HTTP Header Manager,都位於同一層級,它們會一塊兒執行。在JMeter同一執行單元中,若是相同類型的元件有多個,那麼它們會被當作一個一塊兒執行!
測試一下,把最後一個HTTP Header Manager的authorization重命名爲authorization2,查看考場接口的Headers:
兩個HTTP Header Manager都做用上了。
爲了不混亂,在實際使用時建議:
按照建議調整後的測試腳本以下:
User Defined Variables和CSV Data Set Config,是配置元件,且跟取樣器同級,會同時做用到這 3 個取樣器上面。
本文開頭引入了我在實際工做中碰到的問題,爲了解決,先搞懂了JMeter元件運行順序,而後參考了實踐指南,發現了同一層級做用域相同這個原理,總結出了使用建議,配置元件、前置處理器、定時器、後置處理器、斷言這六類元件,最好放在取樣器的下級,調整後腳本如期運行。