调试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而且有一个原因是它是最重要的倾听者

查看结果树

它允许查看大量信息,如:

你可能要使用正则表达式提取器JsonPath抽吸器甚至CSS JQuery的提取器从响应中提取的变量我不会撒谎:他们很少第一次工作

JMeter Regex Tester

正则表达式测试程序有点隐藏!Dropdown menu在“ 查看结果树”面板中可以从正在播放的请求右侧访问它它允许您在服务器响应上尝试各种正则表达式并显示结果。

比以下更有效

  • 修改现有的Regex Extractor
  • 然后重新运行整个脚本只是为了找出提取器不能正常工作。

而且你知道最好的吗?它还提供测试可用的几乎每一个可变抽取JsonPath Tester

JMeter JsonPath测试仪

在上面的示例中,我正在尝试使用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

JMeter边界测试仪

在上面的例子中,我正在使用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日志查看器

单击顶部菜单可激活JMeter Logs查看器Options > Log Viewer需要禁用它吗?重复相同的操作。JMeter在日志中输出大量信息。

JMeter日志查看器UI

日志查看器出现在右面板的底部。它显示所有最近的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必须启用日志。

JMeter日志级别

选择菜单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请求采样器生成

虚拟采样器

虚拟采样是一个功能强大的采样器:它可以产生你想要的内容虚假的结果。您可能已经注意到已经在本教程中多次使用过它

JMeter Dummy Sampler

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

Intellij远程调试

  • 最后,启动远程调试。

JMeter远程调试

JMeter远程调试

您应该看到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以找出出错的地方。
posted @ 2019-02-16 17:15  DaisyLinux  阅读(2510)  评论(0编辑  收藏  举报