
Jmeter有個配置元素叫做用戶自定義變量(英文名稱是UserDefinedVariables)而我們提到的vars即是Variables的簡寫。
之前我們也說到過Jmeter的腳本中(jsr223sampler或者beanshell編寫的腳本)使用varsput和varsget的操作(varsget和put的操作僅在threadgroup測試組線程中執行,所以結果的改變也僅影響該threadGroup,所以不是跨線程組的。需要跨線程組的的變量共享則可以使用prop,vars和props的使用可見vars和props使用對比1和vars和props使用對比2)。那“用戶自定義變量”和腳本中的vars操作這2個關系是如何的呢?
1)Userdefinedvariables(用戶自定義變量)jmeter的處理是非常簡單粗暴的,不管該元素位于哪個位置,例如位于threadgroup,還是在threadgroup外面的testplan中,位于threadgroup的執行順序的最下面還是最上面。jmeter在啟動并開始執行腳本之前,實際上對所有的用戶配置類元素,全部初始化操作。
例如
TestPlan
? ? - User defined vars1(定義了var1=test)
? ? - threadgroup1
? ? ? ? - User defined vars2(定義var2=test2)
? ? - threadgroup2
則執行時,Userdefinedvars1和Userdefinedvars1都執行了初始化操作。同時threadgroup1和threadgroup2中均可以看到var1和var2.Userdefinedvars(用戶自定義變量)初始化后,會將所有的定義變量copy到每一個線程組中,所以每一個線程組都可以看到userdefindvars(用戶自定義變量)定義的參數。
2)jmeter腳本中(jsr223sampler或者beanshell編寫的腳本)的vars.put操作,例如vars.put(“var1″,”changedvar1″),僅會修改該腳本執行的線程組的變量。
例如
TestPlan
? ? - User defined vars1(定義了var1=test)
? ? - threadgroup1
? ? ? ? - User defined vars2(定義var2=test2)
? ? ? ? - vars.put("var1","changedvar1")
? ? ? ? - Debug sampler1
? ? - threadgroup2
? ? ? ? - Debug sampler2
? ? ? ? ? ? - sleep 5秒(等待 threadgroup1 執行完成后,用于確認threadgroup1 中的vars.put 是否對threadgroup2的vars 變量有影響)
則執行后。
threadgroup1 中可見 var1=changedvar1 , var2=test2
threadgroup2 中可見 var1=test,var2=test2
3) 那么我們再來看下user defined vars(用戶自定義變量)元素定義的變量var和jmeter 腳本中定義var的區別。
jmeter腳本重定義var 僅在自己所屬的線程組有效,不是全局的。而 user defind vars(用戶自定義變量)定義的是全局(全局的驗證,在2部分已經可以看到)
如
TestPlan
? ? - User defined vars1(定義了var1=test)
? ? - threadgroup1
? ? ? ? - vars.put("var1","changedvar1")
? ? ? ? - vars.put("var3","test3")
? ? ? ? - Debug sampler1
? ? - threadgroup2
? ? ? ? - Debug sampler2
? ? ? ? ? ? - sleep 5秒(等待 threadgroup1 執行完成后,用于確認threadgroup1 中的vars.put 是否對threadgroup2的vars 變量有影響)
則執行后,
threadgroup1 中可見 var1=changedvar1 , var3=test3
threadgroup2 中可見 var1=test
因此我們在使用user defined vars可以統一寫在一個地方,便于腳本的梳理。 而腳本中vars.get,vars.put 的處理僅對線程組內有效(包括listener監聽器中的vars.get, vars.put)。 這樣我們在腳本開發中就會更清晰和方便定位問題了。