『動善時』JMeter基礎 — 44、JMeter對數據庫的更新操作


提示

關於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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM