JSR是Java Specification Requests的縮寫,意思是Java規范提案。JSR已成為Java界的一個重要標准.
JSR223 控件允許執行 JSR223 腳本代碼用於創建/更新所需的某些變量。
JSR223 取樣器 +groovy 腳本可大大提高性能的功能(編譯),同時支持更多的腳本語言,其中包括 BeanShell 腳本,但是BeanShell 腳本編譯效率更高。所以在編寫腳本時不建議使用 BeanShell 取樣器。
使用JSR223組件首先要選擇腳本語言。
JSR223定義了可集成在Java平台上運行的一系列腳本語言。比如Groovy,JavaScript等.用的最多的是Groovy。Groovy 語法與Java 語言的語法很相似,Groovy 和 Java 語言的主要區別是:完成同樣的任務所需的 Groovy 代碼比 Java 代碼更少。
以下jsr233 preprocessor為例:
名詞解釋:
名稱:顯示的此取樣器的描述性名稱,可自定義
語言:要使用的JSR223腳本代碼語言的類型。本例我們選擇groovy。
參數:要傳遞到腳本文件或腳本的參數列表。多個參數以“;”分隔。
腳本文件:用於執行的腳本文件,若沒有腳本文件,將覆蓋腳本。
腳本:傳遞給JSR223執行的腳本,編寫代碼。
查看jmeter變量信息:
點擊右上角三角按鈕。調用logview窗口,來查看變量信息。
1、log
用法:寫入日志文件。在編寫測試計划腳本時進行調試非常有用。
日志有3個級別:info、warn和error。根據需要可以使用相應級別的日志。
注意:有錯誤級別的日志時,右上角的三角形狀態將增加1。
2、OUT
用法:在控制台中打印消息。與log的區別是顯示消息的位置不一樣。
注意:在groovy語句下,也可不寫OUT,只用println方法也可打印信息顯示在控制台。
3、vars
3.1 提供read(get)/write(put)方法去訪問變量。
變量包括:用戶自定義、Regex提取器提取、JSON提取器從響應數據中提取等。
讀方法:vars.get(“VARIABLE_NAME”);
寫方法:vars.put(“VARIABLE_NAME”,“VALUE”);
寫入后,可以訪問role_id。
3.2 提供對象、數組的訪問。
方法:vars.getObject(“OBJECT_NAME”);
vars.putObject(“OBJECT_NAME”, OBJECT_NAME);
例子:jsr1:定義一個函數作為對象:
jsr2:調用函數對象:
4、props
用法:與vars相同,但用於JMeter屬性。vars僅作用於當前線程。props作用於多線程。
方法:props.get(“PROPERTIES_NAME”);
props.put(“PROPERTIES_NAME”, PROPERTIES_NAME);
例子:讀取線程中屬性值。
讀取屬性值用法如下。當然,也可以采用函數${_setProperty(newprops,new_props)}方法來實現下面的語句。
屬性列表查看:
設置完屬性后,可用__P()或者__property()函數來訪問。
引用的屬性值:
props是Hastable的子類,因此我們可以使用put來存儲Object、List、Map等。我們可以在一個線程組中創建一個函數,使用props.put()方法存儲,然后在另一個線程組中使用props.get()調用它。(注意區分,vars使用的調用其他方法函數是vars.getObject()和vars.putObject())。
5、SampleResult
用法:SampleResult幫助獲取/設置運行后樣本的值,例如:ResponseCode、ResponseMessage、StartTime、SampleLabel等。
注意:如果腳本中直接使用SampleResult類型,需要先導入 org.apache.jmeter.samplers.SampleResult類。
方法:主要包括get和put方法:
SampleResult.getSampleLabel();
SampleResult.getStartTime();
SampleResult.getResponseCode()
SampleResult.getResponseMessage()
SampleResult.getPreviousResult() ·返回值:SampleResult,即取樣器結果.作用:獲取前一個取樣器的結果
6、prev
用法:prev是內置對象,與SampleResult的作用相同,SampleResult中的所有方法都可以通過prev.來調用。運行后可以獲取/設置樣本的幾乎所有信息。jmeter默認會初始化SampleResult類。
prev對象可以直接引用SampleResult類中的方法,不需要導入。
即下面兩段代碼效果一致。
import org.apache.jmeter.samplers.SampleResult; // 獲取取樣器結果 SampleResult result = ctx.getPreviousResult(); // 獲取請求頭 String RequestHeaders =result.getRequestHeaders();
// 獲取請求頭
String RequestHeaders =prev.getRequestHeaders();
方法get:
prev.getTime()
prev.getThreadName()
prev.getBytesAsLong()
prev.getURL()//獲取url對象,轉換成字符串需要prev.getUrlAsString();
prev.isSuccessful()
prev.getRequestHeaders() //獲取請求頭信息,String
prev.getResponseHeaders()//獲取返回信息頭,String
prev.getResponseCode() //獲取請求返回的code,string
prev.getResponseMessage() //獲取響應信息,String
prev.getResponseDataAsString()//獲取返回數據並轉換為String字符串
prev.getResponseData()//獲取返回數據並保存為字節數組對象.
注意:prev.getResponseDataAsString()與prev.getResponseData()都是獲取Response Body的內容,只是返回的數據類型不同,prev.getResponseDataAsString()返回String字符串,prev.getResponseData()返回byte[]字節數組,使用時可根據實際需要對返回數據進行處理。
方法set:
與get方法相同,我們可以訪問采樣器的所有信息並根據需要設置值。
prev.setResponseCode();//設置返回代碼
prev.setResponseMessage();//設置返回信息
prev.setSampleLable();//設置樣品標簽
prev.setSuccessful();//設置相應是否成功
7、sampler
用法:允許訪問當前采樣器。這意味着我們可以在運行之前獲取/設置采樣器的一些信息,例如:域、路徑、端口、協議、方法
方法:get/set方法。
8、ctx
用法:助於訪問上下文。使用ctx我們可以獲得一些信息,比如SampleResult或prev,但是它的級別更高。ctx 映射為 org.apache.jmeter.threads 的 JMeterContext 類 。由於JMeterContext 不具有線程安全性,故僅適用於在單線程中使用 。
方法:
getPreviousResult()//獲取前一個取樣器結果
舉例:
// 獲取取樣器結果,返回累心為SampleResult SampleResult result = ctx.getPreviousResult(); // 獲取請求頭 String RequestHeaders = result.getRequestHeaders(); // 獲取響應頭 String ResponseHeaders = result.getResponseHeaders(); // 獲取響應碼 String responseCode = result.getResponseCode(); // 獲取響應數據 String responseData = result.getResponseDataAsString();
getVariables()//獲取JMeter當前線程的所有變量.
getProperties()//獲取所有的JMeter屬性
getCurrentSampler()//獲取當前取樣器對象
getPreviousSampler()//獲取前一個取樣器對象
9、parameters
用法:要傳遞給腳本文件或腳本的參數列表。您可以使用以下預定義變量訪問在JSR223采樣器/后預處理器中輸入的值。
parameters:返回在參數字段中定義的所有值。
args:返回參數數組。
args.length:返回參數字段中值的數目。
args[n]: ith n=0,1,2…返回相應位置的值。注意:多個值必須用空格隔開。
一般來說,Get請求用Parameters,Post請求用Body Data。