jmeter学习笔记02 - 取样器01

举报
何时解放 发表于 2020/11/05 16:00:48 2020/11/05
【摘要】 各种取样器

红字部分为不懂,有机会再补充

右键功能

右击线程组,除了“添加”里面有各种组件外,还有3选项。

不停顿启动按不停顿开始按键执行脚本,不会按照设置好的运行,开始后准备好的线程数直接发起请求。不停顿开始会让集合点失效。

验证:无视线程数,循环数,所有请求仅执行一次,而且一个请求报错后,不会执行后面的请求。遇错而止

为子线程添加响应时间:批量添加thinktime

添加


取样器-HTTP请求

使用频率:NO.1

也支持HTTPS,jmeter学习笔记01已介绍过HTTPS的证书导入方式。

  • 基本页面-自动重定向,以及后面4个选项说明

  1. 自动重定向+跟随重定向:怎么看都是跟随重定向通吃,所以自动重定向有什么情况是必须的,目前还不清楚,等待后面实际遇到。下面为网友的说明:

    3XX的请求一般要使用跟随重定向,200的请求任意都可以。

    自动重定向只有一个最终的响应结果,不会有过程,跟随重定向会记录请求每一步的路径

  2. 使用keepalive:词义,保持会话,默认也是勾选的。网友解释“http请求,客户端带上了keep-alive之后,这个连接可以复用,即一个http请求处理完之后,另外一个http请求会从这个连接走。”但是带一个横杠后,意思就不同了。参见网友解释: https://www.jianshu.com/p/9fe2c140fa52

  3. 对post使用multipart/form-data:主要用于post请求体中需要上传文件的场景。使用方法,百度上有很多例子。

  4. 与浏览器兼容的头:当勾选multipart/form-data时,勾选此项会截掉http请求头中的Content-Type和Content-Transfer-Encoding,而只发送Content-Disposition部分;效果or场景不明白,测试了也没啥区别。

  • http请求下拉框:

  1. GET,POST不再说明

  2. HEAD:HEAD方法与 GET 方法类似,也是请求从服务器获取资源,服务器的处理机制也是一样的,但服务器不会返回请求的实体数据,只会传回响应头,也就是资源的“元信息”。基本上不会用这种方式

  3. PUT:如果URL可以在客户端确定,那么就使用PUT,如果是在服务端确定,那么就使用POST。POST方式完胜PUT的原因就是安全,POST请求换成PUT,执行报错,不被服务器接受。

  4. OPTIONS:

    OPTIONS请求方法的主要用途有两个
    1、获取服务器支持的HTTP请求方法;也是黑客经常使用的方法。
    2、用来检查服务器的性能。例如:AJAX进行跨域请求时的预检,需要向另外一个域名的资源发送一个HTTP OPTIONS请求头,用以判断实际发送的请求是否安全。

  5. DELETE:

    HTTP提供了一个与PUT方法对应的DELETE方法。一个DELETE请求将需要从Web服务器删除的内容指定为请求行中的资源部分。
    DELETE方法唯一有趣的地方在于当你接收了一个标识为200 OK的响应的时候,那并不意味着指定的资源已经被删除了。那仅仅说明服务器接收到了删除资源的命令。这一例外允许了出于安全考虑的人为的干预

  6. TRACE: 

    TRACE和TRACK是用来调试web服务器连接的HTTP方式。
    支持该方式的服务器存在跨站脚本漏洞,通常在描述各种浏览器缺陷的时候,把"Cross-Site-Tracing"简称为XST。

  7. 其他还有很多种请求方式,不再一一描述,在配置好录制功能后,可以录制一些主流网站,仅能看到GET,POST,故无需学习其他方式,仅当抓包或录制遇到了,再查资料好了。

  • 内容编码:常用的为utf-8,可以解决中文乱码。设置时,不必在此处设置,去\apache-jmeter-5.3\bin目录,找到jmeter.properties里面有一行#sampleresult.default.encoding=ISO-8859-1,可以考虑不动它,在它下面加一行sampleresult.default.encoding=utf-8即可。

  • 参数列表区域-编码?这个选项,勾选后,可以对中文进行编码。避免明文展示,是安全性的一环。比如下面2种请求结果:

    未勾选编码:GET https://www.baidu.com/?测试=测试值

    勾选编码:GET https://www.baidu.com/?%E6%B5%8B%E8%AF%95=%E6%B5%8B%E8%AF%95%E5%80%BC

    编码这个勾不勾,执行结果不会变化,就是URL是否转码的区别。jmeter的内部处理逻辑通吃。

  • 参数区域-内容/类型:从录制结果来看,都是一样的值text/plain,假如遇到不同的情况,按实际为准。

  • 包含等于?这个选项也是默认勾选的,有个例子,一看就懂,感谢这位网友:


  • 消息体数据页签:参数的另一种形式,格式未json串。而且,这个页签跟参数页签冲突,一旦某个页签填入数据,另一个页签被锁死,无法点击。

  • 文件上传页签:需同时勾选“对post使用multipart/form-data”,而且必须得是POST方式。

  1. 文件名称,填写需为绝对路径。

  2. 参数名称,抓包到什么,就填什么。

  3. MIME类型的写法,参照下面2张表,填入对应的格式。也可以参考抓包到的情况,最直接。


类型 文件后缀 格式
超文本标记语言文本 .html text/html
普通文本 .txt text/plain
XML 文件 .xml text/xml
PNG 图片 .png image/png
GIF .gif image/gif
JPEG 图片 .jpeg、jpg  image/jpeg
类型 文件后缀 格式
表单中进行文件上传
multipart/form-data
表单默认提交数据的格式
application/x-www-form-urlencoded
XML 数据格式
application/xml
JSON 数据格式
application/json
PDF 文件 .pdf application/pdf
RTF 文本 .rtf application/rtf
GZIP 文件  .gz application/x-gzip
TAR 文件 .tar application/x-tar
AVI 文件 .avi  video/x-msvideo
MPEG 文件 .mpg、.mpeg video/mpeg
  • 高级选项卡


  • 客户端实现:简述如下:java实现适合压榨性测试,httpclient4适合真实场景的模拟。2种方式执行都成功。入门的话,就默认空选项(即httpclient4),想深入些,可以考虑查这方面资料。

  • 超时,有2个设置项,可以尝试下1毫秒,看看。基本都报错。这个选项适用场景还是挺好的,设置个阈值。如单笔请求,花费100毫秒的情况下,压测过程中,服务器变慢,就能看到多少笔之后,开始大量报错。是观测性能的另一种方式。

  • 从 HMTL文件获取所有内含资源:翻译很到位,实际测试一下,能发现结果树里面,勾不勾,有区别。据说勾选后更真实模拟用户。

  • 源地址4个选项:只用于http协议且Implementation为HttpClient4的情况 ,此属性用于启用IP欺骗。会重写了这个http请求使用的默认本地IP地址。用于Jmeter主机具有多个IP地址(即IP别名、网络接口、设备的情况。该值可以是主机名、IP地址或网络接口设备,如“ey0”或“l0”或“wlan0”

  1. IP/主机名:IP /主机名以使用特定的IP地址或(本地)主机名 

  2.  设备:选择设备以选择该接口的第一个可用地址,该设备可以是IPv4或IPv6。 

  3. - 设备IPV4:选择IPv4设备来选择名称设备的IPv4地址(如eth0, lo, em0); 

  4. - 设备IPV6:选择IPv6设备来选择名称设备的IPv4地址(如eth0, lo, em0);

  • 代理服务器: 不想用本机的地址来发送Http请求而想使用代理服务器则填写

    保存响应为MD5:响应变成MD5转码。不过转出来的结果特别短,测了下,不太正常。场景存在性目前不明朗

    取样器-TCP取样器

  • HTTP是对当下主流的B.S架构的测试,对于一些C.S架构的软件,用这个可以测一些。不过,发送的报文要怎么填?

  • 参考了一篇:https://blog.csdn.net/woshilishu/article/details/86589558 

  • 自带了3个类,第一个用成功了,第二个报错,第三个JMETER直接死机了。

  • 想要找一个TCP服务器,可以通过任务管理器——资源管理器,在网络那一页,有个TCP展示列表。随便找一个客户端软件,然后拿到服务端IP+端口。

  • 回JMETER, 测试报文肯定是有要求格式的,我直接瞎输入了一堆。然后,执行是成功了,nginx返回的是400错误,错误信息记录在response里面。

  • 深入场景,以后再抓下TCP的包,然后拿到请求报文。


    取样器-测试活动

使用频率: 一般,看测试体积大小。调试的时候也好用。

其实是个控制器(continue;break;以及多线程的stop)。不知为何放在取样器分类里面。效果肯定是有的,下面会展开介绍。怎么用,看个人需要。

测试活动取样器是一个适用于条件控制器的取样器。测试元件不是生成样本,而是暂停或停止所选目标。此取样器也可以与事务控制器结合使用,因为它允许包含暂停而无需生成样本。对于可变延迟,将暂停时间设置为零,并将定时器添加为子级。完成正在进行的任何样本后 ,“stop”操作将停止线程或测试。“Stop Now”操作将停止测试,而无需等待样本完成; 它会中断任何活动样本。如果某些线程未能在5秒的时间限制内停止,则将在GUI模式下显示一条消息。您可以使用Stop命令尝试停止线程,如果不能停止,可以手动退出JMeter。在CLI模式下,如果某些线程未能在5秒的时间限制内停止,JMeter将退出。

  • logical action on thread,4个选项分别是

  1. “暂停”,而且后面的豪秒数,仅配合暂停使用。

  2. start next thread loop: 开始下一个进程循环

  3. go to next iteration of current loop: 转到当前循环的下一个迭代。

  4. break current loop: 终止当前循环。

效果实测:仍采用测1,测2,测3,三个http请求作为测试环境。

  1. 暂停,及暂停豪秒数,均生效。且测试活动摆放的位置,直接影响在什么时候暂停。如图:测1完成后,暂停5秒,测2测3再执行。

    2. 3.start next...  实测,跟go to next iteration of current loop ,完全一样。看不出区别,后续再研究吧。都是continue的意思。

    4. 等于循环语法里面的break 

  • logical action on thread/test: 这个选项跟上面的logical 功能冲突,只能选一种。其效果是终止线程,当存在2个及以上线程数时,可以尝试使用。

实测效果:

  1. 选择current thread 时,感觉跟上面的break current loop 没区别,不会影响其他线程,只会中断循环。

  2. 选择ALL thead 能干掉其他线程数。

测试活动上,右键,加的东西里面,有些有效,有些无效。比如固定定时器,加个10秒,是在所有执行结果出来后,出现了10*2个线程数的延续时间,20秒后,才结束本次执行。右键加个结果树+汇聚报告,这个不是采样,根本不会有东西出现。右键功能,慎用,不懂就不要乱加。这种嵌套的,学习阶段不解释,后面在使用上积累一定经验后,也许会补充一篇稍微复杂的嵌套功能范例。


取样器-调试取样器

debug sampler : 使用频率应该排NO.3 ,变量使用是非常频繁的,方便查看调试。

调试取样器,它是我们在开发脚本的时候调试用的。添加调试取样器后在察看结果树中能看到我们在脚本中所有参数化变量所取的值,这样有利于我们排错。这个是展示变量,不是HTTP请求的参数,要区分清楚

  • JMeter属性:默认关,内容会太多。

  • JMeter变量:默认开,这个是主要的观测点。

  • 系统属性:默认关,感兴趣的话,可以都开了,结果树那边,对于调试取样器的response内容观查就看出开关效果了。

取样器-OS进程取样器

  • 使用频率应该挺高 ,通常组合使用

  • 其存在的意义是辅助任务脚本执行。在性能测试不是单个取样的情况下,组合场景需要一些辅助命令,功能同python调用os类,执行cmd命令或者bat脚本。

  • 上图是一个最简单的,执行bat脚本的例子。

  • 直接运行CMD命令,需要使用命令行参数。命令:后面输入CMD,等于调用了CMD.EXE,然后在命令行参数那边输一行/C,从第二行开始正常敲入cmd命令。为何要这个/C不太明白,网上查到的。

  • 运行python,命令:后面要指定python目录的python.exe , 后面命令行参数,摆上.py文件。工作目录设置一下py文件的所在目录。

  • 环境变量:临时的,不会写入系统或用户环境变量。

  • 标准流(文件):输入这一项,还没测试出来怎么用。输出的结果,错误,是可以写入文件的。选一个txt文件即可。不存在的文件,也会自动创建文件。这边还是覆盖模式,所以在循环中,要注意。

  • 检查返回码:没法尝试。压根就没返回码。


取样器-JSR223 

使用频率:非常低,需要深入学习,高手适用。一般民众请跳过

先说一下某高手曾经实战的必需场景:

Jmeter性能测试中使用JSR223采样器实现Ajax异步请求,因浏览器对Ajax请求可能是并行执行,而Jmeter只能进行串行执行,测试结果存在偏差。采用JSR223,但JSR223Sampler继承的是JSR223TestElement类,并没有获取Cookie管理器对象的方法,设置Jmeter属性 CookieManager.save.cookies=true, 此后在运行时每条cookie会存储为一个jmeter的变量(变量名默认以COOKIE_作为前缀),后面不多说了,从高手的经验来说,脚本采样是强于HTTP采样。

相比于BeanShell 取样器,JSR223取样器具有可大大提高性能的功能(编译),同时支持更多的脚本语言,其中包括BeanShell脚本,所以在编写脚本时不建议使用BeanShell 取样器。JSR的比较专业的解释参见:https://zhuanlan.zhihu.com/p/100838926 ,或打算了解一下,就看下面。

  • 什么叫 JSR: JSR是一种规范,目前是223版本,这不是一种语法,而是涵盖很多种语法的规范。从界面上看,可选语言就有很多,BeanShell就是其中之一。

  • 语言解释:

  1. beanshell;bash;java  这3种语言,后面括号内的展示是一样的。实际使用上,也看不出差别

    BeanShell是一种完全符合Java语法规范的脚本语言,并且又拥有自己的一些语法和方法;

    BeanShell是一种松散类型的脚本语言;

    BeanShell是用Java写成的,一个小型的、免费的、可以下载、嵌入式的Java源代码解释器,具有对象脚本的特性;

    BeanShell可以执行标准Java语句和表达式,以及另外自身的一些脚本命令和语法。

  1. groovy,是一种基于JVM(Java虚拟机)的敏捷开发语言,它结合了Python、Ruby和Smalltalk的许多强大的特性,Groovy 代码能够与 Java 代码很好地结合,也能用于扩展现有代码。由于其运行在 JVM 上的特性,Groovy也可以使用其他非Java语言编写的库。所以,beanshell能用的,放到groovy上基本也能用。

  2. Javascript ,JS是很常见的,但是目前从BeanShell切JS,上图3行语法第一行就报错了。

  3. 其他语言:不打算了解。

  • 参数:输入参数值,多个参数值用空格分开。使用上没成功。

  • 覆盖脚本:同样不会用

  • JSR223 作为前置处理器,其图标不同,但版面跟这边是一样的,后面有条件,可以做个功能对比。目前还是没能做一个例子出来


取样器-JDBC Request

使用频率:NO.2  哪个项目能不用数据库呢?直接测数据库性能,可以帮助诊断到底是代码烂,还是数据库没配置好。官方没汉化。

  • variable name bound to Pool : 变量名绑定到池的唯一标识。与JDBC request中的相对应,决定JDBC取样的配置。简单理解就是在JDBC request的时候确定去哪个绑定的配置。配置数据库在别的地方,之前bolt request 也是。“配置元件”——里面找。这边先假设已经配好了一个mysql的链接。有个插曲,报错提示没有mysql的jdbc,要去准备一个mysql的jdbc jar包,放到\apache-jmeter-5.3\lib\ext 这个目录下,并重启jmeter,才行。mysql是最简单的,本地装个MySQL服务端也很快。直接写句select,执行成功看到数据response。发现一个奇怪的现象,负载1万笔查询,对本地CPU占用提了起来。但是在执行完毕后,这个CPU占用仍这么高,要关闭JMETER才行。没查到答案

    如果要执行多条SQL语句,后面还要添加“?allowMultiQueries=true”

  • query type: sql语句类型的选择。select,update必须对应,否则报错。UPDATE同时也能适用于insert delete操作。其他的选项

  1. callable statement: 可赎回 模式。翻译过来不明白,不过尝试后,这个模式可以支持select以及非select,多条SQL。总之,就是好用。

  2. prepared select statement: 准备选择声明 prepared select statement   例子:select * from abc where id=?; 这个问号,就是在下面的Parameter values 那边做替换。多个参数用,隔开。同时必须指定每个参数的类型。比如VARCHAR,numeric 这个类型去数据库查?整数,适用INT就不行,但mysql是支持INT的,所以感觉这个参数类型是java语法的类型。不行的话,就只能查,反复试。

  3. prepared update statement: 带参数模式的update申明。PS:PreparedStatement的第一次执行消耗是很高的. 它的性能体现在后面的重复执行。

  4. commit : 首先在配置数据库那边,不能是自动提交,如果自动提交,这边就没意义了。报错信息会明确提示。

  5. roallback : 同上,假如自动提交,是没法回滚的。

  6. autocommit(false) : 当处于自动提交状态时,用这个AutoCommit(false)的意思是AutoCommit(假),即将用户操作一直处于某个事务中,直到执行一条commit提交或rollback语句才会结束当前事务重新开始一个新的事务。

  • variabale names: 把结果赋值给变量。假如查出的有2列数据,那就需要2个变量,否则只能存下前面的列。示例:

    name_#=11  这是变量名带有的总数量。等于自动帮你做了count函数。11笔结果。

    name_1=2147483647

    name_10=null

    name_11=null

    ...... 变量名_序号,分别展示出11笔的值。在适用变量时,就要${name_1}这样。

  • result variabale name: 如果指定,这将创建一个包含行映射列表的Object变量。每个映射都包含列名称作为键,并包含列数据作为值。加一个调试取样器,就能看到变量值,例如:[{name=wucheng333, id=2147483647}, {name=WUCH, id=null}, {name=WUCH, id=null}, {name=WUCH, id=null}, {name=WUCH, id=null}, {name=WUCH, id=null}, {name=WUCH, id=null}, {name=WUCH, id=null}, {name=WUCH, id=null}, {name=WUCH, id=null}, {name=WUCH, id=null}]

  • 超时参数,不解释了。

  • limit 参数,也不解释,等于sql里的limit

  • handleresultset: 处理结果集,自己试试,没啥区别。不懂

        定义如何处理可调用语句返回的ResultSet:3个值分别解释如下:

  1. 另存为字符串(默认)-“变量名”列表中的所有变量都存储为字符串,当列表中存在时,将不会遍历ResultSetCLOB将被转换为字符串。BLOB将被转换为字符串,就好像它们是UTF-8编码的字节数组一样。无论CLOB S和BLOB旨意后,被切断jdbcsampler.max_retain_result_size字节。

  2. 存储为对象-变量名称列表上ResultSet类型的变量将存储为对象,并且可以在后续测试/脚本中进行访问和迭代,而不会遍历ResultSet如同选择了“存储为字符串”一样处理CLOBBLOB将存储为字节数组。无论CLOB S和BLOB旨意后,被切断jdbcsampler.max_retain_result_size字节。

  3. 计数记录-通过将记录计数显示为结果,将迭代ResultSet类型的变量变量将存储为字符串。对于BLOB,将存储对象的大小。


【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。