有關Beanshell和JSR223組件的部分,早就想寫一大篇幅隨筆進行記錄,苦於不知如何去描述這兩部分的內容,一直在修改隨筆。java
介紹一下Beanshell:shell
Beanshell是輕量級Java,支持對象式的腳本語言特性,亦可嵌入到JAVA源代碼中,能動態執行JAVA源代碼併爲其擴展了腳本語言的一些特性,像JavaScript和perl那樣的弱類型、命令式、閉包函數等等特性都不在話下。(飛昇傳送門:http://www.beanshell.org/)閉包
Beanshell在Jmeter有着至關強的地位,被稱之爲Jmeter腳本語言的King。不過前段時間在Blazemeter中看到一篇文章----《IS Beanshell Dead?》,仔細閱讀了一番,其大體之意即是自Jmeter3.1以來,JSR223的腳本語言對Groovy的默認化,相對於Beanshell,開發人員更爲喜歡Groovy;不過對於咱們來講,究竟是選擇Beanshell仍是Groovy?現階段我以爲不必討論這樣的話題。不過我認爲適當的轉變是有必要的,盲目跟風那絕對是大忌!有興趣的能夠去看看,究其根本緣由是什麼。金庸老爺子是這樣描述獨孤求敗:草木竹石都可爲劍。自此精進,漸入無劍勝有劍之境。劍神不是劍法有多高超,而是功力太深厚,草木竹石皆可爲劍!Beanshell、Groovy皆可爲劍!哈哈,看看Jmeter中的Beanshell和JSR223以及它們所能實現的功能吧!dom
首先,Beanshell和JSR223組件是涉及代碼部分的組件,至於用途,能量所在來進行一一記載:函數
Beanshell和JSR223幾乎在Jmeter的每部分都有涉及到:測試
一、Sampler加密
二、PreProcessor線程
三、PostProcessor3d
四、Timers日誌
五、Assertions
六、Listeners
那麼先添加一個Beanshell Sampler:
圖上標註了五部份內容,幾乎除了名稱和註釋之外的全部部分,都是十分重要的內容。來進行一一解讀:
先貼官方文檔:
Rest bsh.Interpreter before each call:(check box)不作解釋,具體見官方文檔中給出的示例(或轉Best Practices - Beanshell seripting)
Parameters(String Parameters and String 【】bah.args):傳遞參數,可將GUI腳本中建立的Parameters參數傳遞至Beanshell腳本中。在Beanshell腳本中引用是使用bsh.args【x】進行實例化。
Script file:導入Beanshell腳本運行文件。文件名存儲在腳本變量名中。
Script:腳本編寫處。(Beanshell語法)
而最下方的一段話,我是特地框了起來,不少人可能會忽略,可是這段話中列舉的變量即是爲Beanshell腳本定義的:
SampleResult, ResponseCode, ResponseMessage, IsSuccess, Label, FileName, ctx, vars, props, log
用過的人確定都很熟悉這裏邊的變量,具體用途同名一致!
OK、上個簡單的例子(該Demo來自Blazemeter的示例,你們有興趣能夠去看看):
使用隨機函數Random做爲一個隨機響應數據。
將Dummy Sampler的響應結果以及響應數據保存至「Response_data」變量中。
添加Beanshell Sampler進行使用該變量:
將Response_data的變量信息打印至日誌;
將Label打印至日誌;
定義該Sampler的響應狀態碼以及響應信息。
爲直觀,添加一個Debug Sampler查看變量讀取狀況:
響應的隨機數爲56
在上方的Beanshell Sampler定義的Response Code和message。
Debug Sampler的變量讀取是正確的。
日誌面板中打印出的Response data以及Label名稱。
固然邏輯判斷和引入外部jar包在有必要的狀況下依然是支持的。
一個將數據寫入文件的小Demo:
判斷目錄下有沒有該文件(此處默認爲/bin目錄下),若是存在,將其刪除掉,建立新的文件
Dummy Sampler自定義寫入request和response信息。(涉及函數__UUID、__iterationNum)
將該響應信息中id、name、password提取出來,定義爲新的變量。
將提取出來的數據寫入該文件中。
OK,我已經運行過一遍了,看看寫入數據是否成功。
個人/bin目錄下是生成了該文件,打開數據是否寫入:
能夠看到是寫入成功了。
Setup Group Thread中作建立文件和數據寫入工做。
bzm - Concurrency Thread Group----------該線程組大體就是一個測試setup線程組中的數據過程。
該線程組下進行以參數化的方式讀取生成的文件:
OK,Beanshell幾乎用於處理複雜業務邏輯,例如生成隨機手機號碼、隨機身份證號、加密、解密等業務。其靈活之處更在於能夠實例化外部java文件。