• Jmeter之JDBC请求参数化(二)


     

    有时候操作数据库操时,查询或者更新的值是动态变化的,针对这种情况Jmeter提供了参数化的支持,可以将Jmeter的变量直接应用到数据库查询当中。在Jmeter中,参数化数据库请求非常简单,只需要把原有的固定值替换为变量即可(Jmeter中$符号表示变量)。Jmeter不仅可以直接引用脚本中已经生成的变量,还可以引用函数助手生成的变量,如下示例就是使用Jmeter函数助手通过RandomString生成随机变量作为数据库uname的插入值,通过这种方式实现了随机往数据库插入不同用户名的用户。

     在JDBC Request的Variables names中指定变量名,即可将查询结果按顺序存储到对应的变量名当中,供后续使用。

    二、上面已经讲了一些基本的配置,和简单的jdbc请求,下面来看下具体的如何将查询语句参数化。

    参数化这里有几种方法,foreach,计数器,csv等,这里介绍几种方法。

    将查询语句参数化

    1

    方法1:使用CSV元件,将语句对应的部分替换成CSV文件中内容(与http请求参数化方式一样)

     

    查询结果正常,参数取值正常。成功!

    方法2:使用占位符,将替换语句中对应的部分。

    a:Query Type修改为Prepared Select Statement

    b:在where子句中将参数数值填写为?

    c :在下方的Parameter values中把值填上,多个参数用,分隔,数量与?保持一致(第一个值对应第一个?,以此类推)

    d:Parameter types填为varchar,多个参数用,分隔,数量与?保持一致(不管什么数据类型均填写为varchar)

    上图的查询语句最终为:

    select id,stuid,cname,grade from score where id = 10 or cname = 娃哈哈;

    我们来看一下结果

    查询结果正确。成功!

    注意:

    1、Parameter values只能用在where子句中,如果放在查询字段中的话,它会将该字段的结果全部替换为值本身,而不是数据库的查询结果。如下:

    查询结果如下,id没有正确获取,失败!

    2、Parameter values也可以使用变量噢,也就是CSV元件中定义变量后,可以在Parameter values中使用${}引用,这个大家自己尝试一下,在此不做演示。

    获取查询结果

    上面只是介绍了如何给JDBC请求做参数化,那么,如果我想获取JDBC的查询结果,类似于正则表达式提取器获取http请求返回值,该怎么做呢?

    由于查询返回的是一个结果集,以行列的形式呈现,所以,我们用通常的正则表达式提取是行不通的。但是,JDBC请求本身提供了这种功能,就是Query下方的Variable Name(与上方的连接名称不一样!!!)

    Variable N

    ame是按照查询结果列数取该列的所有值,多个参数以,分隔。我们以示例说明

    Variable Name设置如图,为方便查看,我们添加一个Debug PostProcessor。查看参数结果。

    下面是我们的查询结果

    查看Debug PostProcessor结果

    从Debug PostProcessor的结果来看,Variable Name中定义的test1,test2,test3,test4分别是查询结果中的第一、第二、第三、第四列所有的结果,test1_#则代表这一列结果的总数,也就是查询结果的总行数。如果要使用里面任意参数,直接${}引用就OK。

    如果只想获取某一列的查询结果,有2种方法。

    1

    方法1:直接修改sql,只查询需要的那一列,Variable Name中填写1个参数即可。

    2

    方法2:指定参数的列数,比如cname的查询结果中为第三列,那么在Variable Name中可以写成这样,表示第一、第二列都为空,第三列的结果保存为test参数。

    以上结果大家可以自己试验。

    OK。现在我们知道Variable Name会将某一列的结果保存为数组,并可以直接引用,那么,我们现在想获取这个数组的所有结果,也就是获取这个字段所有的值,该怎么操作呢?

    同样,有2种方法。

    1

    方法1:使用foreach控制器,因为Variable Name输出的是一个数组,那么就可以使用foreach控制器,将数组内的值全部取出来。

    运行一下,查看取值结果

    取值正常,成功!

    虽然,foreach能够取出所有的值,但是foreach控制器是发现如果还能够往下取值,它就会自动循环,而不进行迭代。这在大多数情况不符合我们的使用需求。

    2

    方法2:利用计数器,进行每次迭代的更替取值。下面进行演示。

    修改线程组设置,运行,查看取值结果

    取值正确,成功!

    使用计数器和JDBC的Variable Name配合,可以完成从数据库取值后,通过迭代来控制参数取值的目的。是不是觉得这种方式很熟悉?没错!其实咱们的CSV元件就是通过迭代来控制参数取值的。也就是说,使用上面这种方式,我们可以直接从数据库查到我们想要的数据,然后通过迭代来取值,从而省去了获取参数化文件和配置CSV元件的过程。

    虽然,使用JDBC和计数器的方式来实现参数化略显繁琐,但是因为是直接从数据库中取值,所以即使数据发生变化,也不用去修改脚本。也不存在CSV文件路径、编码格式以及数据准确性等等一系列的问题。并且,由于JDBC请求只是作为获取数据来源用的,所以使用仅一次控制器即可,对本身测试的影响并不大(查询数据不大的情况下)。

  • 相关阅读:
    一周小记(十七)
    一周小记(十九)
    2021/12/28组会
    AdaIN论文阅读(Arbitrary Style Transfer in Realtime with Adaptive Instance Normalization)
    PostgreSQL新增、更新、删除触发器
    leetcodedphard最小距离
    leetcodedp编辑距离问题两个字符串的删除操作
    正向代理代理客服端,反向代理代理服务器
    mybatisplus逻辑删除 3.1一下版本
    Eclipse使用指定JDK,无需配置Path变量
  • 原文地址:https://www.cnblogs.com/wuzm/p/10863271.html
Copyright © 2020-2023  润新知