当前位置 博文首页 > 繁华似锦Fighting:『动善时』JMeter基础 — 43、JMeter对数据库

    繁华似锦Fighting:『动善时』JMeter基础 — 43、JMeter对数据库

    作者:繁华似锦Fighting 时间:2021-06-15 18:25

    目录
    • 1、使用“用户自定义变量”实现参数化
    • 2、 在SQL Query中使用占位符传递参数
      • (1)传递的参数值是常量
      • (2)传递的参数值是变量
    • 3、Variables names参数的使用方法
    • 4、Result variable name参数使用方法
    • 5、总结:
    • 6、注意事项:

    提示

    关于JMeter如何连接MySQL数据库,前面文章已经详解的讲解过了。因为配置数据库连接是比较固定的步骤,这里就不重复讲解了。

    本篇文章主要详细说明,使用JDBC Request组件,如何对数据库进行查询的各种操作。

    JMeter中查询语句的操作步骤:

    1. 添加测试计划。
    2. 添加线程组,设置线程组的次数。
    3. 添加JDBC Connection Configuration组件,配置数据库连接。
    4. 添加JDBC Request请求,编写SQL语句,使用参数化。
    5. 运行脚本,发送SQL请求。
    6. 添加察看结果树,查看结果。

    1、使用“用户自定义变量”实现参数化

    即:在SQL Query使用参数化变量。

    在JMeter中,有两个地方可以设置“用户自定义变量”。

    一种是“测试计划”界面中设置“用户自定义变量”。

    一种是添加配置元件中的“用户自定义变量”。

    我们以“测试计划”为例。如下图:

    (1)在“测试计划”界面中设置“用户自定义变量”。

    我们添加了一个自定义变量用户ID,如下图:

    image

    (2)在JDBC Request界面的SQL Query中,使用${变量名}的方式进行引用。

    1. 我们在Varíable Name填写对应的数据库配置名称,与JDBC Connection Configuration组件中的Varíable Name对应。
    2. Query Type:选择Select Statement,因为我们只进行一条查询的SQL语句。
    3. 编写SQL语句,并使用${变量名}方式引用参数化变量。

    如下图所示:

    image

    2、 在SQL Query中使用占位符传递参数

    传递的参数值有常量和变量之分。

    (1)传递的参数值是常量

    传递2个常量:用户ID=3,用户名=孙悟空。

    需要注意:

    1. 如果我们需要发送带有占位符的SQL语句,Query Type:需要选择Prepared Select Statement
    2. Parameter values参数值和Parameter types参数类型,都必须要填写(参数类型与表设计结构中的类型一致即可)。如果有多个占位符,就需要有多组数据,之间用逗号分隔。
    3. 发送SQL请求时,第一个参数会自动赋值给第一个占位符,以此类推,注意参数的编写顺序。

    如下图所示:

    image

    (2)传递的参数值是变量

    也就是占位符所接收的参数是一个参数化变量。我们把对应常量的位置,变成参数化变量即可,其他同上。

    如下图所示:

    image

    各种形式的参数化可以这样使用。关于参数化相关知识,前面文章有详细说明。

    3、Variables names参数的使用方法

    Variables names参数的作用是,把SQL语句查询出来的数据保存到变量中。一般查询返回几个字段,就用几个变量来进行接收,不同的变量之间用逗号隔开。

    JMeter官网给的解释是:如果给这个参数设置了值,它会保存SQL语句返回的数据和返回数据的总行数。

    假如,SQL语句返回2行,3列的数据,且Variables names中设置为A,B,C,那么如下变量会被设置为:

    A_#=2					# A列的总行数
    A_1=3					# A列的第一个数据,也就是第1列, 第1行的数据
    A_2=4					# A列的第二个数据,也就是第1列, 第2行的数据
    B_#=2					# B列的总行数
    B_1=sunwukong@1268.com  		# B列的第一个数据,也就是第2列, 第1行的数据
    B_2=zhubajie@1268.com   		# B列的第二个数据,也就是第2列, 第2行的数据
    C_#=2					# C列的总行数
    C_1=孙悟空				# C列的第一个数据,也就是第3列, 第1行的数据
    C_2=猪八戒				# C列的第二个数据,也就是第3列, 第2行的数据
    

    说明

    • 如果返回结果为0,那么A_#C_#会被设置为0,其它变量不会设置值。
    • 如果第一次请求返回6行数据,第二次请求只返回3行数据,那么第一次那多的3行数据,在线程变量中会被清除。
    • 可以使用${A_#}${A_1}来获取相应的值,作为参数化数据进行传递。
    • 可以添加Debug Sampler组件,来查看参数是否获取到了。

    示例

    (1)JDBC Request组件界面内容

    Variable names中定义接收数据的变量名,多个变量名之间用逗号分隔。

    如下图所示:

    image

    (2)查看结果

    添加一个取样器Debug Sampler用来查看输出的结果。(Debug Sampler组件可以查看到JMeter脚本运行中所有的变量)

    JDBC Request请求结果,如下图所示:

    image

    查看Debug Sampler中的输出结果,如下图所示:

    image

    我们从上图中可以看到,JMeter把从数据库中查询出来的数据,存储在线程变量中了。

    提示

    • A代表第一列所有的数据,A_#可以获取到第一列的行数。
    • A_n可以获得第一列第n行的数据。
    • BC的功能类似, 假如我们只需要第一列和第三列的数据,可以写成A,,C,中间的,不可以省略。

    4、Result variable name参数使用方法

    如果给这个参数设置值,它会创建一个对象变量,保存所有返回的结果。

    示例

    (1)JDBC Request组件界面内容

    Result variable name中定义接收数据的变量名。

    如下图所示:

    image

    (2)查看结果

    添加一个取样器Debug Sampler用来查看输出的结果。(Debug Sampler组件可以查看到JMeter脚本运行中所有的变量)

    JDBC Request请求结果,如下图所示:

    image

    查看Debug Sampler中的输出结果,如下图所示:

    image

    (3)数据处理

    上面查看到的结果集,我们如何应用里面的数据呢?

    我们可以创建一个BeanShell取样器,也可以在JDBC Request取样器下一级添加后置处理器BeanShell PostProcessor组件。

    在里边编写如下代码,来获取需要的指定数据,提供给后面的接口请求使用。

    image

    对象中具体数据的获取方法:columnValue = vars.getObject("resultObject").get(0).get("Column Name")

    5、总结:

    以上我们就把Parameter valuesParameter typesVariable namesResult variable name的使用方式进行了说明。

    在日常工作中,可以举一反三,灵活使用。

    6、注意事项:

    (1)The server time zone value服务器时区异常

    如果报错,如下:

    Cannot create PoolableConnectionFactory (The server time zone value '?????????????????' is unrecognized or represents more than one time zone. You must configure either the server or JDBC driver (via the serverTimezone configuration property) to use a more specifc time zone value if you want to utilize time zone support.)
    

    解决方法:数据库连接URL后面加 serverTimezone=GMTserverTimezone=GMT%2B8,即可解决。

    (2)执行多条SQL语句

    执行多条SQL语句时,查询语句selectupdateinsert语句不能在同一个JDBC Request组件中执行。

    当执行多条SQL 语句时,每条语句后面加;

    并且在 Database URL 后增加一个参数allowMultiQueries=true,否则将不能够执行多条语句,报错。

    (3)更新操作中文乱码

    需要在 Database URL 后增加一个参数characterEncoding=utf-8,这样就可以解决更新操作时候的中文乱码了。

    提示:一定要设置为UTF-8编码吗?不一定,要跟你的数据库的编码保持一致,就不会中文乱码了。

    (4)Datebase URL添加参数规则

    Datebase URL后增加参数,在dbname后加?,如有多个参数,每个参数用&隔开,如:

    jdbc:mysql://127.0.0.1:3306/guest?serverTimezone=GMT&useUnicode=true&characterEncoding=utf-8&allowMultiQueries=true

    参考:https://www.cnblogs.com/linbo3168/p/6039489.html

    bk