Jmeter工具使用

  1. Jmeter介绍

Apache JMeter 是 Apache 组织基于 Java 开发的压力测试工具,用于对软件做压力测试;
开源的桌面应用软件;
可用于测试静态和动态资源,如静态文件、Java 小服务程序、CGI 脚本、Java 对象、数据库和 FTP 服务器等等;
可对服务器、网络或对象模拟巨大的负载,在不同压力类别下测试它们的强度和分析整体性能;
能够对应用程序做功能/回归测试;
允许使用正则表达式创建断言,通过创建带有断言的脚本来验证程序是否返回了期望结果;

Jmeter使用

Jmeter主要元件

1、测试计划:是使用 JMeter 进行测试的起点,它是其它 JMeter测试元件的容器

2、线程组:代表一定数量的用户,它可以用来模拟用户并发发送请求。实际的请求内容在Sampler中定义,它被线程组包含。

3、配置元件:维护Sampler需要的配置信息,并根据实际的需要修改请求的内容。

4、前置处理器:负责在请求之前工作,常用来修改请求的设置

5、定时器:负责定义请求之间的延迟间隔。

6、取样器(Sampler):是性能测试中向服务器发送请求,记录响应信息、响应时间的最小单元,如:HTTP Request Sampler、FTP Request Sample、TCP Request Sample、JDBC Request Sampler等,每一种不同类型的sampler 可以根据设置的参数向服务器发出不同类型的请求。

7、后置处理器:负责在请求之后工作,常用获取返回的值。

8、断言:用来判断请求响应的结果是否如用户所期望的。

9、监听器:负责收集测试结果,同时确定结果显示的方式。

10、逻辑控制器:可以自定义JMeter发送请求的行为逻辑,它与Sampler结合使用可以模拟复杂的请求序列。

Jmeter元件的作用域和执行顺序

元件作用域
配置元件:影响其作用范围内的所有元件。
前置处理器:在其作用范围内的每一个sampler元件之前执行
定时器:在其作用范围内的每一个sampler有效
后置处理器:在其作用范围内的每一个sampler元件之后执行。
断言:在其作用范围内的对每一个sampler元件执行后的结果进行校验。
监听器:在其作用范围内对每一个sampler元件的信息收集并呈现。
总结:从各个元件的层次结构判断每个元件的作用域。
元件执行顺序
配置元件->前置处理器->定时器->取样器->后置处理程序->断言->监听器

下面我们先举例一下各组件的作用与用法

线程组

JMeter 的线程组元件是任何一个测试计划的起点,在一个测试计划中的所有元件都必须在某个线程组下,所有的任务都是基于线程组

线程组组成

1.setup thread group(setUp线程组)
一种特殊的 threadGroup ,可用于执行预测试操作;它的行为完全像一个正常的线程组元件,不同的是执行顺序。
它会在普通线程组执行之前被触发。

应用场景: 测试数据库操作功能时,用于执行打开数据库连接的操作

2. teardown thread group(tearDown线程组)
默认情况下,如果测试按预期完成,则TearDown线程组将会运行。如果你不想要运行它,则需要从测试计划界面中取消掉
选中主线运行结束后运行teardown线程组”的复选框。

3.thread group(线程组):

这个就是我们通常添加运行的线程,通俗的讲 一个线程组,可以看做一个虚拟用户组,线程组中的每个线程都可以理解为一个虚拟用户。

路径:测试计划 -> 右键 -> 添加 -> 线程(用户)-> 线程组

thread group介绍

取样器错误后要执行的动作

continue(继续): 取样器发生错误,忽略错误,继续执行接下来的请求,默认选项

Start Next Thread Loop(启动下一进城循环):取样器发生错误,忽略错误 停止当前线程循环,执行下一个循环

Stop Thread(停止线程):当前线程运行完毕后,停止所有线程

Stop Test)停止测试: 停止测试计划,如果一个测试计划下有多个线程组,那么所有线程组都会停止

Stop Test Now(立即停止测试): 整个测试计划会立即停止运行

线程数:模拟用户数,多个线程用于模仿对服务器的并发访问

  1. Jmeter java 进程下启动的线程,用来模拟真实用户数,1线程数 = 1用户数
  2. windows下,2g的 java内存,1m 的栈空间,最大启动线程数=1000
  3. Linux下,2g的 java内存,1m 的栈空间,最大启动线程数=2000
  4. 在Jmeter中,先启动线程,再运行线程,后释放线程【启动线程并运行,释放线程】线程数建议不超过1000

例如,1个线程组里面有10个请求,线程数为10个,跑完脚本后得到:(10个线程数)10个人,每个人都要跑这10个请求,
所以并发数=10*10=100

Ramp-Up时间

  • 设置启动所有线程需要的时间,即线程从启动-运行-释放的总时间,默认为 1 秒
  • 如果 ramp-up 时间内,所有线程不能启动运行完的话,时间则会顺延下去
  • 注意:在负载测试的时候,尽量把 Ramp up 时间设置大一些,让性能曲线平缓,容易找到瓶颈点
  • Ramp-up 需要设置足够长的时间,来避免在测试刚开始时工作量过大;
  • 假如需要大量线程的话,不建议设置成0,0 表示瞬时加压,启动线程的时间无限趋近于 0,
  • 如果设置为 0 ,JMeter 将在测试开始时就启动全部线程并立即发送请求,这样很容易让服务器达到饱满状态,且瞬间会增加很大的负载量,容易让服务器超载,这样是不合理的;不合理的原因并不是因为平均压力值过高,而是因为所有线程都在初始状态时一起并发访问,从而引起不正常的初始访问峰值,不符合正常操作场景,可以通过 Jmeter 的聚合报告看到这种情况;
  • Ramp-up还必须足够短,保证最后一个线程在第一个线程完成之前开始运行;
  • 如果 Ramp-up 过大,则会降低访问峰值的负载,即没有达到预期的压力峰值,无法获取准确的服务器最大负载情况,具体的表现为:后期一些线程还没有启动,初期启动的部分线程已经释放结束了【导致实际并发量会小于预期并发量】

这里说一下如何设置Ramp-up?

  • 首先,让初始点击率接近平均点击率,前提是确定合理的访问量
  • 初始的 ramp-up = 平均点击率= 总线程/点击率;
    假如线程数=100,点击率=10次/s,则 ramp-up = 100/10 = 10s

循环次数

  • 设置线程组中的每个线程循环次数,默认是 1 次
  • 可以理解为线程的迭代次数、重复发起请求的次数,每个线程循环次数

如果勾选永远,那么 jmeter 将以最大的可能去发送请求,以此测试出最大并发数,线程组中的线程永久执行下去,需要手动停止。

image
比如上图:10s 内启动并运行 10 个线程,一共启动 10 个线程,总共发送 20 个请求(10*2),每秒启动一个线程,然后运行2次

Same user on each iteration: 每次迭代使用相同的线程

延迟创建线程直到需要

  • 默认情况下,测试开始的时候,所有线程就被创建完了。勾选此项后,取样器开始执行时才会被创建,避免资源浪费

调度器

线程调度器包含持续时间、启动延迟两个选项,调度器的作用就是控制每个线程组运行的持续时间以及它在多少秒后再启动。
当线程组运行完持续时间后,会逐步释放线程,不会一下子把所有线程释放掉,而释放线程也是需要时间的,所以测试计划总的时间(右上角的时间)会 > 持续时间+启动延迟。

Duration (seconds) :持续时间,线程组运行的持续时间
Startup Delay (seconds):启动延迟,测试计划开始后,线程组的线程将在多少秒后再启动运行

调度器和循环次数的关系:

  • 循环次数有固定值且 ≠ -1,持续时间不会生效,以循环次数为准
  • 循环次数设置为永远或 -1 时,持续时间才会生效

取样器

用于模拟用户请求并收集相应的请求和响应数据。取样器可以发送各种类型的请求,如HTTP请求、FTP请求、数据库请求等。它们模拟了用户的行为并向被测系统发送请求,并将返回的响应数据收集到测试结果中。取样器是JMeter测试计划中最重要的组件之一,用于模拟用户的行为并测量系统的性能和稳定性。常用的就是HTTP请求和Debug Sampler这两个取样器。

  • 访问路径:

  1. 测试计划-添加-线程(用户)-线程组;

  1. 线程组-添加-取样器。

支持协议
  • HTTP Request:HTTP请求
  • Flow control Action:测试活动
  • Debug取样器:Debug sampler
  • JSR223取样器:JsR223 sampler
  • AJP/1.3 sampler : AJP/1.3取样器
  • Access Log取样器:Access Log Sampler
  • Bean Shell取样器:Bean shell sampler
  • FTP Reguest:FTP请求
  • JDBc Request:JDBC Request
  • IMs Publisher:JMS发布
  • JMs Point-to-Point:JMS点到点
  • JMS Subscriber:JMS订阅
  • JUnit Request:JUnit请求:Java请求Java Request
  • LDAP Extended Request :LDAP扩展请求默认值
  • LDAP Request:LDAP请求
  • OS Process sampler :OS进程取样器
  • SMTP Sampler:SMTP取样器
  • TCP Sampler:TCP取样器
  • Mail Reader Sampler :邮件阅读者取样器

说明:
每一种不同类型的sampler可以根据设置的参数向服务器发出不同类型的请求在JMeter的所有Sampler中,Java Request sampler与 Bean she11 sampler 是两种特殊的可定制的Sampler.

总结:
取样器的作用是向服务器发送请求,记录响应信息,记录响应时间,多个取样器按照它们在树中出现的顺序运行。

这里以HTTP请求与Debug Sampler举例说明取样器的用法

HTTP请求

(1)HTTP Request:
名称(Name):取样器名称,也就是需要访问接口的名称。
建议写成请求接口的地址,例如: /1gin 这样在有多个取样器的时候,左侧列表就可以知道该取样器是针对哪个接口的,。
注释(comments):对当前取样器的解释说明。
(2)Web服务器:
协议<Protoco1(nttp)>:向目标服务器发送HTTP请求时的协议,可以是htp或者是https或者Fie ,默认值为http协议(根据需求定)
服务器名称或IP(Server Name or IP):HTTP请求发送目标服务器的域名或!P地址,例如 ww.baidu.com 或者 127.8.8.1端口号(Port Number):所访问服务器中应用所占的端口,默认80端口。
(3)HTTP请求:
1)方法(Method):
发送HTTP请求的请求方式。(可以根据接口文档获得)请求方式包括:GET、POST、HEAD、PUT、OPTIONS、TRACE、DELETE等
2)路径(Path):
目标接口的URL路径(不包括服务器地址和端口)。
也可以直接写完整路径(上面配置的IP+端口就可以省略了),不带参数的api路径

3)内容编码(Content encoding)
请求数据内容的编码方式,默认值为 iso8859 编码,但一般 content encoding 配置为 UTF-8,
来防止中文乱码。

4)自动重定向:
如果选中该选项,当发送HTTP请求后得到的响应是302/301时,JMeter会自动重定向到新的页面,但是JMeter是不记录重定向的过程内容。只能用于GET和HEAD方法,如果是POST或者PUT请求则取样器不会发送。

5)跟随重定问:
Http Request 取样器的默认选项,当响应code是3xx时,自动跳转到目标地址。与自动重定向不同,JMeter会记录重定向过程中的所有请求响应,在查看结果树时可以看到服务器返回的内容,如有多个跳转则多个请求都会被记录下来,此为默认选项。自动重定向和跟随重定向的区别只在于是否记录多个跳转的请求上。
在JMeter默认选中 跟随重定向,但 跟随重定向与 自动重定向 只能二选一
6)使用keep Alive:
当该选项被选中时,JMeter和目标服务器之间使用 Keep-A1ive 方式进行HTTP通信,默认选中。

7)对POST使用multipart/form-data:
使用 multipart/from-data 或 application/x-www-form-urlencoded 方式发送HTTP POST请求,默认不选中

enctype属性说明
application/x-www-fomm-urlencoded默认编码方式,key1=value1&key2=value2.
multipart/form-data普通表单提交,以及表单文件上传。
text/plain以纯文本形式进行编码,其中不含任何控件或格式字符,该方式不常用

8)与浏览器兼容的头(Browser-compatible headers)
当勾选 multipart/form-data 时,勾选此项会截掉HTTP请求头中的 content-Type和 content-Transfer-Encoding,而只发送Content-Disposition 部分。
(4)参数请求:

1)参数(Parameters):
在请求中发送带参数的URL,IMeter提供了一个简单的对参数化的方法。用户可以将URL中所有参数设置在本表中,表中的每一行是一个参数值对(对应RUL中的 名称1=值1)。
编码这个选项最好勾选,因为如果参数值内含有 AscIIcontro1chars 或者 Non-AscIl characters 或者其他符号的话,如果不勾选会导致发送失败(乱码问题),勾选的话会自动将含有的这些特殊符号进行编码。

2)消息体数据(Body Data):
通请求一起发送的数据消息,这里可以支持多种数据格式json、xml等
例如:
参数格式:name=zhangsan&age=15的形式。(参数以纯文本形式)

参数格式:json形式。(需要配置http信息头管理器,添加Context-Type=application/json)
注意:Parameters和Body Data只能选用其中一种方式发送参数。

3)文件上传(Files Upload):
在请求中发送文件。通常HTTP文件上传行为可以通过这种方式模拟,参数名称就是发送文件对应的参数,MINE Type 为资源媒体类型。

下图是高级页面的信息

上图参数解释

(1)客户端实现:
实现(Implementation):发送htp请求的方式。可选项为Java和HtpClient4,默认为HttpClient4HttpClient4是Java工具包实现的请求方式,是基于.net工具包二次定制,效率高。如果是上传文件的话一定要选择,否则请求发送成功了,其实文件并未上传成功。超时(毫秒)<Timeouts(mi1liseconds)>:超时设置,链接(Connect):连接超时时间,单位为秒;响应(Response):响应等待超时时间,单位为秒;

(2)从HTML文件嵌入资源:
从HTML交件获取所有内含的资源(Retrieve A1l Embedded Resources)
当该选项被选中时,JMeter在发出HTTP请求并获得响应的HTML文件内容后,还对该HTML进行解析,并获取HTML中包含的所有资源(图片、flash等),默认不选中。
如果用户只希望获取贞面中的特定资源,可以在后边的 uRlsmust match 文本框中,填入需要下载的特定资源表达式,这样只有能匹配指定正则表达式的URL指向资源会被下载。

  • 并行下载(Para1le1 downloads):是否使用自设资源池,勾选后可设置大小。
  • 数量(Number):资源池大小,默认设置为6。
  • 网址必须匹配(URLs must match):URL匹配过滤,填写此项则只会下载与此内容项匹配的url的资源。

例如:要获取 http://example.com/下的所有资源,使用正则表达式 http://example.com/.

(3)源地址

只用于htp协议且lmplementation为HttpClient4的情况,此属性用于启用IP欺骗,会重写了这个htp请求使用的默认本地IP地址。
用于JMeter主机具有多个IP地址的情况。该值可以是主机名、IP地址或网络接口设备,如“ey0"或“10”或“wlane”可以设置多个,防止IP地址被服务端拉黑。

  • IP/主机名(IP/Hostname):使用特定的IP地址或(本地)主机名。
  • 设备(Device):选择该接口的第一个可用地址,该设备可以是IPv4或IPV6
  • 设备IPV4:选择名称设备的IPv4地址。
  • 设备IPV6:选择名称设备的IPv6地址

(4)代理服务器:
不想用本机的地址来发送Http请求,而想使用代理服务器时则填写。

  • 服务器名称或IP:代理服务器的名称或者!P地址。
  • 端口号 :该代理的端口号。
  • 用户名 :使用该代理的用户名。
  • 密码 :用户密码:

(5)保存响应为MD5哈希:
选中该项,在执行时仅记录服务端响应数据的MD5值,而不记录完整的响应数据。在需要进行数据量非常大的测试时,建议选中该选项,以减少取样器记录响应数据的开销。

Debug Sampler


路径:线程组右击添加-取样器-Debug Sampler
功能:用于在测试过程中输出调试信息。当启用Debug Sampler时,它将记录一些有用的调试信息,如请求的参数、响应的状态码、响应的内容等。这对于调试测试计划或查看请求和响应的详细信息非常有用

监听器

监听器用来监听及显示JMeter取样器测试结果,能够以树、表及图形形式显示测试结果,也可以以文件方式保存测试结果,JMeter测试结果文件格式多样,比如XML格式、CSV格式。默认情况下,测试结果将被存储为xml格式的文件,文件的后缀: ".jtl"。另外一种存储格式为CSV文件,该格式的好处就是效率更高,但存储的信息不如xml格式详细。

监听器用来监听及显示JMeter取样器测试结果,能够以树、表及图形形式显示测试结果,也可以以文件方式保存测试结果,JMeter测试结果文件格式多样,比如XML格式、CSV格式。默认情况下,测试结果将被存储为xml格式的文件,文件的后缀: ".jtl"。另外一种存储格式为CSV文件,该格式的好处就是效率更高,但存储的信息不如xml格式详细。

预览监听器

  首先我们来看一下JMeter的监听器,路径:线程组(用户)->添加->监听器;我们可以清楚地看到JMeter5中共有16个监听器(不包括jp@gc开头的监听器,这个是安装的插件),如下图所示:

常用监听器详解
 
察看结果树

察看结果树,显示取样器请求和响应的细节以及请求结果,包括消息头,请求的数据,响应的数据。

(1)察看结果树,放的位置不同,查看的结果也不同。在线程组下添加察看结果树,查看线程组下所有请求的结果;放在具体某个请求下,只查看此请求的结果;若放在某个控制器节点下,则查看此控制器下节点执行的结果;

(2)该监听器推荐做调试用,在实际运行压测时,应该禁用,因为大量请求时,启用该监听器时打印的日志比较多,会造成大IO消耗,影响压力机性能。

新建:线程组 > 添加 > 监听器 > 察看结果树,如下图所示

关键参数说明如下:

文件名:载入文件名

显示日志内容: 仅错误日志、仅成功日志 ;勾选中显示对应的日志信息

配置:定义report中自己所关心的数据项。

取样器结果:

  • Thread Name: 线组名称
  • Sample Start: 启动开始时间
  • Load time: 加载时长
  • Latency: 等待时长
  • Size in bytes: 发送的数据总大小
  • Headers size in bytes: 发送头大小
  • Body size in bytes: 发送数据的其余部分大小
  • Sample Count: 发送统计
  • Error Count: 错误统计
  • Response code: 返回码
  • Response message: 返回消息
  • Response headers:返回头信息

请求

  • 数据获取方式、路径、地址等以及传递的参数、cookie

响应数据

  • 响应加载的页面html

作用

1)查看请求结果,请求成功的测试通常为绿色;红色则代表失败。

注:在没有对请求断言的情况下,显示绿色并不一定是成功,只代表响应码是200或300系列,显示红色说明响应码是400或500系列。所以要想确定请求返回的是正确的,必须要加上断言,只有断言成功才会显示绿色。

2)查看对应Sampler的测试结果的请求、响应数据。

取样器结果:显示的是取样器相关参数(客户端参数与响应参数)

请求:发送请求的具体内容

响应数据:服务器返回的相应参数

汇总报告

汇总报告,为测试中的每个不同命名的请求创建一个表行。这与聚合报告类似,只是它使用更少的内存。提供了最简要的测试结果信息,同时可以配置将相应的信息保存至指定的文件中(支持xml、csv格式的文件)。

单击Configure按钮,可以配置结果保存各种选项,具体这里不做说明了。

该监听器是笔者在调试jmeter项目时常用的监听器之一。

路径:新建:线程组 > 添加 > 监听器 > 汇总报告,如下图所示:

关键参数说明如下:

Label 取样器别名,如果勾选Include group name ,则会添加线程组的名称作为前缀

样本:取样器运行次数

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

最小值:请求的最小响应时间

最大值;请求的最大响应时间

标准偏差:响应时间的标准方差

异常%:事务错误率

吞吐量:也就是TPS

接收 KB/sec:每秒收到的千字节

发送 KB/sec:每秒发送的千字节

平均字节数:响应平均流量

聚合报告

聚合报告,记录这次性能测试的总请求数、错误率、用户响应时间(中间值、90%、最少、最大)、吞吐量等,用以帮助分析被测试系统的性能。在聚合报告中,各个响应时间不能超过客户的要求,就是合格,例如不能超过响应时间2s,大于2s就是不合格的。

聚合报告应该是最详细的报告了,也是最为常用的报告。是大家在压测过程中最常用的监听器。

该监听器对于每个请求,它统计响应信息并提供请求数,平均值,最大,最小值,中位数、90%、95%、错误率,吞吐量(以请求数/秒为单位)和以kb/秒为单位的吞吐量。

单击Configure按钮,可以配置结果保存各种选项,具体这里不做说明了。

路径:新建:线程组 > 添加 > 监听器 > 聚合报告,如下图所示:

关键参数说明如下:

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

#样本:表示测试中一共发出了多少个请求,如果模拟10个用户,每个用户迭代10次,那么这里就显示对应的 HTTP Request的执行次数是100

平均值:平均响应时间——默认情况下是单个 Request 的平均响应时间,当使用了 Transaction Controller 时,也可以以Transaction 为单位显示平均响应时间

中位数:50%用户的响应时间

90%百分位:90%用户的响应时间

95%百分位:95%用户的响应时间

99%百分位:99%用户的响应时间

最小值:最少响应时间

最大值:最大响应时间

异常%:本次运行测试中出现错误的请求的数量/请求的总数

吞吐量:默认情况下表示每秒完成的请求数(Request per Second),当使用了 Transaction Controller 时,也可以表示类似 LoadRunner 的 Transaction per Second 数

(接收/发送)KB/sec :每秒从服务器端接收到的数据量,相当于LoadRunner中的Throughput/Sec

后端监听器

后端监听器,是一个

异步侦听器,可以将数据推入都数据库中,提供了InfluxDB,graphite选项

新建:线程组 > 添加 > 监听器 > 后端监听器,如下图所示:

关键参数说明如下:

后端监听器实现:BackendListenerClient类的实现,Jmeter默认提供如下两种实现,因为我们使用的influxdb作 为持久存储

org.apache.jmeter.visualizers.backend.graphite.GraphiteBackendListenerClient

org.apache.jmeter.visualizers.backend.graphite.InfluxdbBackendListenerClient 因为我们使用的influxdb作为持久存储,所以后续只介绍InfluxdbBackendListenerClient

异步队列大小:队列值包含异步处理时的度量标准。除非有一些特定的性能问题,否则最好不要从默认的5000。

我们使用InfluxdbBackendListenerClient

influxdbMetricsSender:org.apache.jmeter.visualizers.backend.influxdb.HttpMetricsSender
influxdbUrl:influx数据库的url。example : http://influxHost:8086/write?db=jmeter
application:被测试的应用名称。此值也作为名为“application”的标记存储在“events”中
measurement:使用默认的”jmeter“就行
summaryOnly:为true的情况下,只输出所有请求的集合数据报告,为flase的情况下,输出每条数据的详情报告、
samplersRegex:正则表达式将与样本名称匹配并发送到后端。默认匹配所有
percentiles:要发送到后端的百分位数,多个值已;分割
testTitle:测试名称。默认的设置为 Test name。该值作为名为“text”的字段存储在“事件”度量中。 JMeter在测试的开始和结束时自动生成一个注释,其值以'started'和'ended'结尾
eventTags:自定义标签。您可以根据需要添加任意数量的自定义标签。对于它们中的每一个,只需创建一个新行并在其名称前加“TAG_”

配置元件

为取样器提供预备数据,由取样器发出请求。比如可以设置参数化、记录服务器的返回数据等;

路径:

  1. 测试计划-添加-配置元件

常见配置元件使用
HTTP Request Defaults

用途:设置 HTTP 请求的默认值,避免在每个请求中重复配置相同的参数。

添加方法:

右键点击 Test Plan 或 Thread Group,选择 Add > Config Element > HTTP Request Defaults。


配置参数:

  • Name:用作标识一个取样器
  • Server Name or IP:默认服务器名称或 IP 地址。
  • Port Number:默认端口号。
  • Protocol:默认协议(http 或 https)。
  • Content Encoding:默认内容编码。
  • Path:默认路径。
  • Comments:注释
  • Parameter:参数
  • body data:参数
HTTP Header Manager

支持用户添加或者重写HTTP请求头。JMeter支持多个信息头管理器。多个信息头条目合并成一个信息头列表,跟随http请求一并提交到服务端。

注意点:

(1)当有多个信息头管理器,且不同的管理器内有名称相同的信息头条目存在时,顺序靠前的管理器的信息头条目会覆盖后面的;

(2)当只有一个信息头管理器,但管理器内有名称相同的信息头条目时,会同时生效;

参数详解

  • Name:请求头的名称,比如Content-Type
  • Value:请求头的值,比如application/json

常用请求头

请求头作用
Host指定请求的服务器的域名和端口号,用于服务器区分请求的域名
Connection指定连接方式,如“keep-alive”表示持久连接,或“close”表示关闭连接
Accept指定客户端能够接受的媒体类型,如“text/html”、“application/json”等
Accept-Encoding指定客户端能够接受的压缩格式,如“gzip”、“deflate”等
Accept-Language指定客户端偏好的语言,如“zh-CN”、“en-US”等。
User-Agent指定客户端的浏览器或应用程序信息,如“Mozilla/5.0”等
Referer指定请求来源的URL,用于服务器分析请求来源
Authorization用于身份验证,如“Basic”或“Bearer”等
Cookie用于存储客户端的会话信息,如登录状态等。
Content-Type指定请求体的媒体类型,如“application/x-www-form-urlencoded”、“multipart/form-data”等
Content-Length

指定请求体的长度,用于服务器确定请求体的结束位置。

计数器

计数器,顾名思义就是在测试执行过程中会记录迭代次数。可以在线程组任何位置创建,允许用户配置起点、最大值和增量。配置后,计数器将从起点循环到最大值,然后重新开始,直到线程结束。允许用户创建一个计数器,可在线程组中任何地方被引用。

 配置参数:

  • Name:控制器名称,可以随意设置
  • Comments:注释,可以随意设置
  • Starting value:启动,记录数量起始值
  • Increment:递增,记录迭代次数步长,1后是2,步长就是1
  • Maximum value:记录的最大值
  • Number format:计算器格式,可以是数字,例如000000(6位长度,000,000(6位长度,3位间隔开);字符加数字,例如CUST_000000(字符加6位数字 )
  • Exported Variable Name:引用变量名称,记数器记录的值可以存入的此引用名(变量),可供其他元件调用
  • Track counter independently for each user:与每位用户独立的跟踪计数器,每个线程都有自己的计数器,相互不干扰
  • Reset counter on each Thread Group Iteration:每次迭代复原计数器
CSV Data Set Config

读取csv中的数据作为参数

参数

  • Name:脚本中显示的这个元件的描述性名称
  • Filename:待读取文件的名称。可以写入绝对路径,也可以写入相对路径(相对于bin目录),如果直接写文件名,则该文件要放在bin目录中。对于分布式测试,主机和远程机中相应目录下应该有相同的CSV文件
  • File Encoding:文件读取时的编码格式,不填则使用操作系统的编码格式
  • Ignore first line:是否忽略首行,如果csv文件中没有表头,则选择false
  • Variable Names:变量名列表,多个变量名之间必须用分隔符分隔。如果该项为空,则文件首行会被读取并解析为列名列表
  • Delimiter:参数分隔符,将一行数据分隔成多个变量,默认为逗号,也可以使用“\t”。如果一行数据分隔后的值比Vairable Names中定义的变量少,这些变量将保留以前的值(如果有值的话)
  • Allow quoted data:是否允许变量使用双引号,允许的话,变量将可以括在双引号内,并且这些变量名可以包含分隔符
  • Recycle on EOF:是否循环读取csv文件内容,达到文件结尾后,是否从文件开始循环重新读取;默认为 true
  • Stop thread on EOF:是否循环读取csv文件内容,达到文件结尾后,线程是否该终止;默认为 true
  • Recycle on EOF:当Recycle on EOF为False时,停止线程,当Recycle on EOF为True时,此项无意义,默认为 false
  • Sharing mode:1、All threads(默认):一个线程组内,各个线程(用户)唯一顺序取值;2、current thread:一个线程组内,各个线程(用户)各自顺序取值;3、线程组各自独立,但每个线程组内各个线程(用户)唯一顺序取值:

前置处理器

前置处理器是在发出“取样器请求”之前执行一些操作。如果将前置处理器附加到取样器元件,则它将在该取样器元件运行之前执行。前置处理器最常用于在取样器请求运行前修改其设置,或更新未从响应文本中提取的变量。前置处理器主要是用来处理请求前的一些准备工作,比如参数设置、环境变量设置等等。

路径:线程组(用户)-添加-前置处理器()

BeanShell PreProcessor

参数说明:

  • Reset bsh.Interpreter before each call: 在每次调用之前重置解释器并清除占用的内存。将此选项设置为“True”对于长时间运行的脚本可能很有用,因为重复调用可能会消耗大量内存

  • Parameters :将传递给BeanShell脚本的JMeter参数。您需要记住,如果在此配置字段中未指定JMeter变量,则不能在BeanShell预处理器中使用它们,如果指定了参数,则可以在预处理器中使用它,如下所示:
    String BS_Variable_Name = vars.get("JMeterVariable");

  • File Name:需要运行的外部 BeanShell 脚本的路径

BeanShell 预处理器脚本可能是外部的,也可能是内部的。如果它是内部的,您可以将其写入 BeanShell Preprocessor 的“Script”字段。

这里我们以生成随机字符串为例

import java.util.Random;
chars = "1234567890abcdefghiklmnopqrstuvwxyz-";
int string_length = 36;
randomstring ="";

for (int i=0; i < string_length; i++) {
  Random randomGenerator = new Random();
  int randomInt = randomGenerator.nextInt(chars.length());
  randomstring += chars.substring(randomInt,randomInt+1);
}
print(randomstring);
vars.put("RANDOM_STRING",randomstring);

JSR223 PreProcessor

JSR223 预处理器是另一种使用预处理器编写脚本的方法。JSR223 具有与 BeanShell 预处理器相似的功能。与 BeanShell 的主要区别在于您可以使用其他脚本语言:ecmascript、groovy、java、javascript、jexl 和 nashorn。

使用JSR223预处理器时,您需要确保脚本不会在脚本代码中直接使用JMeter变量,因为存在一种缓存机制,该机制只缓存第一次替换,而所有下一次变量更新在预处理器中根本不可用。

HTML 链接解析器预处理器可用于解析响应、提取所有找到的链接并进一步请求它们。当您的脚本的主要目标是模拟网络爬行时,这会很有用。

JDBC PreProcessor

通过使用 JDBC 预处理器,您可以在采样器之前运行 SQL 语句。

假设我们登录的过程中有用户名和密码作为参数,可以将这些测试值保留在采样器本身中,但这会非常低效,因为每次用户更新他们的用户名和密码,都必须相应地更新您的脚本。这是一个很好的例子,可以用从数据库中获取的动态值替换硬编码参数

参数说明:

  • Variable Name for created pool declared in JDBC Connection Configuration: 变量名称- 连接池的名称(在 JDBC 连接配置中指定)
  • Query type: 查询类型- 所有常用的语句类型(例如,如果查询更新 db 值,则不能使用选择类型)
  • SQL Query: SQL 查询- SQL 查询本身
  • Parameter values: 参数值- 如果 SQL 查询参数化,则为逗号分隔的参数列表
  • Parameter types: 参数类型- 逗号分隔的 SQL 参数类型列表(在此处查看有关受支持类型的更多信息:java.sql.Types 的 Javadoc)
  • Variable Names: 变量名称- 以逗号分隔的变量列表,用于保留从数据库返回的获取的数据库数据值
  • Result Variable Name: 结果变量名称- 包含返回数据集的键值变量
  • Query timeout (s): 查询超时 (s) - 结果查询的最大秒数
  • Handle ResultSet : 处理结果集 - 指定应如何处理查询结果

使用这个处理器需要额外设置JDBC驱动

添加 JDBC 预处理器,可以只指定 Select 语句来从数据库中检索所需的数据

我们可以用动态获取的数据替换输入参数,这里使用调试取样器获取参数做测试。真实业务可以通过${username}获取参数值

RegEx User Parameters

正则表达式用户变量,用来引用前一次正则表达式提取器(Regular Expression Extractor)提取的响应数据;响应数据是由取样器返回的。比如对请求1用正则表达式提取器提取其返回list,然后请求2用RegEx User Parameters来引用list中的值

参数说明:

  • Regular Expression Reference Name:正则表达式引用名称,引用的正则表达式提取器(Regular Expression Extractor)中声明的变量名
  • Parameter names regexp group number:参数名称正则表达式编号
  • Parameter values regex group number:参数值正则表达式组编号

假设我们有第一个 http 请求,它返回带有这种 html 的响应正文:

<div class='parameters'>
    <input name='username' value='TestUser'>
    <input name='password' value='Test123!'>
<div class='parameters'>

我们看到所有参数都包含名称和值。在这种情况下,我们可以创建一个通用的正则表达式来提取所有变量,包括名称和适当的值,这些变量将使用正则表达式组(圆括号)分隔:

基于指定的正则表达式,我们看到 'listParams' 引用将包含从第一个请求解析的所有变量。该正则表达式的第 1 组将返回名称,而第 2 组将返回适当的值。在这种情况下,我们可以通过以下方式指定 RegEx 用户参数配置:

User Parameters

用户参数预处理器指定特定于各个线程的用户输入参数。对于每个线程,将根据该用户线程的顺序使用变量值.

可以利用此元件进行参数设置,在取样器中进行参数化,也就是用户(线程)在进行参数化取值时可以根据用户来区分.

如果线程数多于用户参数个数,则剩余线程从第一组用户参数开始调用

如果仅使用一次迭代更新变量并确保每次都根据父控制器的执行更新值,则需要选中“每次迭代更新一次”复选框。

通常,此预处理器是参数化请求的一种选择。但通常,csv 数据集配置元素为参数化提供了更大的灵活性。

后置处理器

顾名思义,后处理器在采样器之后应用。请注意,它们是 应用于同一范围内的所有采样器,因此要确保后处理器 仅适用于特定采样器,请将其添加为采样器的子级

后处理器在断言之前运行,因此它们无权访问任何断言结果,也不会示例状态反映任何断言的结果。如果您需要访问断言结果,请尝试 改用侦听器。另请注意,变量JMeterThread,last sample ok 设置为“true"或"false”在运行所有断言之后。

JSON JMESPath Extractor

作用:可以通过JmesPath语法提取所需要的值
使用场景:取样器返回格式为json
JmesPath语法:参考https://jmespath.org/tutorial.html
参数说明:
Apply to:

  • Main sample and sub-samples:匹配范围包括当前父取样器和子取样器
  • Main sample only:默认;匹配范围仅包括当前父取样器
  • Sub-samples only :仅匹配子取样器
  • JMeter Variable Name to use:支持对Jemter变量值进行匹配,输入框内可输入jmeter的变量名称
  • Name of created variables:请求要引用的变量名称
  • JMESPath expressions:JMESPath表达式
  • Match No. (0 for Random):匹配数字,0代表随机取值,n取第几个匹配值,-1匹配所有
  • Default Value:未匹配到值时,给参数一个默认值

JSON提取器

  • 功能:可以通过JsonPath提取所需要的值
  • 使用场景:取样器返回格式为json
  • JsonPath语法:参考https://goessner.net/articles/JsonPath/
XPathJSONPath描述
/$根节点/元素
.@当前节点/元素
..n/a父元素
//..递归向下搜索子元素
**通配符,表示所有元素
@n/a访问属性,JSON结构的数据没有这种属性
|[,]支持迭代器中做多选
[]?()筛选表达式
n/a()支持表达式计算
()n/a分组,JSONPath不支持




 

正则表达式提取器

作用:可以通过正则表达式提取所需要的值,
注意事项:左边界和右边界不能缺失,如果有特殊字符必须用\转义符

参数说明:

        要检查的响应字段:   

  •         Body:响应体,不包含响应头; 最常用
  •         Body(unescaped):响应体,替换了所有HTML转义符;不建议使用
  •         Body as a Document:返回内容作为一个文档进行匹配
  •         信息头:响应头
  •         Requeste Headers:请求头
  •         URL:URL
  •          响应代码:响应码
  •         响应信息:响应信息

引用名称:接收提取值的变量名

正则表达式:正则表达式匹配规则,如:“code”😦.?),“message”:"(.?)"

模板:对应正则表达式组号,从1开始,$1$表示取code值,$2$表示取message值,$0$表示全文匹配

匹配数字(0代表随机):当匹配出现多个值匹配时,通过该数字确认取哪一个,从1开始,0表示取随机,负数表示取所有

缺省值:未匹配到时,指定的默认值

实例:

服务器返回如下:

正则表达式提取器如下:

查看结果:

控制器

通过控制各种控制器的组合,来完成我们的各种请求。

路径

  1. 测试计划-添加-线程(用户)-线程组;

  2. 线程组-添加-逻辑控制器。

定时器

比如模拟用户请求时,在某一时刻或者同时刻发送请求;

作用域

  1. 定时器是在每个sampler之前执行的,无论定时器位置在sampler之前还是子节点下面
  2. 当执行一个sampler之前时,所有当前作用域内的定时器都会被执行;
  3. 如果希望定时器仅对其中一个sampler起作用,则把定时器作为其子节点加入;

注意:定时器的时间不会计入单个sampler的响应时间,但如果有使用事务控制器,会计入事务控制器的时间,

路径:

  1. 测试计划-添加-线程(用户)-线程组;

  2. 线程组-添加-定时器

固定定时器(Constant Timer)

在这里插入图片描述

作用:让每个线程在服务请求之前按相同的指定时间停顿

高斯随机定时器(Gaussian Random Timer)

如果需要每个线程的延迟时间是符合标准正态分布的随机时间停顿,那么使用这个定时器,总延迟 = 高斯分布值(平均0.0和标准偏差1.0)* 指定的偏差值+固定延迟偏移

同步定时器(Synchronizing Timer)

作用:可以理解为集合点,当线程数量达到指定值后,再一起释放,可以瞬间产生很大的压力。

需要特别注意:如果使用“不停顿启动”会让集合点失效;启动按键:脚本设置好后,按启动按键启动,将会严格按设置的运行,在指定的ramp-up时间内准备线程;不停顿开始:按不停顿开始按键执行脚本,不会按照设置好的运行,开始后准备好的线程数直接发起请求。

均匀随机定时器(Uniform Random Timer)

和高斯随机定时器的作用差异不大,它产生的延迟时间是个随机值,而各随机值出现的概率均等。总的延迟时间等于一个随机延迟时间加上一个固定延迟时间,用户可以设置随机延迟时间和固定延迟时间。

 精准吞吐量定时器(Precise Throughput Timer)

Target Throught:目标吞吐量

Throught Period:表示在多长时间内发送Target Throught指定的请求数(以秒为单位)

Test Druation:指定测试运行时间(以秒为单位)

Number of threads in the bath:用来设置集合点,等到指定个数的请求后并发执行

Precise Throughput Timer根据吞吐量在做计时器(到了多少量就发请求),可以做到控制请求的速度和个数

Poisson Random Timer 泊松随机定时器

这个定时器在每个线程请求之前按随机的时间停顿,总的延迟就是泊松分布值和偏移值之和。

上面表示暂停时间会分布在100到400毫秒之间:

(1)Lambda(in milliseconds):兰布达值

(2)Constant Delay Offset(in milliseconds):暂停的毫秒数减去随机延迟的毫秒数

测试片段-Test Fragment

是辅助组件,可放置任何测试元件,一般不会被运行;用来备份元件,其下的元件看被模块控制器调用;

路径:测试计划-添加-测试片段

在接口测试中使用Jmeter

使用实例

1.打开的Jmeter 页面中,右键“测试计划” -> “添加” -> "Threads(Users)" -> “线程组”, 建立线程组。

2.右键“线程组” -> “添加” -> “Sample” -> “HTTP请求”, 输入“服务器名称或IP”,对应的端口号,http默认端口号80,可以不写。

3.右键“线程组” -> “添加” -> “监听器” -> “察看结果数”, 添加“察看结果数”, 以察看运行后的结果,如果所示。

接口请求实例
1. “用户定义的变量” 的应用


以获取学生信息接口(stu_info) 为例,添加一个“用户定义的变量”,设置变量"host" 以及值,这样在获取学生信息接口(stu_info)就可以通过"${host}"取得“服务器名称或IP”的值。

 登陆接口(login)接口也可以应用“用户定义的变量”的方法,如上图所示,在“用户定义的变量”中添加"username", "password" 变量及对应的值, 应用到登陆接口(login)接口请求中即可。

 2. "HTTP Cookie 管理器"的应用

以金币充值接口(gold_add)为例,建立一个HTTP请求改名“金币充值”,选取请求方式POST, 输入对应的host, path以及同请求一起发送的参数和值。

由于此接口有权限验证,需要admin用户才可以做操作,需要添加cookie, 因此需要添加"HTTP Cookie 管理器"以传递Cookie。

添加"HTTP Cookie 管理器" 方法如下图所示, 右键“金币充值” -> “添加” -> “配置元件” -> "HTTP Cookie 管理器" 

 设置Cookie 的名称(即username 的值),值(即login Response 中的sign 值),域(已在“用户定义的变量”中设置,只需输入变量即可,格式为${host})

最后可以通过“察看结果数”的响应数据查看结果。

3. 建立接口间的关联


以下以登陆接口(login)和金币充值接口(gold_add)为例,在这两个接口间建立关联,让金币充值接口(gold_add)可以实时取得登陆接口(login)的"sign" 值,不必再“HTTP Cookie 管理器”中手动输入最新的sign 值。

从“察看结果树”可以看出,登陆接口(login)的Response 结构为Json格式, sign 在 login_info 里面一层。

4. 设置断言

以“增加学生”接口(add_stu)为例,增加响应断言,以验证添加的数据是否成功。如下图所示设置

通过“察看结果数”可以看到“增加学生” 金币结果为绿色,同时响应数据里的确有断言中的设置的"1000"。

 5. “HTTP信息头管理器”的使用

以下图中的“获取所有学生信息” 为例,右键“获取所有学生信息” -> “添加” -> “配置元件” -> "HTTP Cookie 管理器" , 输入对应的名称和值即可。

注意:  这里的值需要输入完整的url, 包括http:// (eg, 输入http://api.test.cn)

6. POST 文件的使用方法

与其他POST请求中添加key-value, json 数据不同的是,这个需要在HTTP 请求中点击“Flies Upload” tab, 点击“添加”, 然后通过“浏览”上传本地的文件。

注意: 参数名称必须为"file"。

7. "CSV Data Set Config" 和 “函数助手对话框”的使用

以增加学生接口(add_stu)为例,在本地创建一个文件,添加name 和sex的值,对脚本设置5个线程或者循环5次,以加入这5个用户。

右键“线程组” -> “添加” -> “配置元件” -> "CSV Data Set Config",如果仅应用于“增加学生”接口的话,可以直接在“增加学生”接口下面创建"CSV Data Set Config"。

 根据下图添加对应的,"Variable Names" 输入"name" 和"sex", 以逗号隔开,为避免插入的数据乱码,将file encoding 设置为utf-8。

 由于"CSV Data Set Config"中的变量名为name 和sex,因此在“增加学生”接口的"Body Data" 中将值分别替换为${name}, ${sex}。

由于“phone”的唯一性,每次插入一条学生信息时phone 都要求不一样,所以对后面8位用随机函数来实现。

8. 数据库的应用

以下是JMeter 驱动数据库列表:

以下以mysql 数据库为例。

添加一个"JDBC Connection Configuration", 根据上表中对mysql的要求设置下

 添加一个"JDBC Request", 由于在Query 中有insert 和select, 所以Query Type 需要选择"Callable Statement", 如果是单个的select 或者insert,可以选取对应的Select Statement 和Update Statement。

 通过察看结果数看到"JDBC Request" 请求成功,响应数据里返回insert 和select 的结果。

 登陆mysql 数据库,查询发现和Jmeter 中通过察看结果数看到的结果一致。

在性能测试中使用Jmeter


测试流程

需求分析→环境搭建→测试计划→脚本开发→执行与监控→缺陷管理→结果与报告

压力测试

1、线程组设置,这里的线程数与同步定时器的用户数量一样
2、添加HTTP cookie管理器
3、默认请求值
4、添加一个事务控制器,可以当作一个业务
5、在事务控制器下添加,同步定时器
设置用户数量,这里与线程组的线程数一样,超时时间可设置
6、添加脚本(http请求)
7、添加查看结果树
8、添加->监听器
9、在最后添加一个聚合报告,添加处:添加->监听器

负载测试实战

1、线程组的设置50个用户(持续时间:按秒计算,这里300=60*5,意思就是运行时长为5分钟)
2、添加HTTP cookie管理器
3、默认请求值
4、添加一个事务控制器,可以当作一个业务
5、在事务控制器下添加,高斯随机定时器
总的延时 = 固定延迟时间 + 高斯随机生成的偏差值(说明:单位都是毫秒,固定延迟300ms,偏差100ms,意思是时间延迟300-400ms之间)
6、添加脚本(http请求)
7、添加->监听器
8、在最后添加一个聚合报告,添加处:添加->监听器


性能测试案例

测试需求:测试20个用户访问网站在负载达到30QPS时的平均响应时间
QPS:Query Per Second 每秒查询率。(一台查询服务器每秒能够处理的查询次数,作为域名服务器的性能经常用每秒查询率来衡量)

测试步骤

1、添加线程组(线程数+准备时长+循环次数)
1.1、线程数:虚拟用户数,一个虚拟用户占用一个进程或线程(设置多少个虚拟用户=设置多少个线程)
1.2、准备时长(s):设置的虚拟用户数需要多长时间全部启动。eg:线程数为20,准备时长为10,则说明需要10秒钟启动20个进程。
1.3、循环次数:每个线程发送请求的次数。eg:线程数为20,循环次数为5,那么每个线程发送5

 2、添加HTTP请求

3、设置QPS限制:控制给定的取样器发送请求的吞吐量

4、添加监视器-聚合报告、察看结果树

 5、运行脚本

6、聚合报告解析(响应时间单位:毫秒)
1)Label:每个Jmeter的element都有一个Name属性,这里显示的就是Name属性的值
2)#Sample:表示你这次测试中一共发出了多少个请求,如果模拟10个用户,每个用户迭代10次,那么这里显示100
3)Average:平均响应时间-默认情况下是单个Request的平均响应时间当使用了Transaction Controller 时,也可以以Transaction为单位显示平均响应时间
4)Median:中位数,50%用户的响应时间
5)90%Line:90%用户响应时间
6)Min:最小响应时间
7)Max:最大响应时间
8)Error%:本次测试中出现错误的请求的数量/请求的总数
9)Throughput:吞吐量-默认情况下白石每秒的请求数
10)KB/sec:每秒从服务器端接收到的数据量

  • 23
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值