在本系列文章的上一篇中,咱们介绍了开源测试工具 JMeter,并以一个简略的HTTP测试为例一窥JMeter的能力。在本篇文章中,咱们将进一步介绍JMeter丰盛的组件,以帮忙大家构建简单场景的测试脚本。

JMeter的测试脚本在界面中以「树」的模式出现,保留后的测试脚本jmx文件自身也是xml格局。JMeter脚本树以测试计划(Test Plan)为根节点,所有的测试组件都会被蕴含在测试计划中。测试计划中能够配置被整个测试计划中的组件调用的自定义变量、线程组运行模式、测试中应用的库文件等。

在测试计划中应用多种测试组件,就能够构建丰盛的测试场景。JMeter中的测试组件大抵有以下几类:线程组、取样器、逻辑控制器、监听器、配置元件、断言、定时器、前置处理器、后置处理器。接下来将别离介绍,并对次要的组件进行具体阐明。

一、线程组

线程组元件是所有测试计划的入口。所有的取样器和控制器必须放在线程组下。一个线程组能够看作一个虚构用户池,其中的每个线程都能够了解为一个虚构用户,多个虚构用户同时去执行雷同的一批次工作。每个线程之间都是隔离的,互不影响的。一个线程的执行过程中,操作的变量不会影响其余线程的变量值。

线程组的界面如下图:

在线程组界面中能够设置以下数据,进行线程组的管制:

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

这几个配置项管制了「当遇到谬误的时候测试的执行策略」是否会继续执行。

  • 持续:疏忽谬误,继续执行
  • 启动下一过程循环: 疏忽谬误,线程以后循环终止,执行下一个循环。
  • 进行线程:以后线程进行执行,不影响其余线程失常执行。
  • 进行测试:整个测试会在所有以后正在执行的线程执行结束后进行
  • 立刻进行测试:整个测试会立刻进行执行,以后正在执行的取样器可能会被中断。

线程数

线程数也就是并发用户数,每个线程将会齐全独立地运行测试计划,互不烦扰。测试中应用多个线程用于模拟对服务器的并发拜访。

ramp-up工夫

ramp-up工夫用于设置启动所有线程所须要的工夫。例如:线程数设置为10,ramp-up工夫设置为100秒,那么JMeter将应用100秒使10个线程启动并运行,每个线程将在前一个线程启动后的10秒启动。

如果ramp-up值设置得很小、线程数又设置得很大,刚开始执行测试时会对服务器产生很大的压力。

循环次数

设置完结火线程组中每个线程循环的次数。

提早创立线程直到须要

默认状况下,测试开始的时候,所有线程就全副创立了。如果勾选了此选项,那么线程在须要用到的时候才创立。

线程组调度器

调度器配置能够更灵便地控制线程组执行的工夫

(1)持续时间:管制测试执行的持续时间,以秒为单位。

(2)启动提早:管制测试在多久后启动执行,以秒为单位。

二、取样器

取样器是用来模仿用户操作的,是向服务器发送申请、接管服务器响应数据的运行单元。取样器是蕴含在线程组外部的组件,因而它必须在线程组中增加。JMeter原生反对多种不同的取样器,如TCP取样器、HTTP申请、FTP申请、JDBC申请、Java申请等,每一种不同类型的取样器依据设置的参数向服务器收回不同类型的申请。

TCP取样器

TCP 取样器通过TCP/IP来连贯指定服务器,连贯胜利后向服务器发送音讯,而后期待服务器回复。

界面如图:

TCP取样器中能够设置的属性有:

1.TCPClient classname

示意解决申请的实现类。缺省应用org.apache.jmeter.protocol.tcp.sampler.TCPClientImpl, 应用一般文本进行传输。此外JMeter还内置反对BinaryTCPClientImpl和LengthPrefixedBinaryTCPClientImple, 前者应用十六进制报文,后者在BinaryTCPClientImpl的根底上减少了2个字节的长度前缀。

也能够通过继承org.apache.jmeter.protocol.tcp.sampler.TCPClient来提供自定义的实现类。

2.指标服务器设置

「服务器名称或IP」和「端口号」指定了服务器利用的主机名/IP地址和端口号。

3.连贯选项

  • Re-use connection:: 如果选中,这个连贯会始终处于关上状态,否则读取到数据后就敞开。
  • 敞开连贯:如果选中,这个连贯在TCP取样器运行结束之后就会被敞开。
  • 设置无提早:如果选中,Nagle算法将被禁用,容许小数据包的发送。
  • SO_LINGER:用于管制在敞开连贯之前是否要期待缓冲区中的数据发送实现。
  • 行尾 (EOL)字节值:用于判断行完结的字节值,如果指定的值大于127或者小于-128,会跳过EOL查看。比方服务器端返回的字符串都是以回车符结尾,那么咱们能够将该选项设置成10

4.超时工夫:

  • Connect Timeout:连贯超时
  • Response Timeout:响应超时

5.要发送的文本

申请发送的报文文本

6.登陆配置

设置连贯应用的用户名和明码

HTTP申请取样器

HTTP取样器向web服务器发送HTTP/HTTPS申请。

1.名称和正文

2 .申请协定

向指标服务器发送申请时应用的协定,能够是HTTP、HTTPS或FILE,默认为HTTP。

3.域名或IP地址

申请发送的指标服务器名称或IP地址。

4.端口号

Web服务监听的端口号,HTTP默认端口为80,HTTPS默认端口443。

5.申请办法

发送申请的办法,罕用GET、POST、DELETE、PUT、TRACE、HEAD、OPTIONS等。

6 .门路

要申请的指标URL门路(不包含服务器地址和端口)。

7.内容编码

实用于POST、PUT、PATCH和FILE这几种申请形式,对申请内容进行编码的办法

8.更多申请选项

  • 主动重定向:重定向不会被视为独自的申请,不被JMeter记录。
  • 追随重定向:每次重定向都被视为独自的申请,都会被JMeter记录。
  • 应用KeepAlive:如果选中,JMeter和指标服务器之间通信时会在申请头中退出Connection: keep-alive。
  • 对POST应用multipart/form-data:如果选中,将应用multipart/form-data 或 application/x-www-form-urlencoded发送申请。

9.参数

JMeter将应用参数键值对来生成申请参数,并依据申请办法以不同办法发送这些申请参数。例如:GET,DELETE申请,参数会附加到申请URL。

10.音讯体数据

如果心愿传输JSON格局的参数,须要在申请头中配置Content-Type为application/json

11.文件上传

在申请中发送文件,通常HTTP文件上传行为能够通过这种形式模仿。

三、逻辑控制器

JMeter 逻辑控制器能够对元件的执行逻辑进行管制,JMeter 官网是这样解释的:「Logic Controllers determine the order in which Samplers are processed」。也就是说逻辑控制器能够管制采样器(samplers)的执行程序,因而控制器须要和采样器一起应用。除仅一次控制器外,其余逻辑控制器能够互相嵌套。

JMeter 中的逻辑控制器次要分为两类:

  • 管制测试计划执行过程中节点的逻辑执行程序,如:循环控制器、If 控制器等;
  • 对测试计划中的脚本进行分组、不便 JMeter 统计执行后果以及进行脚本的运行时管制等,如:吞吐量控制器、事务控制器。

事务控制器

有时候咱们想统计一组相干申请的的整体响应工夫,这种情景就须要借助事务控制器。

事务控制器会对该控制器下所有子节点的取样器执行耗费工夫进行统计。如果事务控制器下定义了多个取样器,所有取样器都运行胜利时,整个事务能力算胜利。

如下图增加事务控制器:

事务控制器的配置项有:

1.Generate parent sample

如果选中,事务控制器将作为其余取样器的父级样本,否则事务控制器仅作为独立的样本。

例如,未勾选状况下汇总报告如下:

勾选状况下汇总报告如下:

2.include duration of timer and pre-post processors in generated samle:

指定是否蕴含定时器,如果勾选将在取样器运行前与运行后加上延时。

仅一次控制器

仅一次控制器,顾名思义就是只执行一次的控制器,即在线程组下的循环执行过程中对该控制器下的申请只执行一次。对于须要登录的测试,能够思考将登录申请放在仅一次控制器中,因为登录申请只需执行一次即可建设会话。

如下图增加仅一次控制器:

如果咱们将线程组循环次数设置为 2,运行后查看后果树,可看到仅一次控制器下的申请“HTTP申请3”只执行了1次,其它申请执行了2次

四、监听器

监听器是用于对测试后果数据进行解决和可视化展现的一系列元件。观察后果树、 图形后果、聚合报告等都是咱们常常用到的监听器组件。

观察后果树

该组件以树形构造展现了每一个取样器的后果、申请内容、响应工夫、响应码、响应内容等信息,查看这些信息能够辅助剖析是否存在问题。它提供多种的查看格局和筛选办法,也能够将后果写入指定文件进行批量剖析解决。

五、配置元件

配置元件用于提供对静态数据配置的反对。它能够定义在测试计划层级下,也能够定义在线程组或取样器层级下,定义在不同层级,作用域也不同。配置元件次要有用户自定义变量、CSV数据文件设置、TCP取样器配置、HTTP Cookie管理器等。

用户自定义变量

通过设置一系列的变量,达到在性能测试过程中能够随机选取变量的目标。变量名能够在作用域内援用,通过${变量名}形式来援用变量。

除了“用户自定义变量”这个组件外,测试计划和HTTP申请等多个组件中也能够定义变量:

例如:在HTTP申请中援用了已定义的变量:

查看执行后果,能看到的确获取到了变量的取值:

CSV数据文件设置

在性能测试过程中咱们往往须要一些参数化的输出参数,比方登录操作外面的用户名明码。当并发量比拟大的时候 ,运行时生成数据会对CPU和内存造成较大的累赘,而CSV数据文件配置能够作为这种场景下所需的参数起源。

CSV数据文件设置中局部参数的阐明如下:

  • 变量名称:定义CSV文件中的参数名,定义后可在脚本在以${变量名}的形式援用
  • 遇到文件结束符再次循环:如果设置为True,容许对CSV文件循环取值
  • 遇到文件结束符进行线程:如果设置为True,则读取完CSV文件中的记录后进行运行
  • 线程共享模式:设置在线程及线程组间共享的模式

六、断言

断言即查看接口的返回是否合乎预期。断言是自动化测试脚本中无足轻重的一环,因而要十分重视。

JMeter 罕用断言次要有响应断言(Response Assertion)、JSON断言(JSON Assertion)、大小断言(Size Assertion)、断言持续时间(Duration Assertion)、beanshell 断言(Beanshell Assertion)等,这里咱们只介绍常常要用到的 JSON断言。

JSON 断言

用于对 JSON 格局的响应内容进行断言。

下图在一个HTTP取样器上增加 JSON 断言:

JSON断言配置项有:

  • Assert JSON Path exists:须要断言的 JSON 表达式
  • Additionally assert value:如果要依据值去断言,请勾选
  • Match as regular expression:如果要依据正则表达式去断言,请勾选
  • Expected Value:期望值
  • Expect null:如果冀望是 null 则勾选
  • Invert assertion:取反

其中 JSON path 中的「根成员对象」总是被称为$,能够通过 「dot–notation」(.号)或 「bracket–notation」([]号)这两种不同的格调来示意,比方 $.message[0].name$['message'][0]['name']

上面以申请 http://www.kuaidi100.com/query 为例,其中 $.message 示意响应 json 对象的中 message,勾选 Additionally assert value 示意要依据 message 的值去判断,Expected valueok 示意判断 message的值是否为 ok

运行脚本,查看后果,可看到断言是通过的

断言的判断条件次要包含:如果响应后果不是 json 格局的,失败;如果 json path 找不到元素,失败;如果 json path 找到元素,没有设置条件,通过;如果 json path 找到元素,但不符合条件,失败;如果 json path 找到元素,且符合条件,通过;如果 json path 返回的是一个数组,会迭代判断是否有元素符合条件,有则通过,没有则失败。回到“JSON断言”,勾选 Invert assertion

运行脚本,查看后果,可看到断言是失败的

七、定时器

在性能测试中,拜访申请之间的进展工夫被称之为思考工夫。在实际操作中,进展工夫能够是内容查找、浏览等破费的工夫,而定时器正是用来模仿这种进展工夫。其中:

  • 同一作用域下的所有定时器优先于 取样器之前执行。
  • 如果心愿定时器仅利用于其中一个取样器,则把定时器退出到该取样器的子节点。

JMeter定时器次要包含:固定定时器(Constant Timer),对立随机定时器(Uniform Random Timer),精准吞吐量定时器(Precise Throughput Timer),常数吞吐量定时器(Constant Throughput Timer),高斯随机定时器(Gaussian Random Timer),JSR223 定时器(JSR223 Timer),泊松随机定时器(Poisson Random Timer),同步定时器(Synchronizing Timer),BeanShell 脚本编写定时器(BeanShell Timer)。

固定定时器

固定定时器,即配置每个申请之间的间隔时间为固定值。

下图在一个事务控制器上增加固定定时器:

将线程提早别离配置为 100 和 1000后,运行脚本

查看表格后果中的数据,其中1、2是配置为 100 毫秒时的运行后果,4、5是配置为 1000 毫秒时的运行后果,可看到 4、5 的间隔时间显著比 1、2 的间隔时间长

常数吞吐量定时器:

常数吞吐量定时器用于管制申请按指定的吞吐量去执行。

下图在一个事务控制器上增加常数吞吐量定时器:

配置指标吞吐量为 120(留神单位是分钟),基于计算吞吐量抉择“以后线程组中的所有流动线程(共享)”

运行脚本,查看后果,可看到吞吐量根本维持在 2/每秒(120/60)

八、前置处理器和后置处理器

前置处理器是取样器申请之前执行一些操作,常常用于在取样器申请运行前批改参数,设置环境变量,或更新未从响应文本中提取的变量。

同样的,后置处理器是在取样器申请之后执行一些操作。有时候服务器的响应数据在后续申请中须要用到,咱们就须要对这些响应数据进行解决。比方获取响应中的jwt token,在后续申请中应用以进行身份验证,这时就会应用后置处理器。

以上就是JMeter次要的测试组件介绍,大家能够在实战中尝试应用。下期文章咱们将解说 JMeter 中的 MQTT 插件应用。