如何在jmeter中把响应的数据设置成全局变量
jmeter做接口测试过程中,经常遇到请求需要用到token或者cookie的时候,可以把返回token或cookie的接口用后置处理器提取出来,但是在这种情况下,只能适用于当前的线程组,其他线程组无法引用到提取的token或cookie的变量值,所以必须要生成全局变量让测试计划下的所有线程组都可以引用变量。
-
首先添加一个setUp线程组用来放到所有请求前执行,用于提取需要的cookie值(以禅道为例)
禅道中接口访问需要用到zentaosid是在登录的Response headers中,我们需要把zentaosid用后置处理器提取出来赋值给一个变量
-
使用边界值提取器把zentaosid提取出来赋值给变量ckie
边界值提取器提取出来无法全局使用,仅作用于当前线程组
-
使用函数助手对话框的setProperty函数,有两个输入框要填写(属性名称和Value of property),属性名称填写一个全局变量名,Value of property填写边界值提取到的zentaosid(边界值提取器提取到的zentaosid赋值给了变量ckie,此处引用变量${ckie}得到zentaosid)
-
在边界值提取器下添加一个后置处理器BeanShell PostProcessor
-
把生成的setProperty函数复制到BeanShell PostProcessor中
此时已经生成把接口需要用到的zentaosid生成了全局变量并赋值给了ztsid
- 引用该全局变量有两种方式
(1)使用函数助手中的property函数,只填写属性名称对应的输入框:全局变量名ztsid
把生成的结果放到需要zentaosid访问的接口的http cookie管理器中
(2)使用函数助手中的P函数,只填写属性名称对应的输入框:全局变量名ztsid
把生成的结果放到需要zentaosid访问的接口的http cookie管理器中
总结:
${__setProperty()}与${__property()}/${__P()}一起配合使用,setProptety等于把值拿出来,
__property/__P 1.可以把setProperty 的值直接拿出来, 2.可以对已存在的变量重新赋值
__P是__property函数的简化版,用来返回jmeter属性的值,可以在命令行中使用也可以在beanshell中用,
举个例子:${__P(prop1)}会返回属性prop1的值;${__P(prop1,123)} 会返回属性prop1的值,如果prop1未定义值,则返回123;
__property和__P之间的区别:用法上__property函数仅仅是比__P函数多了一个可以存值的变量,举个__property用法例子:${__property(pro,var,abcd)}会返回pro的值,如果pro未定义值则会返回abcd,同时会将pro的值存到变量var中