ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

JMeter常用组件(全)

2021-07-29 12:01:18  阅读:325  来源: 互联网

标签:__ 常用 定时器 请求 控制器 响应 线程 组件 JMeter


JMeter执行顺序:
配置元件 → 前置处理器 → 定时器 → 取样器 → 后置处理器 → 断言 → 监听器;
同一层级的,顺序执行;

一、线程组

场景设置,模拟并发用户发送请求,设置并发策略。详见: https://www.cnblogs.com/chenwt/p/15016495.html

二、取样器

  控制JMeter向服务器发起什么样的请求

1.HTTP请求

image
  【自动重定向】只记录最后跳转请求,会丢失初始请求的cookie等信息;
  【跟随重定向】记录整个请求过程所有信息,过程请求为sub-sampler,子请求
image

2.Debug Sampler 调试取样器

  在reponse data 中展示自定义变量,用于调试,一般直接使用默认设置

3.JDBC Request

  向数据库发送请求,以获得所需数据。需要与JDBC Connection Configuration 一起使用;
  使用参考 https://www.cnblogs.com/chenwt/p/15030426.html

4.其他

  如果是其它协议,比如java、dubbo、websocket、smtp、tcp、jdbc,添加对应的取样器等即可,如果没有,那么就需要我们自己开发,所以,java基础是必备的。(一般都有开发好的开源jar下载放到..\lib\ext下即可)。

三、提取器

  关联中使用:jmeter前面一些脚本运行后返回的值,使用提取器取出,用在后面脚本中。

1.正则表达式提取器

【Apply to】应用范围,通常是Main sample only

【引用名称】自己定义的变量名称,后续请求将要引用到的变量名,如填写的是:actionId,后面的引用方式是${actionId}

【正则表达式】
():括起来的部分就是需要提取的,对于你要提的内容需要用小括号括起来;
. :匹配除了换行符以外的任何字符;
+ :重复一次或更多次
* :重复零次或多次
? :在找到第一个匹配项后停止
(.*?)一般可以匹配任意字符
正则表达式中也可以使用其他自定义变量,使用${}方式调用

【模板】用$$引用起来,如果在正则表达式中有多个正则表达式(多个括号括起来的),则可以是$2$,$3$等等,表示解析到的第几个值给actionId。例如:$1$表示匹配到的第一个值

【匹配数字】结果有多个值,0代表随机取值,-1表示全部,1第一个,2第二个

【缺省值】正则匹配失败时,取的值,可不填
image
正则表达式提取字符是否正确,可以通过添加“调试取样器”来检查。
调用:${actionId}

2.JSON提取器

JSON提取器使用json path表达式匹配,可以一次取多个变量值。

$ 表示响应的根节点{;
. 指根节点下子元素,即子节点;
.. 指所有符合条件的节点;
* 表示所有节点;
[] 取数组里的对象用;
数组索引从0开始

image
查找全部feeGroupName:$..feeGroupName 或 $..result[*]feeGroupName ,得到4个值

image
查找第一个feeGroupName的值:$..result[0].feeGroupName

【Apply to】应用范围

【Names of created variables】接收值的变量名,自定义,多个变量用分号;分隔;

【JSON Path expression】json path表达式,也是用分号分隔;

【Match No.(0 for Random)】0表示随机;n取第几个匹配值;-1匹配所有。若只要获取到匹配的第一个值,则填写1

【Default Values】缺省值,匹配不到值的时候取该值,可写error。

【Compute concatenation var(suffix_ALL)】如果找到许多结果,则插件将使用' , '逗号将它们连接起来,并将其存储在名为“变量名_ALL”的变量中
image

image
调用:
json path匹配唯一值:${variable};
json path匹配多个值,json提取器match no填1指定取第1个值:${variable};
json path匹配多个值,json提取器match no填-1即取全部:${variable_1}调用第一个值,${variable_2}调用第二个值。

四、断言

1.响应断言

针对响应的不同部分进行断言,响应头、响应文本…

【Main sample only】只作用于父节点取样器(一般的断言都选这个)
【JMeter Variable】只作用于jmeter变量(可写入正则提取的响应值)
【模式匹配规则】
  包括--响应结果中包含指定的内容,支持正则表达式;
  匹配--响应结果完全匹配指定内容,不区分大小写,支持正则表达式;
  相等--响应结果与指定内容完全相等,区分大小写,不支持正则表达式;
  字符串--响应结果包含指定的字符串,不支持正则表达式。

2.JSON断言

针对响应结果是 applicaton/json 格式的请求进行断言。
image
【Assert JSON Path exists】断言的json path,必填
【Additionally assert value】必须勾选才能填写预期结果
【Match as regular expression】勾选后结果栏可以支持正则表达式

3.断言持续时间

约定响应时间,响应时间如果超出约定,则断言为失败。

持续时间= load time(加载时间) = Sample Time(取样时间) = 响应时间:
从发送请求到收到最后的响应所花费的时间。不包括渲染请求所花费的时间,同时也不包括处理客户端脚本所花费的时间。

Latency延迟时间 <= 响应时间;从发送请求到收到第一个响应,所花费的时间。请求错误的情况下,延迟时间为0!

connect time(连接时间): 建立连接所花费的时间,包括SSL三次握手的时间。

举例:添加断言持续时间,设置持续时间60s,添加监听器--断言结果,得到
load time :66
connect time:46
latency:66
断言失败

五、定时器

· 定时器是在每个sampler之前执行的,无论定时器位置在sampler之前还是下面;
· 在执行一个sampler之前,所有当前作用域内的定时器都会被执行;
· 如果需要定时器只对其中一个sampler生效,则需要将定时器作为sampler子节点加入;

1.固定定时器Constant Timer

线程的标准等待时间,性能测试中相当于用户行为中的思考时间;固定定时器的延时不会计入当前sampler 的响应时间里,但是会计入事务控制器的时间。

2.同步定时器Synchronizing Timer

设置一个集合点,阻塞线程直到指定的线程数量到达后再一起释放,可以瞬间产生很大的压力。
【模拟用户组的数量】指定同时释放的线程数数量;
【超时时间以毫秒为单位】超时多少毫秒后同时释放指定的线程数。为0:若线程数一直达不到,就会一直等待。大于0:若线程数一直达不到,但到了超时时间,会释放已到达的线程。

3.固定吞吐量定时器Constant Throughput Timer

限制TPS,约定事物每分钟的执行数;

4.RPS定时器 jp@gc - Throughput Shaping Timer

限制RPS,End RPS对应RPS上限,需要预设足够的线程数,不然无法达到RPS目标。

六、控制器

1.循环控制器

该控制器下的请求执行次数 = 线程数 * 线程循环数 * 循环控制器循环次数。
如:线程数2,线程循环5,循环控制器循环3,循环控制器下请求将执行30次。

2.仅一次控制器

仅一次控制器下的请求,只在其父线程组/控制器的第一次迭代时执行。
如:
(1)线程数2,线程循环5次,仅一次控制器下请求将执行2次。
(2)仅一次控制器置于循环控制器下:线程数2,线程循环5次,循环控制器循环3次,仅一次控制器下请求将执行10次。

3.ForEach控制器

搭配用户自定义变量使用,ForEach控制器下的请求每次将读取不同的数据。
image

搭配提取器,用于遍历返回值。提取器匹配数字-1,取全部值。
image

4.事务控制器

【Generate parent sample】
不勾选:控制器下的请求是分开的,且事务控制器结果为空;
勾选:会把事务控制器下的所有请求当作一个事务,当其中一个接口报错,则事务也报错;
【Include duration of ..】一般不勾选,事务控制器生成的样本时间 默认不包括计时器,预处理和后置处理器的时间;
image

image
一个事务包含多个接口,有些接口又依赖前者接口的结果,因而就需要将这些接口统一放在一个事务控制器下进行性能测试,得到的性能测试结果才会更加接近真实的场景。

5.临界部分控制器

临界部分控制器使其下请求只由一个线程执行,确保其下请求执行的有序性,避免请求顺序错乱。

6.Include控制器、模块控制器

用来控制测试片段。

七、监听器

1.察看结果树

用于调试,性能测试时需要禁用,因为它打印了大量的东西,会消耗大量I/O、连带消耗cpu。
绿色代表响应码是2xx 或3xx,红色说明响应码是4xx 或5xx 。
所以要想确定请求返回的是正确的,必须要加上断言,只有断言成功才会显示绿色。

2.聚合报告

【Label】取样器名称;
【样本】发出的请求数量。线程数20,循环10,样本数就是2000;
【平均值】平均响应时间,单位ms毫秒,1s=1000ms;
【90%百分位】90%样本的响应时间;
【最小值】最小响应时间;
【异常】出错请求所占百分比;
【吞吐量】tps每秒事务数;
【接收】每秒从服务器接收到的数据量;

3.用表格查看结果

可以看到每个线程的启动时间,响应时间、状态等。

4.Transactions per Sencond

监听TPS,用来分析吞吐量。

5.Hits per Second

监听单位时间点击率,即触发的请求数。

6.Response Times Over Time

监听响应时间。

7.Active Threads Over Time

监听单位时间内活动的线程数。

8.Composite Graph

可将其他监听结果组合在一张图中查看。

9.保存测试结果

设置保存路径及文件名
image
保存为.csv格式打开若出现乱码:先用记事本打开,另存为--选择编码方式为ANSI,再用Excel打开。

八、配置元件

常用配置元件如下:

CSV Data Set Config:常用于参数化;参考:https://www.cnblogs.com/chenwt/p/15035345.html
HTTP Cookie Manager

  1. 自动存储和发送Cookie,如果一个http请求的响应中包含Cookie,那么Cookie Manager就会自动地保存这些Cookie并在所有后来发送到该站点的请求中使用这些Cookie的值。每个线程都有自己的"cookie存储区"。这种cookies不会在cookie管理器中展示出来,但可以在“查看结果树”中看到它们;
  2. 手动添加到Cookie管理器的Cookie,会被所有线程共享。手动添加时, 域、路径必须填上。因为Jmeter现版本默认不支持跨域的请求,不填的话设置的Cookie不会被带上。
  3. 接收到的Cookies可以存储为JMeter的线程变量。如果要把 cookies保存为变量,需要设置:
    “ CookieManager.save.cookies =true”。 
    这样在同一个线程(组)内其它操作组件就可以直接通过 ${COOKIE_Cookie名} 对cookie进行调用。而不用通过提取器提取的方式进行调用。
  4. 想要跨域存储cookies,需要设置 CookieManager.check.cookies =false
    参考: https://www.cnblogs.com/poloyy/p/13529201.html

HTTP信息头管理器:定制Sampler发出的HTTP请求的请求头内容;
HTTP 请求默认值:默认http请求的值,如server、ip、port、Protocol、path、parameters等;
JDBC Connection Configuration:搭配JDBC请求使用,详见: https://www.cnblogs.com/chenwt/p/15030426.html
用户定义的变量:通过自定义变量名引用
计数器

九、常用函数

1. __time

1.返回当前时间,包含多种格式:
  ${__time(yyyy-MM-dd HH:mm:ss,)}
2.如果省略了格式字符串,那么函数会以毫秒的形式返回当前时间。其他情况下,当前时间会被转成简单日期格式。
  YMD=yyyyMMdd : ${__time(YMD)}
  HMS=HHmmss  : ${__time(HMS)}
image

4. __setProperty、 __P

__setProperty设置属性,属性是 Jmeter 的全局属性,因此可用于在线程和线程组之间进行通信。
__P读取属性,与__setProperty搭配使用实现跨进程传递参数。参考: https://www.cnblogs.com/chenwt/p/15031084.html

3. __V

嵌套函数,实现字符串拼接。如:${__V( A ${N} ) } :N=1, __V 函数会返回 A1。
实例:https://www.cnblogs.com/chenwt/p/15039818.html

4.__counter

计数器函数,每次迭代加一,对应配置元件的计数器。

标签:__,常用,定时器,请求,控制器,响应,线程,组件,JMeter
来源: https://www.cnblogs.com/chenwt/p/15031232.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有