关于监听器

在JMeter中,监听器(Listeners)是用来收集和展示采样器(Samplers)产生的结果数据的元件。它们可以显示测试过程中的响应时间、吞吐量、错误率等信息。JMeter监听器包括:

  • 查看结果树(View Results Tree)

  • 汇总报告(Summary Report)

  • 聚合报告(Aggregate Report)

  • 后端监听器(Backend Listener)

  • JSR223 监听器(JSR223 Listener)

  • 保存响应到文件(Save Responses to a file)

  • 响应时间图(Response Time Graph)

  • 图形结果(Graph Results)

  • 断言结果(Assertion Results)

  • 比较断言可视化器(Comparison Assertion Visualizer)

  • 汇总图(Aggregate Graph)

  • 生成概要结果(Generate Summary Results)

  • 用表格查看结果(View Results in Table)

  • 简单数据写入器(Simple Data Writer)

  • 邮件观察仪(Mailer Visualizer)

  • BeanShell 监听器(BeanShell Listener)

其实最常用的监听器就是查看结果树、聚合报告、JSR223 监听器,其他监听器特定情况也会用就是了。

使用示例脚本,需下载示例接口源码并运行。

查看结果树

该元件显示请求的取样器结果、请求信息、响应信息,可以通过查看结果树中的内容,检查脚本是否有问题,比如IP、端口或者请求数据。还可以检查,响应数据是否正常,常用于接口测试及验证脚本。

进行性能测试时,它在过程中会消耗大量资源,尽量不要使用。

结果列表

绿色代表请求成功,红色代表请求失败(断言未通过也算失败)。

取样器结果

  • Thread Name: 执行请求的线程名称,这里是线程组 1-1,表示这是属于线程组1的第1个线程。

  • Sample Start: 请求开始的时间,格式为年-月-日 时:分:秒,这里是2024-06-14 16:17:12 CST

  • Load time: 请求的加载时间,包括建立连接、发送请求、接收响应的总时间,这里是2毫秒。

  • Connect Time: 建立到服务器的连接所需的时间,这里是1毫秒。

  • Latency: 服务器延迟时间,即从发送请求到接收到第一个字节响应的时间,这里是2毫秒。注意这里的延迟时间与连接时间相等,可能是因为这个值已经包含了连接时间。

  • Size in bytes: 响应的总字节数,这里是192字节。

  • Sent bytes: 发送到服务器的请求的字节数,这里是265字节。

  • Headers size in bytes: 响应头的大小,这里是173字节。

  • Body size in bytes: 响应体的大小,这里是19字节。

  • Sample Count: 在这个监听器中捕获的样本数量,这里是1。

  • Error Count: 遇到的错误数量,这里是0,表示请求成功。

  • Data type: 响应数据的类型,这里标记为text,表示响应是文本类型。

  • Response code: HTTP响应状态码,200表示请求成功。

  • Response message: HTTP响应消息,OK表示请求被成功处理。

  • HTTPSampleResult fields:
    ContentType: 响应的MIME类型和字符编码,这里是text/html; charset=utf-8,表示响应是HTML文本,使用UTF-8编码
    DataEncoding: 响应数据的编码,这里也是utf-8

请求数据

  • Connection: 表示客户端与服务器的连接方式,这里是长连接。

  • Content-Length: 表示请求体的长度是15个字节。

  • Content-Type: 表示请求体的类型是application/x-www-form-urlencoded,并且使用UTF-8字符编码。

  • Host: 指定了请求的目标服务器地址和端口号,这里是本地主机的5000端口。

  • User-Agent: 表示发送请求的客户端软件和版本,这里是Apache HttpClient库,运行在Java环境中。

  • POST http://127.0.0.1:5000/api/QuickUse/: 表示请求方式、URL(包括协议、主机、端口和请求的路径)。

  • POST data:显示请求体中的数据。

  • [no cookies]: 这表示请求中没有携带任何Cookie。

响应数据

  • HTTP/1.1 200 OK: 这表示使用的是HTTP协议版本1.1,并且请求成功,状态码200表示服务器成功处理了请求并返回了所请求的资源。

  • Server: 这里表明服务器使用的是Werkzeug服务器软件,版本为3.0.1,运行在Python环境下,Python的版本为3.12.3。

  • Date: 表示响应的日期和时间,使用GMT(格林尼治标准时间)。

  • Content-Type: 这里表示响应的内容类型是HTML,字符编码是UTF-8。

  • Content-Length: 表示响应体的字节长度是19字节。

  • Connection: close 表示服务器在发送完响应后将关闭连接。这与 Connection: keep-alive 相反,后者表示连接可以保持开启状态以用于发送多个请求。

  • 请求方式非 GET: 这就是响应体数据。

所有数据写入一个文件

建议不要保存文件到C盘,除非以管理员身份运行Jmeter。另外还可以配置日志内容,就请读者自己探究吧。

这个功能有连个作用:

  • 配置运行结果保存到那个文件

  • 通过浏览-打开文件,可以读取文件的数据,在对应的监听器中显示数据。

所有监听器的所有数据写入一个文件,都是同种作用。

查找&&结果显示方式

可以通过查找快速定位请求,支持正则表达式。查找的结果用红色框包裹。

我自己标记的绿色框,可以选择结果显示方式。还是请读者自己去探究吧。


汇总报告

可以查看事务或者取样器在某个时间范围内执行的汇总结果,一个取样器或事务占一行。数据包括样本(请求量)、平均值、最小值、最大值、标准偏差、异常%(错误请求)、吞吐量、接受KB/sec、发送KB/sec、平均字节数。

  • Lable:每个请求的名称。每个 JMeter 的 element(例如 HTTP Request)都有一个 Name 属性,这里显示的就是 Name 属性的值。

  • 样本(Samples):取样器请求的数量。

  • 平均值(Average):请求(事务)的平均响应时间。

  • 最小值(Min):请求的最小响应时间。

  • 最大值(Max):请求的最大响应时间。

  • 标准偏差(Std.Dev): 响应时间的标准方差。

  • 异常 %(Error):请求的错误率 = 错误请求的数量/请求的总数。

  • 吞吐量(Throughput):默认情况下表示每秒完成的请求数,一般认为它为TPS。( 注意单位的变化,如上图中,当TPS很低时,jmeter中默认会统计成每分钟的值,这时我们需要换算成以秒为单位)。当使用了 Transaction Controller 时,也可以表示类似 LoadRunner 的 Transaction per Second 数。

  • 接收 KB/sec(Received KB/sec):每秒接收的千字节数。

  • 发送 KB/sec(Sent KB/sec):每秒发送的千字节数。

  • 平均字节数(Avg.Bytes):取样结果返回的平均大小。

还可以保存数据到文件及保存表格数据。


聚合报告

聚合报告与汇总报告类似,较于汇总报告更占用主机资源。数据包括样本(请求量)、平均值、中位数、90%百分位、95%百分位、99%百分位、最小值、最大值、异常%(错误请求)、吞吐量、接受KB/sec、发送KB/sec。

  • Label:Label:每个请求的名称。每个 JMeter 的 element(例如 HTTP Request)都有一个 Name 属性,这里显示的就是 Name 属性的值

  • 样本(Samples):各请求发出的数量。表示你这次测试中一共发出了多少个请求,如果模拟10个用户,每个用户迭代10次,那么这里显示100

  • 平均值(Average:平均响应时间(单位:毫秒)。默认是单个Request的平均响应时间,当使用了Transaction Controller时,也可以以Transaction为单位显示平均响应时间。值 = 总运行时间 / 发送到服务器的总请求数

  • 中位数(Median):50%用户的响应时间在小于该值,注意它与average平均响应时间的区别

  • 90%百分位:90%用户的响应时间小于该值,90%line是性能测试中比较重要的一个衡量指标。

  • 95%百分位:95%用户的响应时间小于该值

  • 99%百分位:99%用户的响应时间小于该值

  • 最小值(Min):请求的最小响应时间

  • 最大值(Max):请求的最大响应时间

  • 异常 %(Error):请求的错误率 = 错误请求的数量/请求的总数

  • 吞吐量(Throughput):默认情况下表示每秒完成的请求数,一般认为它为TPS。(注意单位的变化,如上图中,当TPS很低时,jmeter中默认会统计成每分钟的值,这时我们需要换算成以秒为单位)。当使用了 Transaction Controller 时,也可以表示类似 LoadRunner 的 Transaction per Second 数

  • 接收 KB/sec(Received KB/sec):每秒接收的千字节数

  • 发送 KB/sec(Sent KB/sec):每秒发送的千字节数

还可以保存数据到文件及保存表格数据。另外可以访问百分位数了解概念。


后端监听器

在Apache JMeter中,后端监听器(Backend Listener)是用于将测试结果实时发送到外部数据存储或监控系统的一种组件。它常用于将性能测试结果发送到外部系统,如Grafana、InfluxDB、ElasticSearch等数据库,以便实时监控和分析性能测试的结果。

在“后端监听器”组件中,选择“Backend Listener Implementation”(后端监听器实现)类型。常见的实现有: org.apache.jmeter.visualizers.backend.influxdb.InfluxdbBackendListenerClient:发送数据到InfluxDB。 org.apache.jmeter.visualizers.backend.graphite.GraphiteBackendListenerClient:发送数据到Graphite。

根据选择的实现类型,填写相应的配置信息,如数据库URL、用户名、密码等。

比如配置InfluxDB后端监听器:

  • 选择InfluxdbBackendListenerClient作为实现类。

  • influxdbMetricsSender: 默认值就行。

  • influxdbUrl: InfluxDB的URL,例如http://localhost:8086/write?db=jmeter。

  • application: 应用名称,用于区分不同的应用或测试。

  • measurement: 数据表名。

  • summaryOnly: 是否只发送汇总数据,默认false。

  • samplersRegex: 正则表达式,用于匹配要发送的采样器名称,默认是“.*”表示所有采样器。

  • percentiles: 需要记录的百分位数,默认是90,95,99。

  • 启动InfluxDB和Grafana(如果使用这些工具):

  • 确保InfluxDB和Grafana已启动并配置正确。

  • 在InfluxDB中创建一个数据库,用于存储JMeter发送的数据。

  • 在Grafana中配置一个数据源,指向InfluxDB数据库,并创建仪表盘用于展示数据。

  • 运行JMeter测试:

  • 启动JMeter测试计划。

  • 在Grafana或其他监控工具中查看实时性能测试结果,分析系统的性能表现。

可以访问github开源JMeter后端监听器了解并使用更多方便、强大的后端监听器方案。


JSR223 监听器

它允许用户通过自定义脚本来处理采样器的结果数据,使用的主要目的是数据存储、实时监控和报警。JSR223监听器支持多种脚本语言,如Groovy、JavaScript、BeanShell等,提供了很大的灵活性来执行复杂的数据处理和结果分析任务。

示例

  • 选择脚本语言Groovy

  • 在“脚本”区域中,编写脚本代码。

    import org.apache.jmeter.samplers.SampleResult
    import java.nio.file.Files
    import java.nio.file.Paths
    import java.nio.file.StandardOpenOption
    
    // 获取当前采样器的结果
    SampleResult sampleResult = prev
    
    // 获取采样器名称
    String samplerName = sampleResult.getSampleLabel()
    
    // 获取响应时间
    long responseTime = sampleResult.getTime()
    
    // 获取响应数据
    String responseData = sampleResult.getResponseDataAsString()
    
    // 获取响应状态
    boolean success = sampleResult.isSuccessful()
    
    // 构造日志信息
    String logMessage = "Sampler: ${samplerName}, Response Time: ${responseTime}ms, Success: ${success}, Response Data: ${responseData}\n"
    
    // 定义日志文件路径
    String logFilePath = "D:\logfile.log"
    
    // 将日志信息写入文件
    Files.write(Paths.get(logFilePath), logMessage.getBytes(), StandardOpenOption.CREATE, StandardOpenOption.APPEND)
    
    Groovy

输出的logfile.log文件

当然你也可以在脚本中将结果数据传递到数据库或其他服务系统进行处理,或者直接进行处理。不过这会消耗主机资源,需要做好取舍。


自定义参数

你可以通过参数,其他元件(比如用户定义的变量、Jmeter-CSV Data Set Config、函数等)传递数据给脚本。

  • 参数中输入jiang 1(空格分割,值可以是列表、元组等)

  • 添加用户定义的变量

  • 修改上述脚本

    // 新增获取自定义参数,自定义参数会保存到args变量(列表),
    String name = args[0]
    String number = args[1]
    
    // 构造日志信息,新增name,number, class, random。random是随机函数。
    String logMessage = "Sampler: ${samplerName}, Response Time: ${responseTime}ms, Success: ${success}, Response Data: ${responseData}, name: ${name}, number: ${number}, class: ${class}, random: ${__Random(111111,222222,)}\n"
    
    Groovy

输出的logfile.log文件

name,number, class, random的值都被输出到logfile.log文件中了。

脚本文件(覆盖脚本)

符合字面意思,引用脚本文件会覆盖脚本内容。

  • 把示例脚本内容添加到空白的test.groovy文件中

  • 引用test.groovy`

  • 删除logfile.log文件

输出的logfile.log文件

name,number, class, random的值不再输出,因为执行的是test.groovy脚本。

你也可以通过脚本实现阈值功能,比如错误率达到一定值时,自动停止测试。不过在这里我就不再过多阐述,读者可以自己探究。


保存响应到文件

当结果太大,使用结果树监听器影响图形模式时,我们可以采用响应保存监听器来处理,可以将结果树数据保存到文件。

  • Save Successful Responses only:仅保存成功响应。

  • Save Failed Responses only:仅保存失败响应。

  • Don’t save Transaction Controller SampleResult:不保存事务控制器样本结果。

  • 文件前缀:文件路径 + 文件前缀。

  • Don’t add number to prefix:不添加数字到文件前缀。

  • Don’t add content type suffix:不添加文件的后缀类型。

  • Add timestamp:添加时间戳到文件前缀。

  • Minimum Length of sequence number:设置文件名称最小的序列号;例如4,文件序号为0001…。

示例Jmeter

  • 文件前缀:D:\Results\Results1

  • 线程组线程数:200

  • 请求地址:HTTP://127.0.0.1:5000/GetList/

  • 请求方式:GET

运行后结果

一个请求结果独立一个文件。


响应时间图

响应时间图是一个直方图,其中 X 轴表示时间,Y 轴表示响应时间。

  • 响应时间:就是一个请求从发送到接收到响应的总时间。在图中,每个数据点的Y坐标表示请求响应时间。

  • 时间:测试计划运行的持续时间。在图中,每个数据点的X坐标表示请求开始的时间。

  • 分布:数据点在图中的分布,可以分析出响应时间的变化。如果数据点在一条线附近,那么响应时间可能比较稳定。如果数据点在图中的分布比较广,那么响应时间可能有比较大的波动。

  • 趋势:我们也可以通过响应时间图来观察响应时间的趋势。例如,如果数据点从左至右逐渐上升,那么可能表明随着时间的推移,响应时间在增加。

其余参数

时间间隔关系X轴的显示。其它参数都是改变显示方式,如字体。读者可自行探究。


断言结果

文本显示所有请求名称,如果断言失败,名称下方显示失败原因,成功则不显示。消耗资源较多,且我认为意义不大。


比较断言可视化器

显示请求断言情况,若断言失败,标红。但无法给出断言信息。


汇总图

较于汇总报告,多了柱形图功能。列可显示平均值、中位数、90%百分位、95%百分位、99%百分位、最小值、最大值


生成概要结果

生成概要结果没有配置参数。生成结果需要在Jmeter日志或者Jmeter-cmd窗口查看。

  • in:TPS,每秒取样器执行的数量。

  • Avg:平均值。平均响应时间,所有请求的平均响应时间,单位是毫秒。

  • Min:最小值。请求的最小响应时间。

  • Max:最大值。请求的最大响应时间。

  • Err:异常百分比。(错误请求的数量/请求的总数)。


用表格查看结果

查看结果树不同,此元件将结果写进表格中,可查看数据也不同。不过都能查看各个请求结果状态。

  • Sample#:请求序号。

  • Start Time:请求开始时间。

  • Thread Name:线程名称。

  • Label:请求的名称(实际请求中可使用参数化对每个请求做区分)。

  • Sample Time(ms):请求的响应时间。

  • Status:请求状态,为勾则表示成功,为叉表示失败。

  • Bytes:响应的字节数及请求的字节数。

  • Sent Bytes:发送的字节数。

  • Latency:延迟时间(单位:毫秒)。

  • Connect Time(ms):连接服务器的时间。(单位:毫秒)。

  • 样本数目:所有的请求个数。

  • 平均:所有请求的平均响应时间。(单位:毫秒)。

  • 最新样本:最新样本响应时间,表示服务器响应最后一个请求的时间。(单位:毫秒)。

  • 偏离:不知道怎么算的,不发表意见。


简单数据写入器

使用该元件,需要在所有数据写入一个文件配置文件路径(建议保存到D盘)。运行后,数据就会保存到文件中。然后可以使用查看结果树、聚合报告、图形结果等查看数据。


邮件观察仪

主要是做提示用。可以自定义请求成功或失败的次数阈值,触发后就会自动发送邮件。

需要配置发送人、收件人以及SMTP server。

  • From:发件人邮箱。

  • Addressee(s):收件人邮箱。

  • Success Subject:成功的请求数达到阈值后,要发送的信息。

  • Failure Subject:失败的请求数达到阈值后,要发送的信息。

  • Success Limit:成功的请求数阈值。如果不想发送,可以将值设未极大,如10000000。

  • Failure Limit:失败的请求数阈值。如果不想发送,可以将值设未极大,如10000000。

  • Host:SMTP服务器的域名或IP。

  • Port:SMTP服务器的端口号。

  • Login:发件人邮箱账号,一般为发件人邮箱。

  • Password:发件人的授权密码。

    163邮箱为例,在设置中获取:

  • Commection security:连接协议。一般都是SSl,以SMTP服务器指定协议为准。

收件人收到的邮件


BeanShell 监听器

BeanShell 监听器类似JSR223 监听器。只不过BeanShell 监听器只可以使用BeanShell语言。

如果会使用JSR223 监听器,那么BeanShell 监听器也没问题。本质上都是编写脚本。


图形结果

这个可以不用了解,消耗资源多且生成的图表质量不高。



© 转载需要保留原始链接,未经明确许可,禁止商业使用。CC BY-NC-ND 4.0