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

繁華似錦Fighting發表於2021-06-17

提示

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

相關文章