当前位置 博文首页 > 繁华似锦Fighting:『动善时』JMeter基础 — 38、JMeter中实现跨
在做压力测试的时候常常会遇见一个场景,想要测试的接口需要登录接口返回的token做参数,或者需要其它接口的认证信息,通常能想到的就是正则表达式提取器,把需要的参数提取出来,传递到另一个HTTP请求中。
如果有多个线程组的情况下,需要每个线程组中都要有登陆请求,这不符合我们的规范,最理想状态就是获取token的接口只请求一次。然后登陆的认证信息,在JMeter测试脚本中的所有接口请求中都可以使用。
这样就实现了跨线程组传递参数,这使得接口之间的关联更加灵活。
所以:什么是跨线程组关联呢?就是在不同线程组之间实现参数传递。
__setProperty
函数,把Cookie值升级为JMeter的全局属性,就可以在线程组和线程组之间共享了。__property
函数,获取全局数据。添加元件操作步骤:
选中“测试计划”右键 —> 添加 —> 线程(用户) —> 线程组
。HTTP Cookie管理器
组件:选中“线程组”右键 —> 添加 —> 配置元件 —> HTTP Cookie管理器
。选中“线程组”右键 —> 添加 —> 取样器 —> HTTP请求
。选中“线程组”右键 —> 添加 —> 取样器 —> BeanShell 取样器BeanShell 取样器
。选中“线程组”右键 —> 添加 —> 配置元件 —> HTTP信息头管理器
。选中“线程组”右键 —> 添加 —> 监听器 —> 察看结果树
。提示:需要重复添加的组件这里不重复描述。
最终测试计划中的元件如下:
点击运行按钮,会提示你先保存该脚本,脚本保存完成后会直接自动运行该脚本。
请求登陆操作界面如下:
通过添加HTTP Cookie管理器组件,会把服务器返回来的Cookie信息,默认存储到线程变量中。
前提:
jmeter.properties
文件中,设置CookieManager.save.cookies=true
。
然后我们可以通过Debug Sampler
(调试取样器)组件,查看到线程变量中的Cookie数据。
如下图所示:
说明:保持用户登陆状态的Cookie数据为:
COOKIE_ECS_ID=daf59ab57d42c0cee3596feb7ad17ff576403601
这样我们就找到Cookie的值了。
我们需要通过__setProperty
函数,把Cookie数据提升为JMeter的全局属性。这样该Cookie就可以在JMeter脚本中,所有线程组里都可以使用了。(也就是可以在线程组和线程组之间通信)
接下来点击:工具 —> 函数助手对话框,打开函数助手。(之前的版本在选项中)
然后选择__setProperty
函数。
第一行填写:填写升级为全局属性后的变量名。(自定义即可)
第二行填写:定义全局属性的值。(我们就把Cookie属性的值,引用到这里)
Return Original Value of property (default false)?
:返回属性的原始值(默认为 false),默认即可。
编写完成如下图所示:
这样我们就把Cookie提升为JMeter的全局属性了,变量名叫kuayu_session
。
JMeter的全局属性就相当于在“测试计划”界面中定义的用户定义的变里。
上面生成的这个函数比较特殊,他必须放到BeanShell Sampler
组件里面。当把这个函数放到BeanShell取样器组件里面后,就相当于把变量kuayu_session
的值,放到了我们声明的公共空间里面。
如下图所示:
标准的Get请求,填写请求的基本信息即可。
如下图所示:
因为我们把用户登陆线程组中的Cookie属性提升为JMeter全局属性了。
需要在查看购物车线程组中把全局属性中的Cookie属性获取到,使用__Property
函数。
打开函数助手:工具 —> 函数助手对话框。(之前的版本在选项中)
选择__Property
函数。
第一行:填写要获取的JMeter全局属性的变量名。(即:kuayu_session
)
第二行:重用函数计算值的引用名。(可选填)
默认值:属性未定义时的默认值。
编辑完,如下图所示:
提示:在
The result of the function is
中看到对应的内容,表示函数生成成功。
我们需要把上一步获取到的Cookie信息,放入查询购物车的请求中。
因为是Cookie的相关数据,只能放在请求头的信息中。(如果要是token,就放在请求的参数中)
编辑界面如下:
这样查看购物车请求,就带有用户的登陆状态了。
因为我们需要等待前面的登陆线程组执行完成后,在进行查看购物的请求,否则将获取不到我们需要的Cookie信息。
这时候就需要设置线程组元件界面中的调度器属性了。
我们把持续时间和启动延迟都设置成3,表示JMeter脚本启动3秒后,再执行查看购物线程组中的内容,并持续3秒钟。
如下图所示:
调度器配置(Scheduler Configuration)说明:
我们先来看一下,没有进行跨线程相关设置请求的结果。
如下图所示:可以看到购物车中没有任何的数据。
我们再来看一下,进行跨线程设置请求的结果。
如下图所示:可以看到该用户购物车中的信息了。
再来看看查看购物车请求的内容,可以看到请求带有Cookie信息。
如下图所示:
以上就完成了,在JMeter中实现跨线程组关联操作的演示。
如上需求,在进行性能测试的时候,我们要保证登陆请求线程组中,所有用户登陆的Cookie或token都保存好,才能进入到下一个线程组中执行其他的跨域关联请求。
这样就会有两种实现方式:
第二种方式实现步骤:
.csv
文件中。.csv
文件,使用BeanShell。取样器添加后置处理器BeanShell postprocessor
。.csv
文件。只提供BeanShell中的数据存储代码(简单示例)
import java.io.FileWriter;
import java.io.BufferedWriter;
FileWriter fstream = new FileWriter("C:\\Users\\L\\Desktop\\JMeterScript\\user_session.csv", true);
BufferedWriter out = new BufferedWriter(fstream);
out.write(vars.get("COOKIE_ECS_ID")+"\n");
out.close();
fstream.close();
关于详细步骤,这里就不展开说明了。我们举一反三,实现这个操作,会很有意思的。