调试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表达式等。
你可能要使用正则表达式提取器,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选择器,
- 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种方法的更多相关文章
- 执行shell脚本的几种方法及区别
执行shell脚本的几种方法及区别 http://blog.csdn.net/lanxinju/article/details/6032368 (认真看) 注意:如果涉及到脚本之间的调用一定要用 . ...
- 在WebBrowser中执行javascript脚本的几种方法整理(execScript/InvokeScript/NavigateScript) 附完整源码
[实例简介] 涵盖了几种常用的 webBrowser执行javascript的方法,详见示例截图以及代码 [实例截图] [核心代码] execScript方式: 1 2 3 4 5 6 7 8 9 1 ...
- 「python」: arp脚本的两种方法
「python」: arp脚本的两种方法 第一种是使用arping工具: #!/usr/bin/env python import subprocess import sys import re de ...
- Eclipse远程调试Java代码的三种方法
Eclipse远程调试Java代码的三种方法, 第1种方法是用来调试已经启动的Java程序,Eclipse可以随时连接到远程Java程序进行调试, 第2种方法可以调试Java程序启动过程,但是Ecli ...
- Jmeter参数化的4种方法
用Jmeter测试时包含两种情况的参数,一种是在url中,一种是请求中需要发送的参数. URL中的参数,如:http://blog.da-fang.com/index.php/2010/06/01/j ...
- 提升jmeter脚本编写效率的方法:Fiddler导出jmx文件
有效提升编写JMeter脚本效率的方法 jmeter的脚本来源有以下几种:badboy录制.jmeter自带的录制功能.手动编写脚本(使用fiddler/wireshark来抓包,然后构造协议写脚本) ...
- 痞子衡嵌入式:大话双核i.MXRT1170之在线联合调试双核工程的三种方法(IAR篇)
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是i.MXRT1170下在线联合调试双核工程的方法(基于IAR). 前段时间痞子衡写过一篇<双核i.MXRT1170之单独在线调试从 ...
- Linux中执行shell脚本的4种方法总结
bash shell 脚本的方法有多种,现在作个小结.假设我们编写好的shell脚本的文件名为hello.sh,文件位置在/data/shell目录中并已有执行权限. 方法一:切换到shell脚本所在 ...
- Linux中执行shell脚本的4种方法
bash shell 脚本的方法有多种,现在作个小结.假设我们编写好的shell脚本的文件名为hello.sh,文件位置在/data/shell目录中并已有执行权限. 方法一:切换到shell脚本所在 ...
随机推荐
- 第k大区间(平均数)--LH
老师自己出的题,由于没有评测的地方, 我就只说做法啦.(其实是懒得写)(逃ヽ(゚∀゚*)ノ━━━ゥ♪ 以下是个人的见解,如果错了告诉我哦⊙0⊙? 最近特别喜欢用画图写字,,☆⌒(*^-゜)v!
- iOS中使用NSInvocation
在iOS中可以使用NSInvocation进行动态调用方法. /* NSInvocation is much slower than objc_msgSend()... Do not use it i ...
- oracle rac的特征
oracle rac的特征 1. spfile 参数文件需要被所有节点访问,需要放在共享存储上. 2. Redo ThreadRAC 环境下有多个实例,每个实例都需要有自己的一套Redo log 文件 ...
- [转]各种开源协议介绍 BSD、Apache Licence、GPL V2 、GPL V3 、LGPL、MIT
现今存在的开源协议很多,而经过Open Source Initiative组织通过批准的开源协议目前有58种(http://www.opensource.org/licenses /alphabeti ...
- jQuery做出手风琴效果
今天学到JQuery中的遍历-siblings,便手痒做了个手风琴的动态效果,有一点收获,分享给大家.mouseout的时候一定要记得opacity必须设置,不然li的opacity会保持mousem ...
- 【转】 Pro Android学习笔记(三一):Menu(2):扩展、图片、子菜单
目录(?)[-] 菜单扩展 菜单项加入图片 子菜单 菜单扩展 如果菜单项很多,超过六个时,就会采用菜单扩展模式.在例子中我加入了10个菜单项,预计能进入菜单扩展模式,但是实际效果如右图所示.效果和li ...
- 图像滤波与OpenCV中的图像平滑处理
.About图像滤波 频率:可以这样理解图像频率,图像中灰度的分布构成一幅图像的纹理.图像的不同本质上是灰度分布规律的不同.但是诸如"蓝色天空"样的图像有着大面积近似的灰度强度,而 ...
- 安装yum在ubnutu上
安装yum在ubnutu上1:首先检测是否安装了build-essential程序包 apt-get install build-essential2.安装yumapt-get install yum ...
- Flask07 Jinja2模板测试器、控制语句IF/FOR、变量/块 赋值、作用域、块级作用域
1 测试器及其使用 在模板中的 {{}} 可以书写测试器,格式如下 {{ 变量 is 测试器名称 }} 1.1 在python中导入 Jinja2 的模板 from jinja2 import te ...
- Git 客户端在 WebIDE 中的实现
Coding WebIDE 是 Coding.net 自主研发的在线集成开发环境 (IDE).你可以通过 WebIDE 创建项目的工作空间, 进行在线开发, 调试等操作,有功能健全的 Terminal ...