提示:
關於JMeter如何連接MySQL數據庫,前面文章已經詳解的講解過了。因為配置數據庫連是比較固定的步驟,這里就不重復講解了。
本篇文章主要詳細說明,使用
JDBC Request
組件,如何對數據庫進行更新的各種操作。
JMeter中更新語句的操作步驟:
- 添加測試計划。
- 添加線程組,設置線程組的次數。
- 添加
JDBC Connection Configuration
組件,配置數據庫連接。 - 添加
JDBC Request
請求,編寫SQL語句,進行參數化。 - 運行腳本,發送SQL請求。
- 添加察看結果樹,查看結果。
說明:更新操作包含
insert
、update
、delete
三種操作,都是一樣性質的,所以我們就以insert
操作為例進行說明。
1、執行一條insert語句
使用JMeter發送一條insert
語句非常的簡單。
在JDBC Request
組件中做如下操作:
- 選擇數據庫連接配置。
- 選擇
Query Type
:因為是執行一條insert
語句,所以選擇Update Statement
即可。 - 把完整一條
insert
語句,輸入到Query
文本框中。
如下圖所示:
說明:這是最基礎的
insert
操作,發送了一條固定的insert
請求。
2、insert語句實現參數化
JMeter中在insert
請求中實現參數化也非常的簡單。
在JDBC Request
組件中做如下操作:
- 選擇數據庫連接配置。
- 選擇
Query Type
:因為是執行一條insert
語句,所以選擇Update Statement
即可。 - 把完整一條
insert
語句,輸入到Query
文本框中。 - 把需要參數化的部分,替換成參數化變成的引用即可。
使用函數助手為例進行演示,如下圖所示:
說明:其他形式的參數化也都可以,如利用CSV這個元件去做語句的參數化。本例中是用函數助手方便演示。
提示:如果有些字段是自增長的值或者是有默認值,那么就可以不寫,讓其自動填充。
3、一次執行多條insert語句
使用JMeter發送一次執行多條insert
語句非常的簡單,就是直接寫入多條insert
語句,之間用;
分隔開。
在JDBC Request
組件中做如下操作:
- 選擇數據庫連接配置。
Database URL
后增加一個參數allowMultiQueries=true
,才可以執行多條SQL語句(重點)。- 選擇
Query Type
:我們可以選擇Update Statement
、Prepared Update Statement
和Callable Statement
,這三種類型語句都可以。
選擇Update Statement
類型,執行一條insert
語句發送一次請求。
而選擇Prepared Update Statement
和Callable Statement
類型,則全程只發送一起請求。 - 把完整一條
insert
語句,輸入到Query
文本框中。
如下圖所示:
4、使用Beanshell生成加密數據示例
我們在更新數據庫的時候,有時候會有部分數據直接插入是不可以的,需要加密處理。
那么就可以使用BeanShell 取樣器組件完成對數據的加密操作。
然后把加密好的數據,存儲到JMeter的線程變量中,方便進一步的引用。
提示:加密代碼,可以找開發要,也可以自己扒源碼找。
JMeter中更新有加密數據的操作步驟:
- 添加測試計划。
- 添加線程組,設置線程組的次數。
- 添加
JDBC Connection Configuration
組件,配置數據庫連接。 - 添加BeanShell 取樣器組件,編寫加密算法,並把加密的數據存儲到線程變量中。
- 添加
JDBC Request
請求,編寫SQL語句,使用參數化,並引用加密的線程變量。 - 運行腳本,發送SQL請求。
- 添加察看結果樹,查看結果。
(1)測試計划內包含的元件
添加元件操作步驟:
- 創建測試計划。
- 創建線程組:
選中“測試計划”右鍵 —> 添加 —> 線程(用戶) —> 線程組
。 - 在線程組下,添加配置原件
JDBC連接配置
組件:選中“線程組”右鍵 —> 添加 —> 配置元件 —> JDBC Connection Configuration
。 - 在線程組下,添加取樣器
BeanShell 取樣器
組件:選中“線程組”右鍵 —> 添加 —> 取樣器 —> BeanShell 取樣器
。 - 在線程組下,添加取樣器
JDBC Request
組件:選中“線程組”右鍵 —> 添加 —> 取樣器 —> JDBC Request
。 - 在線程組下,添加監聽器“察看結果樹”組件:
選中“線程組”右鍵 —> 添加 —> 監聽器 —> 察看結果樹
。
最終測試計划中的元件如下:
點擊運行按鈕,會提示你先保存該腳本,腳本保存完成后會直接自動運行該腳本。
(2)JDBC連接配置組件內容
基本的JDBC連接配置,界面內容詳解可以看前面的文章【JMeter連接數據庫】。
主要是定義數據庫連接池的名稱,還有最下方關於數據庫的基本信息配置。
如下圖所示:
(3)BeanShell取樣器界面內容
把生成加密內容的BeanShell代碼,寫入到界面的腳本輸入框中。
如下圖所示:
完整代碼放在下面:
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
組件來查看獲取結果。如下圖所示:
(4)JDBC Request組件中內容
填寫應用的數據庫連接池名稱,然后編寫insert
語句,最后加入參數化和加密數據的引用。
我把加密后的數據放在了slogan
字段中了,如下圖所示:
(5)查看結果
我把線程組中的線程數設置為3,也就是執行三次該請求。
結果如下圖所示,執行了三次SQL請求:
我們在去數據庫中查看數據是否添加成功。
如下圖所示,新增了三條數據,並且slogan
字段中的數據是經過加密的。
以上就完整的實現了,把經過加密的數據,存儲到數據庫中的演示。
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=GMT
或serverTimezone=GMT%2B8
,即可解決。
(2)執行多條SQL語句
執行多條SQL語句時,查詢語句select
和update
、insert
語句不能在同一個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