• 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!---------------------------------------------------------------------------------------------------
  • 相关阅读:
    cookie和session。
    K3cloud Web API对接---单据保存接口(有源单)
    K3 wise kis 防火墙设置
    新单序时簿插件
    mssqlserver中排序规则冲突的问题解决
    读取金蝶图片
    金蝶wise委外订单关闭简述
    存储过程加锁
    判断存储过程是否存在
    解除死锁
  • 原文地址:https://www.cnblogs.com/ww-xiaowei/p/10857767.html
Copyright © 2020-2023  润新知