調試JMETER腳本的5種方法
如果你曾經設計過JMeter腳本,我敢打賭你至少有一次弄清楚Json Extractor無法正常工作的原因。你猜怎麽著?我去過那兒!
你知道為什麽最好的JMeter Performance Engineers幾乎總能找到問題的解決方案嗎?他們掌握了JMeter腳本調試。
這就是為什麽我已編制了最好的JMeter的調試實踐成huge single post
覆蓋:
- 如何使用Debug Sampler(並充分利用它),
- 利用查看結果樹秘密功能:Regex Tester,Json Path Tester和Regex Tester(並且永遠不會失敗變量關聯),
- 如何使用Dummy Sampler生成虛假請求來嘗試(不需要點擊真正的服務器!),
- 以及許多其他提示,例如如何查看JMeter日誌。
讓我們更詳細地看一下它們。
調試組件
掌握非常具體的JMeter組件是正確調試JMeter腳本執行並解決問題的關鍵。
查看結果樹
“ 查看結果樹”組件可能是最重要的組件。可以通過右鍵單擊菜單將其添加到JMeter腳本中:Add > Listener > View Results Tree
。而且有一個原因是它是最重要的傾聽者!
它允許查看大量信息,如:
- 播放請求:JMeter發送的請求,
- 收到服務器響應:遠程服務器發送的響應,
- 並測試Regexps,Json Paths,XPath表達式等。
你可能要使用正則表達式提取器,
正則表達式測試程序有點隱藏!Dropdown menu
在“ 查看結果樹”面板中,可以從正在播放的請求的右側訪問它。它允許您在服務器響應上嘗試各種正則表達式並顯示結果。
它比以下更有效:
- 修改現有的Regex Extractor,
- 然後重新運行整個腳本只是為了找出提取器不能正常工作。
而且你知道最好的嗎?它還提供測試可用的幾乎每一個可變抽取像JsonPath Tester
。
在上面的示例中,我正在嘗試使用JsonPath 提取第一個電話號碼類型$.phoneNumbers[:1].type
iPhone
示例文檔中的值:
{
"firstName": "John",
"lastName" : "doe",
"age" : 26,
"phoneNumbers": [
{
"type" : "iPhone",
"number": "0123-4567-8888"
},
{
"type" : "home",
"number": "0123-4567-8910"
}
]
}
這實際上與JsonPath Evaluator上的示例相同。需要測試邊界提取器?沒問題:有一個Boundary Extractor Tester
。
在上面的例子中,我正在使用Boundary Extractor Tester。我正在嘗試使用左邊界和右邊界提取電話號碼類型。而且效果出奇的好!"type"
,
Match count: 2
Match[1]= : "iPhone"
Match[2]= : "home"
現在我有了工作邊界,我可以在該請求上設置相應的邊界提取器來提取我想要的內容。
我不打算廣泛涵蓋所有可能的測試人員,但只是讓你知道它們:
- Xpath測試器:針對XML響應測試XPath表達式,
- CSS / JQuery Tester:在響應上測試CSS JQuery選擇器,
- HTML,JSON,XML響應解析器。
它甚至支持在Browser
從下拉列表中選擇時在嵌入式Web瀏覽器中呈現響應。
調試采樣器
在調試采樣是將在JMeter的找到最有用的采樣。如果您以前從未使用過它,我強烈建議您嘗試一下!
在調試采樣器可以通過JMeter的很容易地添加右鍵菜單:Add > Sampler > Debug Sampler
。它具有以下設置:
- JMeter屬性:設置
true
為打印JMeter屬性, - JMeter變量:設置為
true
打印JMeter變量${foo}
(到目前為止在腳本中設置的所有變量), - 系統屬性:設置為
true
打印Java系統屬性。
您最有可能啟用JMeter變量輸出,因為它是迄今為止最有用的輸出。那麽,這個采樣器可以用於什麽?打印有關每次執行的有用信息。通常,您想知道變量提取器(如Regex Extractor)是否正常工作。
與“ 查看結果樹”結合使用時,它可以創造奇跡!
上面的示例顯示了Debug Sampler在配置為基本打印所有內容時打印的輸出。看起來像:
JMeterVariables:
JMeterThread.last_sample_ok=true
JMeterThread.pack=org.apache.jmeter.threads.SamplePackage@10702a2
START.HMS=141352
START.MS=1525349632611
START.YMD=20180503
TESTSTART.MS=1525354461536
__jm__Thread Group__idx=0
__jmeter.USER_TOKEN__=Thread Group 1-1
phoneNumber=iPhone
JMeterProperties:
HTTPResponse.parsers=htmlParser wmlParser cssParser
...
在這裏我們可以看到named變量phoneNumber
具有值iPhone
。
JMeter日誌查看器
單擊頂部菜單可激活JMeter Logs查看器Options > Log Viewer
。需要禁用它嗎?重復相同的操作。JMeter在日誌中輸出大量信息。
該日誌查看器出現在右面板的底部。它顯示所有最近的JMeter日誌。日誌如下所示:
2018-05-03 15:34:21,768 INFO o.a.j.t.ThreadGroup: Started thread group number 1
2018-05-03 15:34:21,768 INFO o.a.j.e.StandardJMeterEngine: All thread groups have been started
2018-05-03 15:34:21,769 INFO o.a.j.t.JMeterThread: Thread started: Thread Group 1-1
2018-05-03 15:34:23,310 INFO o.a.j.t.JMeterThread: Thread is done: Thread Group 1-1
2018-05-03 15:34:23,310 INFO o.a.j.t.JMeterThread: Thread finished: Thread Group 1-1
2018-05-03 15:34:23,311 INFO o.a.j.e.StandardJMeterEngine: Notifying test listeners of end of test
2018-05-03 15:34:23,311 INFO o.a.j.g.u.JMeterMenuBar: setRunning(false, *local*)
跟蹤ERROR
日誌特別有用。這些日誌通常在未正確配置某些內容時發生。出於這個原因,我強烈建議在調試腳本時始終關註日誌。
每次都必須打開日誌查看器可能會很煩人。有一個解決方法:
- 打開
JMETER_HOME/bin/jmeter.properties
, - 查找開頭的行
#jmeter.loggerpanel.display
, - 用線替換它
jmeter.loggerpanel.display=true
。
可以為每個采樣器調整調試輸出:
- 選擇要調試的采樣器,
- 點擊頂部菜單
Options > Enable Debug
, - 您應該在JMeter Log Viewer中看到類似的內容:
2018-05-03 16:45:40,500 INFO o.a.j.g.a.What: Log level set to DEBUG for org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy
在這種情況下,我在Http Request
采樣器上啟用了調試日誌。但是,它尚未完成:默認情況下,JMeter僅顯示INFO
級別日誌。這意味著DEBUG
必須啟用日誌。
選擇菜單Options > Log Level > DEBUG
。現在,您應該能夠DEBUG
在日誌查看器中查看日誌。
以下是DEBUG
日誌輸出示例:
2018-05-03 16:46:25,245 DEBUG o.a.j.p.h.s.MeasuringConnectionManager: Connection manager is shutting down
2018-05-03 16:46:25,245 DEBUG o.a.j.p.h.s.JMeterClientConnectionOperator$JMeterDefaultClientConnection: Connection 0.0.0.0:45070<->54.221.212.171:443 closed
2018-05-03 16:46:25,245 DEBUG o.a.j.p.h.s.JMeterClientConnectionOperator$JMeterDefaultClientConnection: Connection 0.0.0.0:45070<->54.221.212.171:443 closed
2018-05-03 16:46:25,245 DEBUG o.a.j.p.h.s.MeasuringConnectionManager: Connection manager shut down
2018-05-03 16:46:25,245 DEBUG o.a.j.p.h.s.MeasuringConnectionManager: Connection manager is shutting down
2018-05-03 16:46:25,245 DEBUG o.a.j.p.h.s.MeasuringConnectionManager: Connection manager shut down
此輸出由HTTP請求采樣器生成。
虛擬采樣器
該虛擬采樣是一個功能強大的采樣器:它可以產生你想要的內容虛假的結果。您可能已經註意到我已經在本教程中多次使用過它。
Dummy Sampler默認沒有集成到JMeter中:它是JMeter插件的一部分。我們編寫了一份指南,解釋了如何安裝JMeter插件:它解釋了插件如何工作以及如何安裝它們。
當您需要生成具有特定內容的服務器響應時,虛擬采樣器非常有用。當測試的應用程序內容不斷變化時,有時可能會很困難。
現在讓我們看看調試任何JMeter問題的最終方法(假設你有一些編程技巧)
調試JVM
如您所知,JMeter是一個Java程序:您可以使用Eclipse或Intellij IDEA等IDE遠程調試它們:
- 打開命令行並運行
cd JMETER_HOME
,(JMETER_HOME
安裝JMeter的位置) -
設置
JVM_ARGS
啟動JMeter之前的設置:- 在Mac或Linux上:
export JVM_ARGS=-agentlib:jdwp=transport=dt_socket,server=y,address=8000
- 在Windows上:
set JVM_ARGS=-agentlib:jdwp=transport=dt_socket,server=y,address=8000
- 如果端口
8000
不可用,請更改為其他值, -
使用命令啟動JMeter:
- 在Mac或Linux上:
./bin/jmeter
, - 在Windows上:
bin\jmeter.bat
。
- 在Mac或Linux上:
-
您應該看到
Listening for transport dt_socket at address: 8000
在JMeter啟動期間打印的行。在IDE中啟動遠程調試啟動程序之前,JMeter可能無法啟動, -
在Intellij中使用與上面相同的端口創建遠程啟動器(在我們的例子中),
8000
- 最後,啟動遠程調試。
您應該看到JMeter啟動和JMeter的JVM線程出現在IDE調試面板中。
提琴手代理
當您需要調試無法正常運行的HTTP腳本時,還有另一個選項:Fiddler Proxy。Fiddler是一個免費的Web調試代理:您可以記錄瀏覽器和Internet之間的任何HTTP流量。
Fiddler默認在端口8888上運行
我們如何使用Fiddler來調試JMeter腳本?通過在HTTP請求上設置Fiddler代理。默認情況下,Fiddler localhost
使用端口在主機名上運行8888
。
配置JMeter以使用Fiddler代理的最簡單方法是通過命令行:JMETER_HOME/bin/jmeter -H 127.0.0.1 -P 8888
。這樣,任何執行的HTTP請求都將通過代理。您將在Fiddler中看到JMeter發送的請求。
當您懷疑在JMeter中看到的內容不是正在發送的內容時,這非常有用。當JMeter中存在Bug時,可能會發生這種情況。
最後的話
正如我們所看到的,有許多不同的調試策略。選擇正確的選項取決於您所面臨的問題:
- 查看結果樹:當您需要測試變量提取器,在響應中搜索動態值時,效果最佳,
- Debug Sampler:在測試運行期間需要查看變量值時很有用,
- JMeter日誌:當您的腳本因未知原因而失敗時,日誌可能有助於查找JMeter未正確執行的原因(特別是在面向Out Of Memory時)
- 虛擬采樣器:最適合您需要模擬請求/響應並針對它們運行前處理器或後處理器。當應用程序響應不斷變化時特別有用,
- JVM調試和Fiddler代理調試:遇到一些奇怪的JMeter行為?您可能遇到過JMeter Bug。在這種情況下,您可能需要逐步調試JMeter以找出出錯的地方。
調試JMETER腳本的5種方法