listeners 介绍
侦听器是显示样本结果的组件。结果可以显示在树、表格、图表中,或者简单地写入日志文件。要查看来自任何给定采样器的响应内容,请将侦听器查看结果树
或查看表中的结果
添加到测试计划中。要以图形方式查看响应时间,请添加图形结果。组件页面的 侦听器 部分包含所有侦听器的完整描述。
不同的侦听器以不同的方式显示响应信息。但是,它们都将相同的原始数据写入输出文件 - 如果指定了一个。
配置
按钮可用于指定将哪些字段写入文件,以及将其写入为 CSV 还是 XML。CSV 文件比 XML 文件小得多,因此如果你要生成大量样本,请使用 CSV。
可以使用相对路径名或绝对路径名来指定文件名。相对路径是相对于当前工作目录(默认为 bin/目录)解析的。JMeter 还支持相对于包含当前测试计划(JMX 文件)的目录的路径。如果路径名以~/
开头(或 jmeter.save.saveservice.base_prefix
JMeter 属性中的任何内容),则假定该路径是相对于 JMX 文件位置的。
如果你只想录制某些样本,请将 Listener 添加为 sampler 的子项。或者,你可以使用简单控制器对一组采样器进行分组,并将监听器添加到其中。多个采样器可以使用相同的文件名 - 但请确保它们都使用相同的配置!
12.1 默认配置
要保存的默认项目可以在 jmeter.properties
(或 user.properties
)文件中定义。这些属性用作 Listener Config 弹出窗口的初始设置,也用于-l 命令行标志指定的日志文件(通常用于 CLI 模式测试运行)。
要更改默认格式,请在 jmeter.properties 中找到以下行:
jmeter.save.saveservice.output_format=
要保存的信息是可配置的。有关最大信息,请选择xml
作为格式并在测试计划元素上指定功能测试模式
。如果未选中此框,则默认保存的数据包括时间戳(自 UTC 1970 年 1 月 1 日午夜以来的毫秒数)、数据类型、线程名称、标签、响应时间、消息和代码,和成功指标。如果选中,将记录所有信息,包括完整的响应数据。
以下示例说明如何设置属性以获取竖线 (" | ") 分隔格式,该格式将输出如下结果:。
timeStamp|time|label|responseCode|threadName|dataType|success|failureMessage
02/06/03 08:21:42|1187|Home|200|Thread Group-1|text|true|
02/06/03 08:21:42|47|Login|200|Thread Group-1|text|false|Test Failed:
expected to contain: password etc.
对应的需要设置的 jmeter.properties 如下图所示。此示例中的一个奇怪之处是 output_format 设置为 csv,这通常表示逗号分隔的值。但是,default_delimiter 被设置为竖线而不是逗号,因此 csv 标记在这种情况下是用词不当。(将 CSV 视为字符分隔值)
jmeter.save.saveservice.output_format=csv
jmeter.save.saveservice.assertion_results_failure_message=true
jmeter.save.saveservice.default_delimiter=|
影响结果文件输出的完整属性集如下所示。
#---------------------------------------------------------------------------
# Results file configuration
#---------------------------------------------------------------------------
# This section helps determine how result data will be saved.
# The commented out values are the defaults.
# legitimate values: xml, csv, db. Only xml and csv are currently supported.
#jmeter.save.saveservice.output_format=csv
# true when field should be saved; false otherwise
# assertion_results_failure_message only affects CSV output
#jmeter.save.saveservice.assertion_results_failure_message=true
#
# legitimate values: none, first, all
#jmeter.save.saveservice.assertion_results=none
#
#jmeter.save.saveservice.data_type=true
#jmeter.save.saveservice.label=true
#jmeter.save.saveservice.response_code=true
# response_data is not currently supported for CSV output
#jmeter.save.saveservice.response_data=false
# Save ResponseData for failed samples
#jmeter.save.saveservice.response_data.on_error=false
#jmeter.save.saveservice.response_message=true
#jmeter.save.saveservice.successful=true
#jmeter.save.saveservice.thread_name=true
#jmeter.save.saveservice.time=true
#jmeter.save.saveservice.subresults=true
#jmeter.save.saveservice.assertions=true
#jmeter.save.saveservice.latency=true
#jmeter.save.saveservice.connect_time=true
#jmeter.save.saveservice.samplerData=false
#jmeter.save.saveservice.responseHeaders=false
#jmeter.save.saveservice.requestHeaders=false
#jmeter.save.saveservice.encoding=false
#jmeter.save.saveservice.bytes=true
#jmeter.save.saveservice.sent_bytes=true
#jmeter.save.saveservice.url=false
#jmeter.save.saveservice.filename=false
#jmeter.save.saveservice.hostname=false
#jmeter.save.saveservice.thread_counts=true
#jmeter.save.saveservice.sample_count=false
#jmeter.save.saveservice.idle_time=true
# Timestamp format - this only affects CSV output files
# legitimate values: none, ms, or a format suitable for SimpleDateFormat
#jmeter.save.saveservice.timestamp_format=ms
#jmeter.save.saveservice.timestamp_format=yyyy/MM/dd HH:mm:ss.SSS
# For use with Comma-separated value (CSV) files or other formats
# where the fields' values are separated by specified delimiters.
# Default:
#jmeter.save.saveservice.default_delimiter=,
# For TAB, since JMeter 2.3 one can use:
#jmeter.save.saveservice.default_delimiter=\t
# Only applies to CSV format files:
# Print field names as first line in CSV
#jmeter.save.saveservice.print_field_names=true
# Optional list of JMeter variable names whose values are to be saved in the result data files.
# Use commas to separate the names. For example:
#sample_variables=SESSION_ID,REFERENCE
# N.B. The current implementation saves the values in XML as attributes,
# so the names must be valid XML names.
# JMeter sends the variable to all servers
# to ensure that the correct data is available at the client.
# Optional xml processing instruction for line 2 of the file:
#jmeter.save.saveservice.xml_pi=<?xml-stylesheet type="text/xsl" href="sample.xsl"?>
# Prefix used to identify filenames that are relative to the current base
#jmeter.save.saveservice.base_prefix=~/
# AutoFlush on each line written in XML or CSV output
# Setting this to true will result in less test results data loss in case of Crash
# but with impact on performances, particularly for intensive tests (low or no pauses)
# Since JMeter 2.10, this is false by default
#jmeter.save.saveservice.autoflush=false
# Put the start time stamp in logs instead of the end
sampleresult.timestamp.start=true
# Whether to use System.nanoTime() - otherwise only use System.currentTimeMillis()
#sampleresult.useNanoTime=true
# Use a background thread to calculate the nanoTime offset
# Set this to ≤ 0 to disable the background thread
#sampleresult.nanoThreadSleep=5000
用于 timestamp_format 的日期格式在 SimpleDateFormat 中描述。时间戳格式用于写入和读取文件。如果格式设置为ms
,并且该列不解析为长整数,JMeter (2.9+) 将尝试以下格式:
- yyyy/MM/dd HH:mm:ss.SSS
- 年年/月/日 HH:mm:ss
- yyyy-MM-dd HH:mm:ss.SSS
- yyyy-MM-dd HH:mm:ss
- MM/dd/yy HH:mm:ss(这是为了兼容以前的版本;不推荐作为格式)
匹配现在也很严格(非宽松)。JMeter 2.8 及更早版本使用宽松模式,这可能会导致时间戳的日期不正确(时间通常是正确的)。
12.1.1 示例变量
JMeter 支持 sample_variables 属性来定义附加 JMeter 变量的列表,这些变量将与 JTL 文件中的每个样本一起保存。这些值作为附加列写入 CSV 文件,并作为 XML 文件中的附加属性。请参见上面的示例。
12.1.2 样本结果保存配置
通过使用如下所示的配置弹出窗口,可以配置侦听器以将不同的项目保存到结果日志文件 (JTL)。默认值的定义如上面的 侦听器默认配置 部分所述。名称后带(CSV)的项目仅适用于 CSV 格式;带有 (XML) 的项目仅适用于 XML 格式。CSV 格式目前不能用于保存任何包含换行符的项目。
配置对话框
请注意,cookie、方法和查询字符串保存为Sampler Data
选项的一部分。
12.2 CLI 模式(批处理)测试运行
在 CLI 模式下运行时,-l 标志可用于为测试运行创建顶级侦听器。这是对测试计划中定义的任何侦听器的补充。此侦听器的配置由文件 jmeter.properties 中的条目控制,如上一节所述。
此功能可用于为每次测试运行指定不同的数据和日志文件,例如:
jmeter -n -t testplan.jmx -l testplan_01.jtl -j testplan_01.log
jmeter -n -t testplan.jmx -l testplan_02.jtl -j testplan_02.log
请注意,默认情况下,JMeter 日志记录消息将写入文件 jmeter.log。每次都会重新创建此文件,因此如果要保留每次运行的日志文件,则需要使用上面的-j 选项对其进行重命名。
JMeter 支持日志文件名中的变量。如果文件名包含成对的单引号,则将名称处理为应用于当前日期的 SimpleDateFormat 格式,例如: log_file='jmeter\_'yyyyMMddHHmmss'.tmp'
。这可用于为每个测试运行生成一个唯一名称。
12.3 资源使用
如果有很多样本,侦听器可以使用大量内存。
大多数听众目前保留他们展示的每个样本的副本,除了:
- 简单数据写入器
- BeanShell/JSR223 监听器
- 邮件可视化器
- 监控结果
- 总结报告
以下侦听器不再需要保留每个样本的副本。相反,具有相同经过时间的样本会被聚合。现在需要更少的内存,特别是如果大多数样本最多只需要一两秒钟。
- 汇总报告
- 聚合图
要最小化所需的内存量,请使用简单数据写入器,并使用 CSV 格式。
12.4 CSV 日志格式
CSV 日志格式取决于在配置中选择了哪些数据项。只有指定的数据项记录在文件中。列的出现顺序是固定的,如下:
- timeStamp - 自 1970 年 1 月 1 日以来的毫秒数
- elapsed - 以毫秒为单位
- label - 采样器标签
- responseCode - 例如 200 , 404
- responseMessage - 例如确定
- threadName
- dataType - 例如文本
- success -真或假
- failureMessage - 如果有的话
- bytes - 样本中的字节数
- sentBytes - 为样本发送的字节数
- grpThreads - 此线程组中的活动线程数
- allThreads - 所有组中的活动线程总数
- URL
- Filename - 如果使用了将响应保存到文件
- latency - 首次响应的时间
- connect - 建立连接的时间
- encoding
- SampleCount - 样本数(1,除非聚合多个样本)
- ErrorCount - 错误数(0 或 1,除非聚合了多个样本)
- Hostname - 生成样本的位置
- IdleTime -
空闲
时间的毫秒数(通常为 0) - Variables,如果指定
12.5 XML 日志格式 2.1
更新后的 XML(2.1)格式如下(换行会有所不同):
<?xml version="1.0" encoding="UTF-8"?>
<testResults version="1.2">
-- HTTP Sample, with nested samples
<httpSample t="1392" lt="351" ts="1144371014619" s="true"
lb="HTTP Request" rc="200" rm="OK"
tn="Listen 1-1" dt="text" de="iso-8859-1" by="12407">
<httpSample t="170" lt="170" ts="1144371015471" s="true"
lb="http://www.apache.org/style/style.css" rc="200" rm="OK"
tn="Listen 1-1" dt="text" de="ISO-8859-1" by="1002">
<responseHeader class="java.lang.String">HTTP/1.1 200 OK
Date: Fri, 07 Apr 2006 00:50:14 GMT
⋮
Content-Type: text/css
</responseHeader>
<requestHeader class="java.lang.String">MyHeader: MyValue</requestHeader>
<responseData class="java.lang.String">body, td, th {
font-size: 95%;
font-family: Arial, Geneva, Helvetica, sans-serif;
color: black;
background-color: white;
}
⋮
</responseData>
<cookies class="java.lang.String"></cookies>
<method class="java.lang.String">GET</method>
<queryString class="java.lang.String"></queryString>
<url>http://www.apache.org/style/style.css</url>
</httpSample>
<httpSample t="200" lt="180" ts="1144371015641" s="true"
lb="http://www.apache.org/images/asf_logo_wide.gif"
rc="200" rm="OK" tn="Listen 1-1" dt="bin" de="ISO-8859-1" by="5866">
<responseHeader class="java.lang.String">HTTP/1.1 200 OK
Date: Fri, 07 Apr 2006 00:50:14 GMT
⋮
Content-Type: image/gif
</responseHeader>
<requestHeader class="java.lang.String">MyHeader: MyValue</requestHeader>
<responseData class="java.lang.String">http://www.apache.org/asf.gif</responseData>
<responseFile class="java.lang.String">Mixed1</responseFile>
<cookies class="java.lang.String"></cookies>
<method class="java.lang.String">GET</method>
<queryString class="java.lang.String"></queryString>
<url>http://www.apache.org/asf.gif</url>
</httpSample>
<responseHeader class="java.lang.String">HTTP/1.1 200 OK
Date: Fri, 07 Apr 2006 00:50:13 GMT
⋮
Content-Type: text/html; charset=ISO-8859-1
</responseHeader>
<requestHeader class="java.lang.String">MyHeader: MyValue</requestHeader>
<responseData class="java.lang.String"><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
⋮
<html>
<head>
⋮
</head>
<body>
⋮
</body>
</html>
</responseData>
<cookies class="java.lang.String"></cookies>
<method class="java.lang.String">GET</method>
<queryString class="java.lang.String"></queryString>
<url>http://www.apache.org/</url>
</httpSample>
-- non HTTP Sample
<sample t="0" lt="0" ts="1144372616082" s="true" lb="Example Sampler"
rc="200" rm="OK" tn="Listen 1-1" dt="text" de="ISO-8859-1" by="10">
<responseHeader class="java.lang.String"></responseHeader>
<requestHeader class="java.lang.String"></requestHeader>
<responseData class="java.lang.String">Listen 1-1</responseData>
<responseFile class="java.lang.String">Mixed2.unknown</responseFile>
<samplerData class="java.lang.String">ssssss</samplerData>
</sample>
</testResults>
请注意,示例节点名称可能是sample
或httpSample
。
12.6 XML 日志格式 2.2
JTL 文件的格式对于 2.2 和 2.1 是相同的。格式 2.2 仅影响 JMX 文件。
12.7 样本属性
示例属性具有以下含义:
属性 | 内容 |
---|---|
by | 字节 |
sby | 发送字节 |
de | 数据编码 |
dt | 数据类型 |
ec | 错误计数(0 或 1,除非聚合多个样本) |
hn | 生成样本的主机名 |
it | 空闲时间 = 不采样的时间(毫秒)(一般为 0) |
lb | 标签 |
lt | 延迟 = 初始响应时间(毫秒) - 并非所有采样器都支持这一点 |
ct | 连接时间 = 建立连接的时间(毫秒) - 并非所有采样器都支持这一点 |
na | 所有线程组的活动线程数 |
ng | 该组中的活动线程数 |
rc | 响应代码(例如 200) |
rm | 响应消息(例如 OK) |
s | 成功标志(真/假) |
sc | 样本计数(1,除非聚合多个样本) |
t | 经过时间(毫秒) |
tn | 线程名称 |
ts | timeStamp(自 UTC 时间 1970 年 1 月 1 日午夜以来的毫秒数) |
varname | 命名变量的值 |
JMeter 允许将其他变量与测试计划一起保存。目前,变量被保存为附加属性。测试计划变量名称用作属性名称。有关详细信息,请参阅 示例变量 (上)。
12.8 保存响应数据
如上所示,如果需要,可以将响应数据保存在 XML 日志文件中。但是,这会使文件变得相当大,并且必须对文本进行编码以使其仍然是有效的 XML。此外,不能包含图像。只能保存 TEXT 类型的示例响应。
另一种解决方案是使用后处理器 Save_Responses_to_a_file 。这会为每个样本生成一个新文件,并将文件名与样本一起保存。然后可以将文件名包含在示例日志输出中。重新加载示例日志文件时,如有必要,将从文件中检索数据。
12.9 加载(读取)响应数据
要查看现有结果文件,你可以使用文件Browse...
按钮选择文件。如有必要,只需创建一个包含适当侦听器的虚拟测试计划。
结果可以从 XML 或 CSV 格式文件中读取。从 CSV 结果文件中读取时,标题(如果存在)用于确定保存了哪些字段。 为了正确解释无标题的 CSV 文件,必须设置适当的 JMeter 属性。
JMeter 在加载新文件之前不会清除任何当前数据,从而允许合并文件。如果要清除当前数据,请在加载文件之前使用菜单项:
Run → Clear (Ctrl + Shift + E)
或Run → Clear All (Ctrl + E)
12.10 保存监听器 GUI 数据
JMeter 能够将任何监听器保存为 PNG 文件。为此,请在左侧面板中选择侦听器。单击 Edit → Save Node As Image。将出现一个文件对话框。输入所需的名称并保存侦听器。
生成输出为表格的监听器也可以使用复制/粘贴来保存。在表格中选择所需的单元格,然后使用 OS Copy 快捷方式(通常为 Ctrl + C
)。数据将被保存到剪贴板,从那里可以将其粘贴到另一个应用程序中,例如电子表格或文本编辑器。
图 1 编辑 → 将节点另存为图像