性能测试之接口关联和函数使用
性能测试之接口关联和函数使用
- 接口关联和函数使用
- 1、接口关联
- 1.1 什么叫做接口的关联
- 1.2 jmeter处理接口关联:后置处理器
- 1.2.1 json提取器
- 1.2.2 正则提取器
- 2、Jmeter函数
- 2.1 jmeter常用的函数
- 2.2 jmeter属性相关的函数
接口关联和函数使用
1、接口关联
1.1 什么叫做接口的关联
-
前端接口响应中,有后面接口请求所需要的参数值,那么这两个接口就存在关联
例如:token:用户鉴权(令牌),如果登录之后才能操作的接口,必须要接口鉴权,每个接口都需要带上这个token,这个token都是从登录接口返回的结果中获取的 -
中jmeter中,中前面接口请求中,添加一个后置处理器,把响应的内容提取出来,用一个变量进行接受,后面的接口需要的时候,直接引用这个变量就可以了
例如,后置处理器:每个接口发送完成请求后,会收到响应信息,处理这些响应信息所做的事情 -
调试取样器:一般用来做debug调试,查看中间变量的值,分析问题可以使用
1.2 jmeter处理接口关联:后置处理器
在jmeter中,后置处理器有:json提取器、正则提取器、边界提取器
1.2.1 json提取器
json表达式可以使用相对路径、绝对路径进表示
- 相对路径:
$..末梢节点名称【递归写法】
,推荐使用,例如:$..token
- 绝对路径:
$.根节点.二级节点名称
,如果由数组或列表,使用[0]进行取值
# 注意:
如果响应提取的数据不在响应体中,就不能用json提取器只能提取响应体内容,不能从其他地方提取
1.2.2 正则提取器
使用正则表达式写法【左边界(正则)右边界】
- 以小括号为标识,小括号里面的内容,就是正则表达式
- 正则表达式匹配的内容,就是要提取的数据
- 要准确的写出左边界和有边界
- 正则式要写正确,推荐使用外能匹配表达式
(.*?)
- 正则表达式,可以使用查看结果树里的,RegExp tester进行调试
- 正则提取器中的模板,写法 数字 数字 数字
- 如果正则表达式有多个括号(),那么这个模板就是取第几个括号的值
- 提取多个,就写多个分组(.*?)
- 匹配数字,跟json提取器一样,0随机,正数表示对应的值,负数表示所有
# 常用元字符
`.` 匹配除换行符以外的任意字符
\w 匹配字母或数字或下划线或汉字
\s 匹配任意的空白符
\d 匹配数字
\b 匹配单词的开始或结束
^ 匹配字符串的开始
$ 匹配字符串的结束# 常用的限定符
* 重复零次或更多次
+ 重复一次或更多次
? 重复零次或一次
{n} 重复n次
{n,} 重复n次或更多次
{n, m} 重复n到m次
(.*?)几乎能匹配所有的东西
2、Jmeter函数
函数就是方法,jmeter是java开发的,所有jmeter的函数其实就是java方法。
- jmeter函数,以双下划线开头+函数名称
- 函数调用,
${__函数名(,)}
双下划线开否,函数名严格区分大小写,所以,建议中使用函数时,我们使用jmeter自带的函数助手,直接复制,这样可以避免错误 - 如果函数由参数,就带小括号,没有参数,就不用小括号;多个参数之间用英文都好分割,多个参数时候,逗号不能少
- 函数的参数是可以引用变量的,参数可以是函数引用,就是函数的嵌套
变量是不可以调用函数的# jmeter的函数有两种* 自带的函数,如果digest函数
* 扩展函数,如安装一些插件才会有,md5函数,需要装jpgc的插件后才有
2.1 jmeter常用的函数
基础函数
1) ${__Random(,,)}
和 ${__RandomString}
:随机函数
- 函数可以引用变量
- 函数可以调用函数
2)${__time(,)}
:获取当前的时间戳函数,默认是时间戳,可以定义格式,年月日、时分秒、年月日-时分秒
3)${__CSVRead(,)}
读取csv文件的函数,可不用,直接使用CSV配置元件来替代
4)${__digest(,,,,)}
进行加密算法的函数,只能做简单的加密,支持MD2、MD5、SHA-1、SHA-224等算法
5)BeanShell
函数与BeanShell
元件
- 功能测试换行,如果想用jmeter写脚本,可以使用
BeanShell
函数或元件 - 性能测试中,不需要
6) ${__counter(,)}
:计数函数,用于计数,比如:发送了多少次请求
- 简单的累加,最大20亿数字
- 第一个参数,即True和false,默认false,不区分大小写
True:每个虚拟用户有自己的计数器,每个虚拟用户的计算器保持独立
False:全局计数器,所有用户共享一个计数器,例如:3个线程分别是1-2-3,默认是false - 第二个参数:生成的数字可以保存再一个变量里,供后续调用,如num,调用${num}
使用场景
* 统计发送请求的数量
* counter函数生成的数字做变量名的下标,实现循环依次调用多个变量,每个用户名不一样counter函数有个弊端,只会无限增1,不能限定范围,越界里就取不到数据了,可以使用计数器解决越界问题
7)${__V(,)}
:V函数,是一个拼接函数
- 第一个参数:可以是变量,也可以是函数,相互进行拼接,能实现变量里调用函数和调用变量
${__V(user${num},)}
:拼接变量和变量
${__V(user${__counrer(,)},)}
:拼接变量和函数
8)计数器:不是函数,是一个配置元件—对比counter函数功能
计算器是一个配置元件,可以控制生成一个数字从哪里开始,到哪里结束并间隔多少,限定一个区间,不会像counter函数一样,越界就取不到值里
总结__counter函数与计数器的区别* __counter函数比较简单,只能从1开始递增,不能设置起始值和最大值,一般只会用来计算没如果用于做下标,可能会越界* 计数器可以设置起始值和最大值,还能设置数字格式和递增步长,更为灵活,长度可以限定,不会越界如果统计个数的话,用__counter函数会更好
如果用来作为数字下标,计算器会更好
两个使用都需要借助V函数来拼接
2.2 jmeter属性相关的函数
用户定义的变量,是可以跨线程组使用的。用户参数,不能直接跨线程组使用* 在jmeter中,除了用户定义的变量,其他任何元件中定义的变量名称都是用户参数类型,都不能跨线程组使用* 所以需要使用属性进行跨线程组的变量调用
Jmeter属性中,分为静态属性、动态属性
- 静态属性:写在properties文件中的属性
- 动态属性:运行过程中动态设置的属性,关闭Jmeter工具,会自动消失,这个属性是存在内存里的,
【添加一个jmeter属性:在测试计划–非测试元件–属性显示,查看jmeter属性】
属性相关的操作
- 设置动态属性的函数:
${setProperty(,,)}
- 获取属性函数:
${property(,,)}
或者${__P(,)}
属性的使用场景
- 不能跨线程组船体的参数变量,如用户参数,可以设置为属性
- 属性是工具的属性,所有在哪里都可以用
- 在另外一个线程组中调用这个属性,实现变量的跨线程组使用
9)${setProperty(,,)}
设置动态属性函数
- 在函数里设置属性的名字和属性值,属性值可以设定固定值没有诶可以调用变量获取动态数据
- 调用
${setProperty(,,)}
函数,才会添加属性成功,如:在调试取样器或后置调试处处理程序里调用这个设置属性函数,执行就可以了 - 运行jmeter脚本,会执行这个函数的调用
- 一旦设置了属性,要关掉jmeter工具,才会释放,没关闭工具,属性一直都可用—存在内存中
10)${property(,,)}
和${__P(,)}
获取属性函数
-
直接调用jmeter属性的值,因为属性是多个线程组共享的,这样可以实现用户参数跨线程组使用
-
jmeter工具执行顺序
如果同一个线程组多个取样器,是从上到下依次执行的
如果多个线程组之间,并行执行,没有严格先后顺序 -
如果设置两个线程组,一个设置属性,一个获取属性,执行过程中,会出现如下现象:
因为jmeter中,默认的时候,多个线程组是并行运行的,有可能出现先后的执行差异
所以获取属性第一次可能没有值,但是不影响性能测试的结果。因为性能测试中执行的总次数远远大于1次
在功能测试中,如果希望每一次都可以取到值,可以设置固定定时器,延迟启动