- 翻譯來(lái)自Samplers
18.1 采樣器
HTTP Request
HTTP采樣器可以向web服務(wù)器發(fā)送http/https請(qǐng)求勺远,并且可以控制jmeter是否解析圖像和其他嵌入資源的html文件,并發(fā)送http請(qǐng)求來(lái)檢索它們时鸵。HTTP采樣器檢索以下類(lèi)型的嵌入資源:
- 圖像
- 小程序
- 樣式表(css)和從這些文件引用的資源
- 外部腳本
- frames,iframes
- 背景圖像(正文胶逢、表格、TD饰潜、TR)
- 背景聲音
默認(rèn)解析器是org.apache.jmeter.protocol.http.parser.lagartobasedhmlparser初坠,可以通過(guò)屬性htmlparser.className進(jìn)行更改。
如果要向同一個(gè)web服務(wù)器發(fā)送多個(gè)請(qǐng)求彭雾,最好使用http請(qǐng)求默認(rèn)配置元素碟刺,這樣就不必為每個(gè)http請(qǐng)求輸入相同的信息。
或者薯酝,使用jmeter的HTTP Request Defaults來(lái)幫助我們快速創(chuàng)建帶有參數(shù)的http請(qǐng)求半沽。
有兩種不同的測(cè)試元素用于定義采樣器:
AJP/1.3 Sampler
HTTP請(qǐng)求
<font color=#A52A2A>Java請(qǐng)求</font>
<font color=#A52A2A>HTTPClient4</font>
Java HTTP實(shí)現(xiàn)有一些局限性:
- 無(wú)法控制如何重連。當(dāng)jmeter釋放連接時(shí)吴菠,它可能被同一個(gè)線程重用者填,也可能不被同一個(gè)線程重用。
- API最適合單線程使用-通過(guò)系統(tǒng)屬性定義各種設(shè)置做葵,因此適用于所有連接占哟。
- 不支持kerberos身份驗(yàn)證
- 它不支持使用密鑰庫(kù)配置進(jìn)行基于客戶端的證書(shū)測(cè)試。
- 更好地控制重試機(jī)制
- 不支持虛擬機(jī)
- 它只支持以下方法蜂挪,get重挑、post、head棠涮、options、put刺覆、delete和trace严肪。
- 使用dns緩存管理器更好地控制dns緩存。
如果請(qǐng)求需要服務(wù)器或代理登錄授權(quán),則還必須添加http authorization manager配置元素驳糯。對(duì)于正常登錄(即用戶在表單中輸入登錄信息)篇梭,需要使用適當(dāng)?shù)姆椒ǎㄍǔJ莗ost)和表單定義中的適當(dāng)參數(shù)創(chuàng)建http請(qǐng)求。如果頁(yè)面使用http酝枢,則可以使用jmeter代理來(lái)捕獲登錄序列恬偷。
每個(gè)線程使用單獨(dú)的SSL上下文。如果要使用單個(gè)SSL上下文(不是瀏覽器的標(biāo)準(zhǔn)行為)帘睦,請(qǐng)?jiān)O(shè)置jmeter屬性:
https.sessioncontext.shared=true
自5.0版以來(lái)袍患,默認(rèn)情況下,SSL上下文在線程組迭代期間保留竣付,并為每個(gè)測(cè)試迭代重置诡延。如果在測(cè)試計(jì)劃中,同一個(gè)用戶重復(fù)多次古胆,那么應(yīng)該將其設(shè)置為false肆良。這個(gè)配置不適用于Java的HTTP實(shí)現(xiàn)。
httpclient.reset_state_on_thread_group_iteration=true
jmeter默認(rèn)為SSL協(xié)議級(jí)別TLS逸绎。如果服務(wù)器需要不同的級(jí)別惹恃,例如SSLv3,請(qǐng)更改jmeter屬性棺牧,例如:
https.default.protocol=SSLv3
jmeter還允許通過(guò)更改屬性https.socket.protocols啟用其他協(xié)議巫糙。
如果請(qǐng)求使用cookies,那么還需要一個(gè)http cookie管理器陨帆,可以將這些元素添加到線程組或http請(qǐng)求中曲秉。如果有多個(gè)需要授權(quán)或cookie的http請(qǐng)求,請(qǐng)將元素添加到線程組疲牵。這樣承二,所有http請(qǐng)求控制器都將共享相同的授權(quán)管理器和cookie管理器元素。
如果請(qǐng)求使用名為“url重寫(xiě)”的技術(shù)來(lái)維護(hù)會(huì)話纲爸,可能還需要使用其他配置 6.1 Handling User Sessions With URL Rewriting
Java Request
這個(gè)采樣器允許我們使用自定義Java類(lèi)控制多個(gè)線程亥鸠、輸入?yún)?shù)和數(shù)據(jù)收集,首先該類(lèi)必須實(shí)現(xiàn)org.apache.jmeter.protocol.java.sampler.javasamplerclient接口识啦。
如果方法teardownTest沒(méi)有被AbstractJavaSamplerClient的子類(lèi)重寫(xiě)负蚊,則不會(huì)調(diào)用teardownTest方法。這樣做是為了減少了JMeter內(nèi)存需求颓哮,但并不會(huì)對(duì)現(xiàn)有的測(cè)試計(jì)劃產(chǎn)生任何影響家妆。
Add/Delete按鈕目前沒(méi)有任何作用。
- Parameters
Attribute | Description | Required |
---|---|---|
Name | 采樣器名稱 | NO |
Classname | 需要采樣的JavaSamplerClient接口的具體實(shí)現(xiàn)類(lèi) | YES |
Send Parameters with Request | 采樣類(lèi)的參數(shù)列表冕茅。所有參數(shù)都作為字符串發(fā)送伤极。具體設(shè)置見(jiàn)下文蛹找。 | NO |
以下參數(shù)適用于SleepTest和JavaTest實(shí)現(xiàn):
- Parameters
Attribute | Description | Required |
---|---|---|
Sleep_time | 休眠時(shí)間 | YES |
Sleep_mask | 總的休眠時(shí)間計(jì)算如下:totalSleepTime = SleepTime + (System.currentTimeMillis() % SleepMask) | YES |
此外,JavaTest的實(shí)現(xiàn)還用到以下參數(shù):
- Parameters
Attribute | Description | Required |
---|---|---|
Label | 如果使用該屬性哨坪,則會(huì)自動(dòng)替換Name屬性 | NO |
ResponseCode | 該屬性用于設(shè)置SampleResult的響應(yīng)碼 | NO |
ResponseMessage | 該屬性用于設(shè)置SampleResult的響應(yīng)正文 | NO |
Status | 用于設(shè)置SampleResult的狀態(tài)庸疾,如果該項(xiàng)設(shè)為“OK”(忽略大小寫(xiě)),則認(rèn)為該Sample成功当编,否則失敗 | NO |
SamplerData | 設(shè)置SampleResult的SamplerData | NO |
ResultData | 設(shè)置SampleResult的ResultData | NO |
JSR223 Sampler
JSR223采樣器允許使用JSR223腳本代碼執(zhí)行創(chuàng)建或更新變量所需的采樣器或某些計(jì)算届慈。
如果不希望在運(yùn)行此采樣器時(shí)生成采樣器結(jié)果(Sample Result),需要調(diào)用以下方法:
sampleResult.setIgnore();
JSR223有一個(gè)可以顯著提高性能的特性忿偷,受益于該特性:
- JSR223采用Script files的方式而不是代碼嵌入金顿,這樣JMeter可以編譯并緩存腳本;
- 或者使用Script Text+檢查屬性Cache compiled script if available的方式牵舱。
1.使用此功能時(shí)串绩,需要保證腳本代碼不會(huì)直接使用JMeter變量,而是使用腳本參數(shù)芜壁,因?yàn)榫彺嬷粫?huì)緩存第一個(gè)替換項(xiàng)礁凡。
2.為了從緩存和編譯中獲益,用于腳本編寫(xiě)的語(yǔ)言引擎必須實(shí)現(xiàn)JSR223可編譯接口(Groovy支持此功能慧妄,java顷牌、beanshell和javascript都不支持)。
3.當(dāng)使用Groovy作為腳本語(yǔ)言并且不檢查Cache compiled script if available屬性(建議使用緩存)時(shí)塞淹,應(yīng)添加一條JVM屬性-Dgroovy.use.classvalue=true窟蓝,如果不這樣設(shè)置,2.4.6版以后的Groovy有可能內(nèi)存泄漏饱普,請(qǐng)參閱:
如下的JMeter屬性可以控制緩存大性舜臁:
jsr223.compiled_scripts_cache_size=100
在腳本引擎支持的情況下,JSR223測(cè)試元素使用Script files或Script Text+檢查Cache compiled script if available屬性的方式都會(huì)被編譯套耕,這將使性能得到極大的增強(qiáng)谁帕。
JMeter在將腳本字段傳遞給解釋器之前處理函數(shù)和變量引用,因此這些引用只解析一次冯袍。腳本文件中的變量和函數(shù)引用將逐字傳遞給解釋器匈挖,可能會(huì)導(dǎo)致語(yǔ)法錯(cuò)誤。因此康愤,為了使用運(yùn)行時(shí)變量儡循,請(qǐng)使用適當(dāng)?shù)膒rops方法,例如征冷。
props.get("START.HMS");
props.put("PROP1","1234");
- Parameters
Attribute | Description | Required |
---|---|---|
Name | 采樣器名字 | NO |
Scripting Language | 使用的JSR223腳本語(yǔ)言的名稱择膝,這是一個(gè)下拉框。 | YES |
Script File | JSR223腳本的文件名检激,如果使用相對(duì)文件路徑调榄,則它將相對(duì)于“user.dir”系統(tǒng)屬性引用的目錄踊赠。 | NO |
Parameters | 傳給腳本文件或腳本的參數(shù)列表呵扛。 | NO |
Cache compiled script if available | 如果選中該屬性(推薦選中)每庆,并且所使用的語(yǔ)言支持可編譯接口(Groovy支持,java今穿、beanshell和java script不支持)缤灵,JMeter將編譯腳本并使用其md5散列作為唯一的緩存鍵來(lái)緩存它。 | NO |
Script | 腳本名蓝晒,與Script File二者必須有一個(gè)存在 | YES |
如果提供了Script File腮出,則將使用該文件,否則將使用Script芝薇。
在調(diào)用腳本之前胚嘲,會(huì)設(shè)置一些JSR223變量,它們可以直接在腳本中使用洛二。
- log - Logger
- Label - the Sampler label
- FileName
- Parameters
- args - 參數(shù)馋劈,如上所述
- SampleResult - 指針指向當(dāng)前的SampleResult
- sampler - (Sampler)指針指向當(dāng)前的Sampler
- ctx - JMeterContext
- vars - JMeterVariables,例如:
vars.get("VAR1");
vars.put("VAR2","value");
vars.remove("VAR3");
vars.putObject("OBJ1",new Object());
- props - JMeterProperties (class java.util.Properties)晾嘶,例如:
props.get("START.HMS");
props.put("PROP1","1234");
- OUT - System.out妓雾,例如:
OUT.println("message")
SampleResult的ResponseData是從腳本的返回值里設(shè)置的。如果腳本返回null垒迂,則可以使用SampleResult.setResponseData(data)方法直接設(shè)置響應(yīng)械姻,其中的數(shù)據(jù)可以是字符串或字節(jié)數(shù)組。數(shù)據(jù)類(lèi)型默認(rèn)為“文本”机断,但也可以使用方法SampleResult.setDataType(sampleResult.binary)將其設(shè)置為二進(jìn)制楷拳。
SampleResult變量使腳本可以完全訪問(wèn)SampleResult中的所有字段和方法。例如吏奸,腳本可以訪問(wèn)方法setStopThread(boolean)和setStopTest(boolean)欢揖。
與BeanShell采樣器不同,JSR223采樣器不通過(guò)腳本變量設(shè)置ResponseCode苦丁、ResponseMessage和sample的狀態(tài)浸颓。目前改變這些變量的唯一方法是通過(guò)SampleResult方法:
- SampleResult.setSuccessful(true/false)
- SampleResult.setResponseCode("code")
- SampleResult.setResponseMessage("message")