1. 程式人生 > >調試JMETER腳本的5種方法

調試JMETER腳本的5種方法

regexp prop attribute _id docs lis expr 分享圖片 listener

如果你曾經設計過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發送的請求,
  • 收到服務器響應:遠程服務器發送的響應,
  • 並測試RegexpsJson PathsXPath表達式等。

你可能要使用正則表達式提取器

JsonPath抽吸器甚至CSS JQuery的提取器從響應中提取的變量我不會撒謊:他們很少第一次工作

技術分享圖片

正則表達式測試程序有點隱藏!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選擇器,
  • HTMLJSONXML響應解析器。

它甚至支持在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程序:您可以使用EclipseIntellij IDEAIDE遠程調試它們

  • 打開命令行並運行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
  • 您應該看到Listening for transport dt_socket at address: 8000在JMeter啟動期間打印的行在IDE中啟動遠程調試啟動程序之前,JMeter可能無法啟動

  • Intellij中使用與上面相同的端口創建遠程啟動器在我們的例子中),8000

技術分享圖片

  • 最後,啟動遠程調試。

技術分享圖片

技術分享圖片

您應該看到JMeter啟動和JMeter的JVM線程出現在IDE調試面板中。

提琴手代理

技術分享圖片

當您需要調試無法正常運行的HTTP腳本時,還有另一個選項:Fiddler ProxyFiddler是一個免費的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種方法