Jmeter跨线程使用变量的几种方式
前言
使用Jmeter做接口自动化测试及性能测试时,我们经常需要跨线程传递变量,最常用的比如登录Cookie的调用,以下分别以几种场景来描述跨线程使用变量的方式:
一、多线程使用相同的登录账号
接口测试时,一个测试计划下有多个线程组,每个线程组用于验证不同的接口,但使用相同的账号登录。
系统登录成功成功后,会在响应头中返回Cookie信息,其它接口在请求头中使用该Cookie即可获得授权正常调用。
1.添加【setUp线程组】
该线程组在整个测试计划开始执行时,且做为启动执行的线程组先执行
在该线程组下调用登录接口,系统登录成功后,使用正则表达式提取器,提取响应头信息中的Cookie信息
2.将token设置为全局变量
返回的token如果要跨线程组使用,需要将该变量处理为全局变量
可以添加BeanShell取样器,使用 “setProperty() ” 函数将tonken处理为全局变量,全局变量可以跨线程组使用
${__setProperty(token,${token},)};
3.其它线程组中使用
其它线程组下,如果需要使用相同的登录Tokon,则在线程组下添加HTTP Cookie管理器
设置Cookie为前面的全局变量Token,使用全局变量要使用 ${__property(token,)} 函数
${__property(token,,)}
二、用于性能测试,多用户登录后执行多个线程
1.添加【setUp线程组】
该线程组在整个测试计划开始执行时,且做为启动执行的线程组先执行
在该线程组下调用登录接口,系统登录成功后,使用正则表达式提取器,提取响应头信息中的Cookie信息
但因为要执行并发操作,是一批用户登录,需要提取这一批用户的Cookie,再在其它线程下使用这一批用户的Cookie进行验证。
方法:将一批用户的Cookie结果写入文件,再在其它线程中使用CSV数据文件来循环读取调用这一批Cookie信息,如图:调用登录信息获取userToken后,将Token信息写入文件
代码如下(示例):
//删除已存在的文件
String filename = "E://LIQF/token.csv";
File file = new File(filename);
if(file.exists()){
file.delete();
}
//创建文件后写入
FileWriter fstream = new FileWriter("E://LIQF/token.csv", true);
BufferedWriter out = new BufferedWriter(fstream);
out.write( vars.get("userToken"));
out.write(System.getProperty("line.separator"));
out.close();
fstream.close();
2.其它线程组中使用
1、CSV数据文件设置
2、Cookie管理器
在Cookie管理器的值中,使用CSV文件中的变量“userToken”
其它线程组中,每个线程设置多线程组方式并行执行时,会从CSV文件中读取出一批userToken分配给每个线程去执行,也就实现了并发测试过程中,使用不同的用户账号来验证同一个接口性能。
三、在BeanShell中使用全局变量
有些情况下,我们需要在某个线程组中返回的变量,需要在其它线程组的BeanShell中使用
1.将变量设置为全局变量

2.BeanShell中引用全局变量
在BeanShell中引入全局变量,需要使用props的方式引入,而不能使用vars的方式
如上面的DownFileDir全局变量,要在跨线程组的BeanShell中引入,需使用:
String DownFileDir = props.get("DownFileDir");