用Jmeter才做了一個項目的測試,就不得不對函數這部分吐槽一下,真是有點弱,難怪大多數人不用這個功能,不過如果用的好也是很方便的,以下慢慢說。
一、BeanShell函數
在測試中遇到了時間戳的加減,查到發現__BeanShell可以做表達式的運算,滿心歡喜的用了,結果發現沒有結果,再三確認發現不是自己使用的問題,隨即
測試了12+12,發現沒有問題。最后猜測應該是這個函數是int類型的計算,測試后發現這里的最大值就是int類型的最大值。(心里又默默的吐槽了一番為何
不弄成long類型呢?)
二、javaScript函數
1、由於BeanShell無法滿足自己的要求,隨機查看發現了__javaScript函數,於是開始使用,函數如下${__javaScript(new Date(2016,0,29).valueOf(),)},設置如下
發現HTTP的請求中原樣輸出了,為什么呢?
new Date(2016,0,29).valueOf()這個在瀏覽器的控制台執行時沒有任何問題的!這個問題也無從考證。
后來用new Date().valueOf()發現可以,那怎樣才能得到指定時間的時間戳呢?
經過不斷反復的驗證,發現在Jmeter中如果用__javaScript函數取得指定日期的時間戳,只能通過${__javaScript(new Date("Jan 29 2016").valueOf(),)},必須是
字符串初始化才可以,其他的都不行。(這里又再次吐槽了一番,設計了這個函數,為何功能這么弱?)
2、__javaScript函數操作路徑
上面的設置是得不到正確路徑的為什么呢?如下,"E:\\jmeter"+".dat",這個在瀏覽器的console執行時沒有問題的?
后來把"E:\\jmeter"+".dat"改為"E:\\\\jmeter"+".dat"執行成功,才恍然大悟,從然是執行的JS但是參數的傳遞還是通過Java來的,所以
才會造成這種現象
三、threadNum函數
測試中難免要用到跟線程相關的參數,這時候可能會想到${__threadNum}這個線程號的函數,但是這個函數也有它的局限性,首先不能工作在配置元件中
比如用戶定義變量等等,其次多個線程組這里返回的線程號是一致的,so在設計的時候要考慮清楚
四、P函數
測試中如果遇到多個線程組之間傳遞變量的情況,可能一種方式就是用屬性才操作,那么通過${__P(,)}來讀取屬性就是一種好的方式
五、setProperty函數
變量之間傳遞屬性,那么必須設置屬性,可以通過${__setProperty(,,)}進行設置屬性。其實在剛開始的時候知道可以通過這么設置,但是卻不知道
這個函數應該運行在哪個組件中后來才了解到了beanshell。
六、time函數
一般HTTP請求中的隨機數都是通過時間戳的方式生成的,${__time(,)}這個函數剛好可以生產12位以毫秒為單位的時間戳,如果是10位的話${__time(/1000,)}
可以這樣使用