Jmeter脚本增强之参数化(关联数据库)(7)

支持如下多种参数化方式

  ①User Defined Variables:用户定义的变量(设置不需要随迭代发生改变的参数,例如:被测应用的host和port值)

  ②User Variables:用户参数

  ③随机变量(已补齐)

  ④正则表达式提取器(待补齐--在下一节:关联 介绍)

  ⑤函数助手:_CSVRead

  ⑥读取参数文件:CSV数据控件

  ⑦读取数据库(已补齐)

====================================

⑦读取mysql数据库

一、添加需要的mysql数据库的驱动jar包

前提已下载好jar包(下载地址:https://dev.mysql.com/downloads/connector/j/)

1.将jar包复制到jmeter的lib目录
2.使用jmeter的Test Plan引入相应的jar包,如:

二、添加JDBC Connection Configuration

 点击线程组添加配置元件→ :JDBC Connection Configuration

  填写以下变量值:

Variable Name: 数据库连接池的名称,

一个测试计划可以有多个jdbc connection configuration,每个可以起个不同的名称,在jdbc request中可以通过这个名称选择对应的连接池进行使用。

Database URL:
数据库url,jdbc:mysql://主机ip或者机器名称:mysql监听的端口号/数据库名称, 如:jdbc:mysql://localhost:3306/test

JDBC Driver class: com.mysql.jdbc.Driver

username:数据库登陆的用户名

passwrod:数据库登陆的密码
三、添加JDBC Request

 点击线程组添加Sampler→ :JDBC Request

看看该界面的几个参数:

Variable Name:
数据库连接池的名字,需要与上面配置的JDBC Connection Configuration中Variable Name Bound Pool的Variable Name相同
Query:填写的sql语句
Parameter valus:参数值
Parameter types:参数类型,可参考:Javadoc for java.sql.Types
Variable names:保存sql语句返回结果的变量名
Result variable name:创建一个对象变量,保存所有返回的结果
Query timeout:查询超时时间
Handle result set:定义如何处理由callable statements语句返回的结果
--------------------------------

我们可以先运行这个jdbc request,看看查询结果了。

问题来了:

从数据库查询出来,可以直接使用吗?
如果线程组设置了N个虚拟用户,将JDBC Request(假如:查询用户账号)请求放入线程组下,运行该脚本时,查询用户账号的JDBC Request将被执行N次。
这样是没有意义的。(我们的初衷是从数据库查询出10个用户账号,且不需要查询N次,查一次就可以了)

所以这里要使用JDBC Request,虚拟用户数设置成1,再通过循环控制器先后发送N个请求。  

另外说明:SQL查询结果存入到${mobile_fromDB}中了,在HTTP Request请求中,参数值那直接使用${mobile_fromDB}无法读取到用户账号值,
大致原因:${user_mobile}类似于一个结果集,必需配合其他函数(如计数)

那问题又来了:通过循环控制器的方式,能达到并发的效果吗?==========

四、 接下来,点击线程组添加‘逻辑控制器’→ :循环控制器

  通过SQL返回结果的变量,设置循环次数(此处设置为${mobile_fromDB_#    即从数据库中读取到的行数})。

五、 点击该‘循环控制’,添加‘配置元件’→ :计数器

 启动和递增是必填项,大致是循环开始的位置、步长

 六、将HTTP Request放入循环控制起中,并参数化

将数据库读取到的手机号  ${__V(mobile_fromDB_${N})}  传入给http请求。

备注: ${__V(mobile_fromDB_${N})} 是变量嵌套,参照后面_V函数的使用

                         

小结:

①每个线程数执行某个请求的循环次数由循环控制器决定(前提:当http请求放到循环控制器中),

②执行登录时参数化 请求时,计数器会在上次计数的基础上,按步长增加。

③无论是同一用户,还是在不同的用户使用时,计数器N是全局累加的,当N到最大值后,又从1开始计数

④http的请求次数=线程数*循环次数   ,计数器全局累加,达最大值后,从1开始。

七、线程数 与循环器  与计数器的关系

前提:数据库查询结果只有5条记录

  • 当线程数=1、循环次数=3、计算器=5时

线程线:1

    循环控制器中,循环次数:3

           计数器中的次数,最大值:5  

从运行结果来看:JDBC request只运行了一次(线程数决定的 1*1)

        登录时参数化运行了三次(每个线程中循环3次  1*3)

          而此处计数器,未达到最大值,第1次,运行‘登录时参数化’时,传入的${user_mobile_1}

                           第2次,运行‘登录时参数化’时,传入的${user_mobile_2}

                        第3次,运行‘登录时参数化’时,传入的${user_mobile_3}, 

  • 若线程数=1、循环次数=6、计算器=5,(http请求执行:6次)

         在第6次循环时,N=1。(说明:计数器达最大值后,仍按循环次数继续,这时才从1开始计数)(另外:子节点小一些时,按父节点迭代,要执行完)

  • 当线程数=1、循环次数=3、计算器=5时,(http请求执行:3次)

            在第1次循环时,N=1,第3次循环时N=3,无第4次、第5次。(子节点大一些时,父节点执行完即可,剩余子节点不执行)

  • 当线程数=6、循环次数=1、计算器=5时,(http请求执行:6次,计数器也能逐行读取。)

           在第1次循环时,N=1,第2次循环时N=2……第5次,N=5,第6次,N=1(即在不同的用户使用时,N是全局累加的,当N到最大值后,又从1开始计数)

  • 当线程数=3、循环次数=2、计算器=5时,(http请求执行:6次)第6次,N=1。

运行结果(线程数=1、循环次数=3、计算器=5时)

 

八、函数__V   嵌套变量

可以用于执行变量名表达式,并返回执行结果。

${user_mobile_1}:能正常工作。

若要传入N,作为动态参数:

直接使用${user_mobile_${N}} (嵌套变量引用),目前Jmeter是不支持的,所以需要函数_V来帮忙。

${__V(user_mobile_${N})}:可以正常工作。user_mobile_${N}变为user_mobile_1,函数 __V返回变量值user_mobile_1.

  结合函数助手得到嵌套后的变量形式。

======参照===========

https://blog.csdn.net/lluozh2015/article/details/52705268

https://www.cnblogs.com/wuyonghuan/p/7479582.html

https://blog.csdn.net/hwhua1986/article/details/64442943 查询的SQL需要传入变量值。

================================

③随机变量

使用jmeter自带的函数助手工具: 

blob.png  blob.png

其中_Random为生成指定范围内的随机数,输入最大值和最小值,点击“Generate”按钮,就会生成自动随机生成两位数的变量:${__Random(1,100,num)}  ;

 

_RandomString为随机生成字符串的函数,下图为随机6位字符串的生成截图,输入字符串长度和用于随机字符串生成的字符,点击“Generate”按钮,就会生成自动随机生成四位字符串的变量 ${__RandomString(6,qzaw345edcr34tgb79,string3)};

=================================================

参照:https://bbs.huaweicloud.com/blogs/d7c3f679e93e11e79fc57ca23e93a89f

 

-----------------------------------------Have a good day!---------------------------------------------------------------------------------------------------
原文地址:https://www.cnblogs.com/ww-xiaowei/p/10857767.html