
该函数用来给JMeter属性设置值,默认返回值为空字符串,所以函数在任何地方被调用都是有效的
该属性函数返回JMeter属性的值,如果找不到属性值且没有提供默认值,则直接返回属性名。在提供了默认值时就不需要写函数名(这里是指重用此函数计算的值的引用名,即变量名),它的参数可以设置为null,此时该变量将直接被忽略。
举例:
这是简化版的属性函数,旨在为用户在命令行使用属性定义。它不像__property函数那样有可以存值的变量,并且如果没有提供默认值,侧假定默认给1,原因是它对常见的测试变量(如循环、线程数、ramp up等)有效
varsget函数用来获取属性值
propsput函数用来设置属性值
propsget函数用来获取属性值
propsget函数用来移除属性
创建:添加->配置元件->用户定义的变量
作用:当前的线程组内所有Sampler都可以引用变量,方便脚本更新;当参数发生变化时,只要在用户定义的变量中更新对应变量的参数即可,不需要逐个修改每个>
将一个常量写成变量的形式,每次调用参数获得不同的数据。
PS: 这里要说下Cookie,在后面的参数化过程中发现登录接口请求头里要携带cookie;我一直的误解就是只有登录才有cookie产生,其实是不对的, 一般的cookie是会话被创建时就产生,关闭后就消失 ;可以随便访问项目的网页获取到cookie,然后想办法将cookie加到请求头里去~
1、CSV控制-CSV DATA Set Config
线程组 -> 新建请求 ->参数用变量代替 ,格式${变量名}
新建EXCEL文件,写入测试数据-> 另存为csv文件的格式;
线程组 ->添加配置元件->CSV DATA Set Config->在配置元件里输入csv的绝对地址 ->若CSV不含表头,则在CSV数据文件设置里输入表头变量;反之,则不添加;
2、用户自定义变量
比如有登录接口和获取token的接口,都需要输入用户名和密码,如果我在每个接口请求参数都输入一次,相当于输入了两次;那么,可以使用自定义变量,将用户名和密码的值存在一个变量里,后续的接口需要时直接调用参数即可,减少重复输入的次数。具体 *** 作如下:
线程组-> 添加配置元件->选择用户自定义变量->添加变量名及对应的值(key&value);
线程组 -> 新建请求 ->参数用变量代替,格式为${变量名},调用变量值;
PS: 用户定义变量的所有数据只会初始化一次,不管你多少线程,循环多少次,它的值是不变的(即同一个变量的值写死,不能改变)。 用户自定义变量作用域不同,表示的含义也有区别;放在线程组外,表示全部变量;放在线程组内表示局部变量。
3、用户参数
在调试脚本的时候,可以使用前置处理器中的用户参数组件进行数据的提供,在该数据中可以使用固定值也可以使用变量值。
线程组-> 添加前置处理器->选择用户参数->添加变量名,并输入多个对应的值
每次迭代更新一次:如果选中该选项,则参数的值在每个迭代中保持不变,在新的迭代开始时取下一个值。
PS:在使用用户参数时,如果有n个值,需要设置线程数=n,若设置循环为n,只会调用第一个值执行n遍。
4、函数助手
函数助手里内置了多个函数,如__Random或${__CSVRead(,)}等可以按需求使用不同的功能函数;
面板-> 选项-> 函数助手对话框-> 根据需要选择不同的函数-> 设置范围及变量名->后续接口调用。
${__CSVRead(,)}可以实现读取CSV数据,()里逗号左边是CSV路径,右边是CSV里存放的变量的索引;索引从0开始依次增加1,如 ${__CSVRead(D:\jmeter\loginstxt,0)}。 注:这里的CSV文件就不要表头了。
用户自定义变量的值写死,不能改变;而用户参数,可以引入函数助手,使得同一变量有不同的变量值。
在日常接口测试中,总会遇到获取token值的情况,比如通过登录接口返回的token,使用此token作为凭据访问系统里面的其它接口,这时我们就需要获取到登录接口返回的值,把token信息提取出来,然后保存起来给别的请求使用,或者做一些其它处理。
下面的这个例子讲解,如何通过正则表达式的方法获取参数值,首先需要先了解下相关语法,之后在进行实践。下示例中,要求提取登录接口的token、userid、username、unixtime等信息,介绍用正则表达式的方式来实现,提取一个,一次提取多个。
一、正则表达式语法
()括起来的部分就是要提取的
匹配任何字符串
+ 一次或多次
? 在找到第一个匹配项后停止
例如想匹配web页面的如下部分,<title> 正则表达式例子</title> 提取语法:<title> (+)</title>
使用场景:第二个请求参数中需要加入第一个请求的返回值时;通过正则提取器可以提取第一个请求返回值中指定的字段信息并赋值在第二个接口里面。
小技巧,想要看到变量,取样器—Debug Sampler 调试器,会把变量打印出来。
二、实践例子
第一步:例如有以下登录接口,在第一个接口成功之后,需要提取token、userid等参数
第二步:在需要提取数据的接口 右击 --》添加 --》后置处理器 --》正则表达式提取器
第三步:用正则提取:响应结果种单个字段值,设置变量名,设置左右边界(+)表示匹配任意长度
第四步:查看正则表达式,提取的相关变量值
jmeter 中,用 JSON 提取器,一次提取多个值,这个很多人都会。但是,用正则提取器一次提取多个,是否可以呢?
肯定,很多人都自信满满的说,可以!形如: token":"()","identity":"()" 写一个这样的正则表达式,不就是可以提取两个了吗!
是的,这种做法没有错,但是,你发现一个问题吗?你的“ Name of created variable 引用名称” 应该怎么填呢?你是填一个,还是多个,多个你又用什么符号来分隔呢? 软件测试面试宝典
然后,然后你就楞住了,因为你不能用正则提取器,同时把提取的多个值写到对应的变量中,虽然你理想的写了多个变量名称,也用符号分隔了,结果,你用调试取样器查看得时候,你发现,你取的多个值,都在一个变量里面了,而且这个变量带有符号。
什嘛,不能一次提取多个?哪我要用多个,怎么用?
这里,给大家讲两种方法:
方法一: 如果你眼睛比较尖,你可能从上面一张图,已经看到了曙光。在上一张图中,我们又 retoken,iden_g1 和 retoken,iden_g2 看到了吗?他们的值是不是就是你想要的呢?
所以,我们可以在一个正则提取器中,同时提取多个值,多个值时,模板之间不用分隔符号,用一个变量接收,然后在关联使用时,使用变量名称_g1、变量名称_g2 依次类推,就可以了。
方法二: 既然用一个变量接收,他会接收全部的提取值,那我就把值拆开。用一个定义的标点符号,拆开成多个值。
写多个正则表达式,用 1 个变量接收,模板之间用 逗号 分隔
用一个 split 函数,进行拆分,放入新的变量中
从调试取样器中,可以看到拆分之后的结果
使用新的变量名称,注意,使用第一个变量,则用 新变量名称_1
最后,请求,在查看结果树中,看到请求的结果,已经使用拆分后的值了。
好了,两种方法都 get 到了吗?
1、__counter
每次调用计数器函数都会产生一个新值,从1开始每次加1。计数器既可以被配置成针对每个虚拟用户是独立的,也可以被配置成所有虚拟用户公用的。如果每个虚拟用户的计数器
是独立增长的,那么通常被用于记录测试计划运行了多少遍。全局计数器通常被用于记录发送了多少次请求,计数器使用一个整数值来记录,允许的最大值为2,147,483,647。
Jmeter官方说法是
:如果希望每个模拟用户的计数器保持独立并与其他用户分开,则为TRUE。 全局计数器为FALSE。
但是根据我本人测试,感觉为true和false没什么太大的区别。使用场景如下:
1,递增某一个参数或者在请求中加入计数器方便查看发送了多少请求
2,循环控制器的运行次数
在实际请求中,我们往往需要用到循环控制器运行到第几次的变量,那我们改怎么做呢?
看下图的示例:
linecountb就是运行第几次了
3,__Time时间函数,可以显示不同的时间格式,常见的如下
"yyyyMMdd G 'at' HH:mm:ss z" 20010704 AD at 12:08:56 PDT
"EEE, MMM d, ''yy" Wed, Jul 4, '01
"h:mm a" 12:08 PM
"hh 'o''clock' a, zzzz" 12 o'clock PM, Pacific Daylight Time
"K:mm a, z" 0:08 PM, PDT
"yyyyyMMMMMdd GGG hh:mm aaa" 02001July04 AD 12:08 PM
"EEE, d MMM yyyy HH:mm:ss Z" Wed, 4 Jul 2001 12:08:56 -0700
"yyMMddHHmmssZ" 010704120856-0700
"yyyy-MM-dd'T'HH:mm:ssSSSZ" 2001-07-04T12:08:56235-0700
"yyyy-MM-dd'T'HH:mm:ssSSSXXX" 2001-07-04T12:08:56235-07:00
"YYYY-'W'ww-u" 2001-W27-3
4, {__timeShift(yyyy-MM-dd HH:mm:ss,,-P60D,,)}
yyyy-MM-dd HH:mm:ss表示格式
-P表示减去的天数(后边有D的时候)
-PT表示减去的小时或者分钟(不满一天或者不以天为单位的时候)
不要减号就是增加的意思
5
While控制器 将运行其子代,直到条件为“ false ”。
可能的条件值:
条件可以是最终计算为字符串“ false ”的任何变量或函数。这允许根据需要使用 __jexl3 , __groovy 函数,属性或变量。
1、参数为空
当while参数设置为空,此时其子节点下 最后一个 节点运行失败,才会停止;否则,会一直循环下去(哪怕只有一个失败也不行,需要全部都失败了,才退出)
设置某个请求地址不存在,再次执行,发现失败后,还是会一直在循环执行。
设置所有的请求地址,无法请求,所有请求失败后,退出循环执行
2、参数为LAST
当参数设置为LAST时,如果while controller的上一个节点运行失败,则不再执行while controller;否则继续执行,与参数为空的情况一致
修改上一个节点查询不同状态订单all请求失败,再执行,While控制器里面的不会再请求
修改上一个节点查询不同状态订单all请求成功,执行,与参数为空的情况一致
3、参数为表达式
当参数为表达式时(需要经过__jexl3函数进行转换,可以使用函数助手生成表达式),如果表达式的结果为true,则执行while controller;反之则不执行,所以在参数中也可以直接输入true或者false来控制是否执行while controller
例如:
定义环境变量
使用表达式判断,status==all时,while执行
使用表达式判断,status!=all时,while执行
前言
参数化是自动化测试脚本的一种常用技巧。简单来说,参数化的一般用法就是将脚本中的 某些输入 使用参数来代替,比如登录传参、post、delete、put等请求传参,在脚本运行时指定参数的取值范围和规则;
这样,脚本在运行时就可以根据需要选取不同的参数值作为输入。这种方式通常被称为数据驱动测试(Data Driven Test),参数的取值范围被称为数据池(Data Pool)。
jmeter的test plan中,支持如下 4种参数化方式 :
CSV Data Set Config:CSV数据控件(常用)
函数助手:_CSVRead
User Defined Variables:用户定义的变量
User Variables:用户参数
本文列举post传参请求的参数化,系统:mac,jmeter版本:33
首先新建一个测试脚本,可以自己手动编写(或者通过工具(badboy)录制),推荐手动编写
界面如下:
这里可以对参数id、name进行参数化,将用户名密码写入txt文档, 保存为dat格式,编码类型选择UTF-8 ;
因为配置元件——CSV Data Set Config对参数化的格式要求比较严格,用户名密码一一对应,之间用 半角英文逗号隔开
然后将保存的dat文件放入计算机中,这里我放入路径为:/Users/xxxxxx/apache-jmeter-33/test/data
下面具体介绍参数化常用的的四种方法:
一、配置元件——CSV Data Set Config
点击线程组→配置元件→ CSV Data Set Config:
说明:
Filename: dat文件名,保存参数化数据的文件目录,可选择相对或者绝对路径(建议填写相对路径,避免脚本迁移时需要修改路径);
File encoding: UTF-8,dat文件的编码格式,在保存时保存编码格式为UTF-8即可;
Variable Names (comma-delimited):对对应参数文件每列的变量名,类似excel文件的文件头,起到标示作用,同时也是后续引用的标识符,建议采用有意义的英文标示;
(如:有几列参数,在这里面就写几个参数名称,每个名称中间用分隔符分割,这里的 user,pwd,可以被利用变量名来引用:user,user,{pwd};
Delimitet: 参数文件分隔符,用来在“Variable Names”中分隔参数,与参数文件中的分隔符保持一致即可;
Allow quote data: 是否允许引用数据,默认false,选项选为“true”的时候对全角字符的处理出现乱码 ;
Recycle on EOF?: 是否循环读取参数文件内容;因为CSV Data Set Config一次读入一行,分割后存入若干变量中交给一个线程,如果线程数超过文本的记录行数,那么可以选择从头再次读入;
△ Ture:为true时,当已读取完参数文件内的测试用例数据,还需继续获取用例数据时,此时会循环读取参数文件数据(即:读取文件到结尾时,再重头读取文件);
△ False:为false时,若已至文件末尾,则不再继续读取测试数据;通常在“线程组线程数 线程组循环次数>参数文件行数”时,选用false(即:读取文件到结尾时,停止读取文件);
Stop thread on EOF: 当Recycle on EOF为False时(读取文件到结尾),停止进程,当Recycle on EOF为True时,此项无意义;
△ 若为ture,则在读取到参数文件行末尾时,终止参数文件读取线程;
△ 若为false,此时线程继续读取,但会请求错误,因此时读取的数据为EOF;
Sharing mode: 共享模式,即参数文件的作用域,有以下几种方式:
△ All threads:当前测试计划中的所有线程中的所有的线程都有效,默认;
△ Current thread group:当前线程组中的线程有效;
△ Current thread:当前线程有效;
完成之后,将刚才生成的参数写入参数对应的值里面:
设置线程组循环次数:
运行,可以看到每次运行依次往下取值:
二、函数助手:_CSVRead(参数化功能较弱)
点击jmeter的界面,功能栏选项→ 函数助手对话框→ _CSVRead
CSV file to get values from | alias :CSV文件取值路径,这里写入参数化文档存放路径
CSV文件列号| next|alias :文件起始列号:CSV文件列号是从0开始的,第一列为0,第二列为1,以此类推。。。
函数字符串 :即生成的参数化后的参数,可以直接在登陆请求中的参数中引用,第一列为用户名,函数字段号为0,第二列为密码,函数字段号为1,以此类推进行修改使用即可
设置线程数,注意:这里如果仍按方法一里设置循环次数,执行时始终只取第一个数据,所以要设置线程数
执行脚本,察看结果树,可以看到请求的参数都是参数化后的数据
三、配置元件——User Defined Variables
点击线程组添加配置元件→ User Defined Variables(用户定义的变量):
如上图所示,在该参数组中已经定义了两个参数,通过界面下方的添加、删除按钮可以向参数列表增加和删除参数,Up和Down可以上下移动参数的位置;
值可以直接输入,也可通过函数__CSVRead从文件中读取, 还可以通过前缀加随机数和方法获取 。
比如用户名为user_0到user_100的用户,那么用户名可设置名user_${__Random(0,100,)}
但是这种每次执行的多个线程所替换的参数一样,因为先获取到随机参数,再执行多个>
以上就是关于Jmeter几种常用函数用法 __setProperty,__P,vars,props全部的内容,包括:Jmeter几种常用函数用法 __setProperty,__P,vars,props、jmeter参数化(三种方法)、浅学Jmeter性能测试:参数化等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)