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

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

    作者:繁华似锦Fighting 时间:2021-06-17 18:26

    目录
    • 1、执行一条insert语句
    • 2、insert语句实现参数化
    • 3、一次执行多条insert语句
    • 4、使用Beanshell生成加密数据示例
      • (1)测试计划内包含的元件
      • (2)JDBC连接配置组件内容
      • (3)BeanShell取样器界面内容
      • (4)JDBC Request组件中内容
      • (5)查看结果
    • 5、注意事项

    提示

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

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

    JMeter中更新语句的操作步骤:

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

    说明:更新操作包含insertupdatedelete三种操作,都是一样性质的,所以我们就以insert操作为例进行说明。

    1、执行一条insert语句

    使用JMeter发送一条insert语句非常的简单。

    JDBC Request组件中做如下操作:

    1. 选择数据库连接配置。
    2. 选择Query Type:因为是执行一条insert语句,所以选择Update Statement即可。
    3. 把完整一条insert语句,输入到Query文本框中。

    如下图所示:

    image

    说明:这是最基础的insert操作,发送了一条固定的insert请求。

    2、insert语句实现参数化

    JMeter中在insert请求中实现参数化也非常的简单。

    JDBC Request组件中做如下操作:

    1. 选择数据库连接配置。
    2. 选择Query Type:因为是执行一条insert语句,所以选择Update Statement即可。
    3. 把完整一条insert语句,输入到Query文本框中。
    4. 把需要参数化的部分,替换成参数化变成的引用即可。

    使用函数助手为例进行演示,如下图所示:

    image

    说明:其他形式的参数化也都可以,如利用CSV这个元件去做语句的参数化。本例中是用函数助手方便演示。

    提示:如果有些字段是自增长的值或者是有默认值,那么就可以不写,让其自动填充。

    3、一次执行多条insert语句

    使用JMeter发送一次执行多条insert语句非常的简单,就是直接写入多条insert语句,之间用;分隔开。

    JDBC Request组件中做如下操作:

    1. 选择数据库连接配置。
    2. Database URL 后增加一个参数allowMultiQueries=true,才可以执行多条SQL语句(重点)。
    3. 选择Query Type:我们可以选择Update StatementPrepared Update StatementCallable Statement,这三种类型语句都可以。
      选择Update Statement类型,执行一条insert语句发送一次请求。
      而选择Prepared Update StatementCallable Statement类型,则全程只发送一起请求。
    4. 把完整一条insert语句,输入到Query文本框中。

    如下图所示:

    image

    4、使用Beanshell生成加密数据示例

    我们在更新数据库的时候,有时候会有部分数据直接插入是不可以的,需要加密处理。

    那么就可以使用BeanShell 取样器组件完成对数据的加密操作。

    然后把加密好的数据,存储到JMeter的线程变量中,方便进一步的引用。

    提示:加密代码,可以找开发要,也可以自己扒源码找。

    JMeter中更新有加密数据的操作步骤:

    1. 添加测试计划。
    2. 添加线程组,设置线程组的次数。
    3. 添加JDBC Connection Configuration组件,配置数据库连接。
    4. 添加BeanShell 取样器组件,编写加密算法,并把加密的数据存储到线程变量中。
    5. 添加JDBC Request请求,编写SQL语句,使用参数化,并引用加密的线程变量。
    6. 运行脚本,发送SQL请求。
    7. 添加察看结果树,查看结果。

    (1)测试计划内包含的元件

    添加元件操作步骤

    1. 创建测试计划。
    2. 创建线程组:选中“测试计划”右键 —> 添加 —> 线程(用户) —> 线程组
    3. 在线程组下,添加配置原件JDBC连接配置组件:选中“线程组”右键 —> 添加 —> 配置元件 —> JDBC Connection Configuration
    4. 在线程组下,添加取样器BeanShell 取样器组件:选中“线程组”右键 —> 添加 —> 取样器 —> BeanShell 取样器
    5. 在线程组下,添加取样器JDBC Request组件:选中“线程组”右键 —> 添加 —> 取样器 —> JDBC Request
    6. 在线程组下,添加监听器“察看结果树”组件:选中“线程组”右键 —> 添加 —> 监听器 —> 察看结果树

    最终测试计划中的元件如下:

    image

    点击运行按钮,会提示你先保存该脚本,脚本保存完成后会直接自动运行该脚本。

    (2)JDBC连接配置组件内容

    基本的JDBC连接配置,界面内容详解可以看前面的文章【JMeter连接数据库】。

    主要是定义数据库连接池的名称,还有最下方关于数据库的基本信息配置。

    如下图所示:

    image

    (3)BeanShell取样器界面内容

    把生成加密内容的BeanShell代码,写入到界面的脚本输入框中。

    如下图所示:

    image

    完整代码放在下面:

    import java.io.PrintStream;
    import java.security.MessageDigest;
    import java.security.NoSuchAlgorithmException;
    import java.util.Arrays;
    
    public class PWDEncryptionUtils {
    
        // 静态方法,类直接调用
        // 对明文密码进行加密
        public static String encryptPwd(String pwd) {
            return stringMD5(pwd);
        }
    
        public static String stringMD5(String input) {
            try {
                MessageDigest messageDigest = MessageDigest.getInstance("MD5");
                byte[] inputByteArray = input.getBytes();
                messageDigest.update(inputByteArray);
                byte[] resultByteArray = messageDigest.digest();
                return byteArrayToHex(resultByteArray);
            } catch (NoSuchAlgorithmException localNoSuchAlgorithmException) {
                localNoSuchAlgorithmException.printStackTrace();
            }
            return null;
        }
    
        public static String byteArrayToHex(byte[] byteArray) {
            char[] hexDigits = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'};
            char[] resultCharArray = new char[byteArray.length * 2];
            int index = 0;
            byte[] arrayofByte = byteArray;
            int j = byteArray.length;
            for (int i = 0; i < j; i++) {
                byte b = arrayofByte[i];
                resultCharArray[(index++)] = hexDigits[(b >>> 4 & 0xF)];
                resultCharArray[(index++)] = hexDigits[(b & 0xF)];
            }
            return new String(resultCharArray);
        }
    
    //    public static void main(String[] args) {
    //        PWDEncryptionUtils test = new PWDEncryptionUtils();
    //        String result = test.encryptPwd("12345678");
    //        System.out.println("result = " + result);
    //    }
    
    }
    
    //调用执行步骤
    
    // 1.创建实例
    PWDEncryptionUtils test = new PWDEncryptionUtils();
    
    // 2.调用加密函数
    String pwd=test.encryptPwd("${__RandomString(8,0123456789,)}");
    
    // 3.存储数据到JMeter线程变量中
    vars.put("new_pwd",pwd);
    

    说明一下:

    • 这里主要看最后的三行代码,使用函数助手生成的8位数字为数据,进行加密运算。
    • 然后存入到JMeter的线程变量中,变量名为new_pwd
    • 最后,后续的请求中可以引用该变量。

    提示:在调试BeanShell代码的时候,可以添加Debug Sampler组件来查看获取结果。

    如下图所示:

    image

    (4)JDBC Request组件中内容

    填写应用的数据库连接池名称,然后编写insert语句,最后加入参数化和加密数据的引用。

    我把加密后的数据放在了slogan字段中了,如下图所示:

    image

    (5)查看结果

    我把线程组中的线程数设置为3,也就是执行三次该请求。

    结果如下图所示,执行了三次SQL请求:

    image

    我们在去数据库中查看数据是否添加成功。

    如下图所示,新增了三条数据,并且slogan字段中的数据是经过加密的。

    image

    以上就完整的实现了,把经过加密的数据,存储到数据库中的演示。

    5、注意事项

    (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

    bk