在 15_jmeter用jdbc连接MySQL数据库中介绍了怎么使用jmeter的JDBC request 连接数据库并使用其中的值,但是都是基于同一个线程!在不同的线程中用${变量名_下标}是取不到值的,我们需要做的是先把JDBC读取的参数设置为全局变量,然后在别的线程中就可以访问了!
一. 在测试计划下添加一个setUp线程组
(在Thread Group线程组运行之前运行)
① 右键测试计划-->添加-->线程组-->setUp线程组
② 如果我们只想这个线程中的请求只运行一遍,setUp线程组中的设置参数就默认不变就好
二. 在setUp线程组中添加链接数据量的配置(怎么连接数据库就不写了)
三. 在setUp线程组中创建两个jdbc request 请求,一个是为了查询出数据,一个是为了count一下查询出的数据有多少行(做循环的时候用)
四. 在setUp线程组下创建一个循环控制器
这个很重要,jdbc request查询出的数据我们要在这里给转换成全局变量!
五. 在循环控制器中创建一个计数器 和 后置处理器 BeanShell PostProcessor
(是右键循环控制器添加的,计数器和后置处理器 BeanShell和中间夹的请求都是平级关系)
-
循环次数设置:
设置为查询出的总行数时设置的变量名+下标${CountData_1}
,保证查询出多少行就转换多少参数
-
计数器设置和目的:
目的:
① JDBC取值按下标来取,这样可以保证取到所有查询到的值,且不重复
②转换后的值存到一个变量中,也可以加上下标,这样便于后面取值,也不会因为变量名相同存值的时候会新值覆盖旧值
设置:
② BeanShell PostProcessor 中写转换全局变量的函数
// 查询出JDBC 请求出来的数据
log.info("----------------------sel_name="+vars.get("sel_name_${id}")+"--------------------");
// 把JDBC请求的数据一条一条转换成全局变量
${__setProperty(${__V(Ssel_name_${id})},${__V(sel_name_${id})},)};
详解:
${__setProperty(${__V(Ssel_name_${id})},${__V(sel_name_${id})},)};
分为两个部分:
第一部分:${__setProperty(转换后全局变量的名称,需要转换的全局变量的名称,)};
这是转换全局变量的函数格式
第二部分:${__V(Ssel_name_${id})}
和${__V(sel_name_${id})}
${__V(Ssel_name_${id})}
:这是按下标读取jdbc中变量名中的值
${__V(Ssel_name_${id})}
:把转换后的值存到一个变量中,变量名生成规则:Ssel_name_加上计数器中读取到的${id}的数字,便于保证变量的唯一性,和取值的简易性
③ 请求 全局变量后查询:${__V(${__P(Ssel_name_${id},)})}
为了在结果树中演示转黄成全局变量后的值
六、添加一个线程组-->debug sampler,名称改为---------------华丽的分割线----------------------
无意义,只是为了在结果树中起到一个分隔作用,也可以看数据库返回参数值
七、在测试计划下添加一个计数器,为了实现取全局变量名时的下标的唯一性,如果调用上一个计数器的参数${id},不会从1开始计算,按下标取值时无法从头开始取值
八、添加三个线程组,每个线程组下添加一个http sampler
线程组设置:循环两次
http sampler设置:把http sampler的名称改成:${__V(${__P(Ssel_name_${b},)})}+++++++${b}
无意义,只是为了在结果树中看结果
详解:${__P(Ssel_name_${b},)}
取转换成全局变量名称的格式,、
① Ssel_name_:上面BeanShell PostProcessor定义的全局变量名称
② ${b}
:测试计划下计数器的取值方式
③ +++++++${b}
:为了看计数器的取值是几
九、执行
分割线上面是jdbc request查询出的所有参数,分割线下别的线程1/2/3的请求名称中打印的全局变量的值,说明多线程共享jdbc的数据成功了
但是${b}的取值竟然是3开始的,这里说一下jmeter问题,我觉得是bug
线程组1的前面有两个线程组,“setUp线程组”和“---------------华丽的分割线----------------------”,
原因:当第一个调用计数器变量名的线程组前面有几个线程组执行了,那么计数器第一次的取值会自动在原有的基础上在加上线程的数量
实例:禁用“---------------华丽的分割线----------------------”后,这里可以看见从2开始调用了
网友评论