有關Beanshell和JSR223組件的部分,早就想寫一大篇幅隨筆進行記錄,苦於不知如何去描述這兩部分的內容,一直在修改隨筆。
介紹一下Beanshell:
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以及它們所能實現的功能吧!
首先,Beanshell和JSR223組件是涉及代碼部分的組件,至於用途,能量所在來進行一一記載:
Beanshell和JSR223幾乎在Jmeter的每部分都有涉及到:
1、Sampler
2、PreProcessor
3、PostProcessor
4、Timers
5、Assertions
6、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文件。