Jmeter JDBC Request 使用详解

发表于:2021-2-10 09:40

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:EdisonYao    来源:博客园

  本篇博文讲解以MySQL为例,搞懂JDBC Request中MySQL的使用方法,换成其它数据库,如Oracle、PSQL也会很容易上手。
  一、基本配置
  1.首先我们先了解一下,不同数据库的驱动类和URL格式
  2.将MySQL的JDBC驱动jar包复制到Jmeter的lib目录下,本文中使用的是 mysql-connector-java-8.0.16.jar 
  或者在Jmeter的Test Plan中直接引入jar包,如下图所示:
   
  MySQL驱动下载:https://mvnrepository.com/artifact/mysql/mysql-connector-java
  二、配置JDBC Connection Confiquration
  JDBC Request经常需要配合配置元件JDBC Connection Configuration一起使用,先来看一下JDBC Connection Configuration的相关配置。
  这里我们主要关注Variable Name Bound to Pool和Database Connection Configuration两部分内容,其它字段可以保持默认值。
  Variable Name:数据库连接池的名称,后续配置还会用到这个名称
  Database URL:数据库的URL,jdbc:mysql://ip Of The Server:port/表名
  JDBC Driver class:JDBC驱动
  Username:要连接的数据库名称
  Password:要连接的数据库密码
  三、配置JDBC Request
  Variable Name:数据库连接池的名称,需要与JDBC Connection Configuration的Variable Name名称保持一致
  Query:填写要被执行的SQL语句
  Parameter valus:参数值
  Parameter types:参数类型
  Variable names:保存sql语句返回结果的变量名
  Result variable name:创建一个对象变量,保存所有返回的结果
  Query timeout:查询超时时间
  Handle result set:定义如何处理由callable statements语句返回的结果
  我们添加一个监听器,保存脚本运行一次,查看执行结果。
   需要注意的是,Query Type不同时,对应执行代码也不一样:
  (1)Query Type为Select Statement时,对应执行代码为:
  stmt = conn.createStatement();
  ResultSet rs = null;
  rs = stmt.executeQuery(sql);
  return getStringFromResultSet(rs).getBytes(ENCODING);
  (2)Query Type为Callable Statement时,对应执行代码为:
  CallableStatement cstmt = getCallableStatement(conn);
  int out[]=setArguments(cstmt);
  boolean hasResultSet = cstmt.execute();
  String sb = resultSetsToString(cstmt,hasResultSet, out);
  return sb.getBytes(ENCODING);
  (3)Query Type为Update Statement时,对应执行代码为:
  stmt = conn.createStatement();
  stmt.executeUpdate(sql);
  int updateCount = stmt.getUpdateCount();
  String results = updateCount + " updates";
  return results.getBytes(ENCODING);
  (4)Query Type为Prepared Select Statement时,对应执行代码为:
  PreparedStatement pstmt = getPreparedStatement(conn);
  setArguments(pstmt);
  ResultSet rs = null;
  rs = pstmt.executeQuery();
  return getStringFromResultSet(rs).getBytes(ENCODING);
  (5)Query Type为Prepared Update Statement时,对应执行代码为:
  PreparedStatement pstmt = getPreparedStatement(conn);
  setArguments(pstmt);
  pstmt.executeUpdate();
  String sb = resultSetsToString(pstmt,false,null);
  return sb.getBytes(ENCODING);
  (6)Query Type为Rollback时,对应执行代码为:
  conn.rollback();
  return ROLLBACK.getBytes(ENCODING);
  (7)Query Type为Commit时,对应执行代码为:
  conn.commit();
  return COMMIT.getBytes(ENCODING);
  (8)Query Type为AutoCommit(false)时,对应执行代码为:conn.setAutoCommit(false);
  return AUTOCOMMIT_FALSE.getBytes(ENCODING);
  (9)Query Type为AutoCommit(true)时,对应执行代码为:
  conn.setAutoCommit(true);
  return AUTOCOMMIT_TRUE.getBytes(ENCODING);
  (10)其它情况直接抛异常:throw new UnsupportedOperationException("Unexpected query type: "+_queryType);
  四、JDBC Request 参数化 
  方法(一):自定义用户变量,然后进行引用
  1.在Test Plan界面User Defined Variables中定义需要的变量
  2.在JDBC Request界面SQL Query输入框中以${变量名}的形式引用变量
  方法(二):在被执行的SQL语句中使用“?”作为占位符,并传递参数值和参数类型。其中,
  传递的参数值有常量和变量之分。
  1.当传递的参数值是常量时,如下图所示,传入的用户ID和用户号码:
   
  2.当传递的参数值是变量时,如下图中的${user_id}:
  五、Variables names参数使用方法
  Variable names:保存sql语句返回结果的变量名,如果给这个参数设置了值,会保存sql
  语句返回的数据和返回数据的总行数。
  假如,sql语句返回2行,3列,且Variables names设置为A, ,C,那么如下变量会被设置为:
  A_#=2 (总行数)  A_1=第1列, 第1行  A_2=第1列, 第2行   
  C_#=2 (总行数)    C_1=第3列, 第1行  C_2=第3列, 第2行
  ·如果返回结果为0,那么A_#和C_#会被设置为0,其它变量不会设置值。
  ·如果第一次返回6行数据,第二次只返回3行数据,那么第一次那多的3行数据变量会被清除。
  ·可以使用${A_#}、${A_1}...来获取相应的值
  我们以上面的数据库为例,设置Variables names的值为p1、p2,并添加Debug Sampler
  来查看输出结果。根据数据库的实际情况,我可以预期p1_#的值为22,p1_1的值为
  e59af3ba1110f433bd2b0f4996011cab。
  由执行结果可以看出我的预期是正确的。

      本文内容不用于商业目的,如涉及知识产权问题,请权利人联系51Testing小编(021-64471599-8017),我们将立即处理
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号