目录
0、JMeter关联
-
关联
- 关联是通过JMeter元件从服务器的响应数据中提取动态数据的过程
-
动态数据可以应用于后续的取样器请求等
- 比如sessionid,token等
-
你想象一下,你的业务接口,比如获取订单,你是不是每次都得带上你的登录信息(一般是在header里面设置的)
-
但是每次登陆的token是不是不一样,难道你每次手动去调用一下登录接口,拿到token,然后再手动copy进去获取订单的header里面去修改吗
-
肯定麻烦呀,所以就有了动态获取到登录接口返回的token值,再动态的设置到你的后续接口中去使用的这样一种场景
-
- 关联是通过JMeter元件从服务器的响应数据中提取动态数据的过程
-
关联类型:
- 1)cookie的关联,可以用cookie管理器<这种方式现在基本很少用,知道有这种就ok了>
-
2)比如token这种,就是通过后置处理器如json提取器、正则表达式提取器、xpath提取器等将返回值提取出来,作为后续接口使用
-
后置处理器
- 是JMeter的关联元件
-
可以从服务器响应数据中查找需要的数据
-
诸多的后续处理器元件可以适用于不同的关联和信息抽取场景
-
关联只需要会正则表达式提取器和json提取器,一般就够用了,不够用再去研究,大同小异!
1、正则表达式提取器
-
说明:
- 引用名称
- 请求要引用的变量名称,如填写numer,可以使用${number}来引用
-
正则表达式
- 匹配需要的内容
-
模板
- 用$num$引用起来
-
如果在正则表达式中有多个匹配数据,num表示匹配到的第几个值给变量
-
如$1$表示匹配到的第1个值存储在变量中
-
比如正则表达式有3个小括号【这就表示有3组值咯】,而上面的定义的变量只有一个,这个时候,你取哪个呢?
- $1$表示取的是第1个小括号里面匹配到的值赋值给变量
-
$2$表示取的是第2个小括号里面匹配到的值赋值给变量
-
$3$表示取的是第3个小括号里面匹配到的值赋值给变量
-
匹配数字(0代表随机)
- 0代表随机取值,-1代表全部取值
-
【如果你不确定,就不填】
-
缺省值
- 如果参数没有取到值,那默认给一个值让它取
- 引用名称
-
示例1:
- 单个值提取
-
第一个get请求的返回数据里面取一个值,作为我第二个post请求的body里面的参数
-
示例2:
- 通过正则表达式提取器一次提取多个值
-
使用的语法是,${变量名_g数字} # 数字就是你要取第几个匹配到的值
-
这种不知道怎么写的话,是可以通过加一个调试取样器来帮助查看的
2、json提取器
-
json提取器的语法:
- $
- 表示根节点下的所有数据
-
.或者[]
- 表示子节点,如$.store表示根节点下的store节点下的所有数据, $[store]一样,常用"."的方式
-
..
- 可以实现递归搜索【说白了,就是任意节点】,如 $..title表示搜索json中所有key为title属性的值
-
*
- 通配符,表示任何元素,如$.*.book表示根节点下所有节点的book节点数据
-
@
- 在表达式中使用,表示当前节点对象
-
['<name1>','<name2>']
- 如$..['author','price']表示所有节点中author和price的值
-
[<number1>,<number2>]
- 如$..[1,2] 表示所有节点中下标为1和2的节点的值,常用于数组
-
$..book[2]
- 表示取json中book数组的索引为2的值
-
$..book[0:2]
- 表示取json中book数组的索引为0到2的值
-
[?(<expression>)]
- 过滤器表达式,表达式结果必须为布尔值
-
$..book[?(@.isbn)]
- 表示取book数组下有名为isbn属性的节点数据
-
$..book[?(@.isbn and @.price>10)]
- 表示取book数组下有名为isbn属性且价格属性值大于10的节点数据
-
"and"如果报错,可以换用"&&"
-
当然或者可以用"||"
-
后置处理器的json提取器用于对返回结果【json形式的】进行提取
-
必须作为取样器的子级添加,类似正则表达式提取器
-
说明:
- Apply to
- 应用范围
-
Names of created variables
- 自定义的变量名,如果要提取多个值,你需要定义多个变量,那么用分号";"进行分隔
-
JSON Path expressions
- 自定义的json提取表达式,同样的,你需要定义多个提取的表达式,那么用分号";"进行分隔
-
【tips】:如果你多个写出来有问题, ---> 变通下,用单个的不是一样的吗,只不过多加几个提取器而已呗
-
Match No.
- 0 表示随机
-
n 数字表示匹配到的第n个值
-
-1 表示匹配所有
-
Compute concatenation var (suffix _ALL)
- 如果提取到了多个值,会用", "相连,存储到 _ALL的变量中去
- 如果提取到了多个值,会用", "相连,存储到 _ALL的变量中去
-
Default Values
- 默认值,就是你提取不到值的时候【可能你写错了,也可能返回数据没有】,给个值
- Apply to
-
基本使用:
- ①、一个变量的情况:
-
②、多个变量的情况 - 1:
- 提取多个值:比如要title,folderid,要fullName
-
如果有多个值,那么这些填写的值要一一对应,缺一不可!否则报错,包括:
- 多个变量名
-
多个json表达式
-
多个匹配取值 - 如果你的json表达式提取到的只有1个值,就写0,这里很容易报错
-
多个默认值
-
【都要写,还要数量一致】
-
-
③、多个变量提取 - 示例2
-
- 提取多个值:比如要title,folderid,要fullName
- ①、一个变量的情况:
3、匹配到多个值这种可以如何使用?
-
1)可以获取到一个计数器,拿来做循环
- 比如你用json提取器获取title【这个title可能有多个值】,会生成一个叫title_matchNr的值,这里就是8
-
2)起一个循环控制器,多少次呢,就是用这个${title_matchNr}来做循环次数
-
3)里面写调试代码,这里用java请求,打印出值
-
4)注意,这里这个变量是 "title_数字" 的形式,又需要做处理
- 结合JMeter内置的计数器 ${__counter(,)}和变量组合的函数
-
生成一个函数为,${__V(title_${__counter(,)},)}
-
5)优化java的sampler,写入这个变量,然后调用即可
4、跨线程组做关联
-
案例说明:
- 首先,有两个线程组,一个是请求天气接口的,一个是请求百度接口的
-
然后请求百度接口的线程组需要用到上一个线程组的响应数据
-
这个时候,就相当于跨线程组这样的数据共享了
-
解决方式:
- 1)测试方案那里,需要设置线程组执行的一个串行方式
-
2)线程组的天气接口,配置好了
- http://www.weather.com.cn/data/sk/101010100.html
-
配置json提取器
-
还可以配一个调试取样器【这个主要就是看下json提取器有没有提取到值的,作为一个调试作用】
-
3)线程组里面需要用到Bean Shell取样器或者JSR取样器,这样将变量设置为JMeter的属性,这样才能跨线程组共享
- 需要用到函数__setProperty()
-
${__setProperty(cityid_P,${cityid},)}
-
里面的cityid_P 这个是设置到JMeter属性里面的自定义的值
-
${cityid}这个是json提取器里面提取到的值存放的变量
-
4)做第二个线程
- 使用我们在第一个线程里面做的JMeter属性
-
但是需要注意,我们需要使用property函数或者P来获取
- ${__property(cityid_P,,)}
-
5)添加查看结果树,调试代码
-
整个步骤:
-
- 1)测试方案那里,需要设置线程组执行的一个串行方式