提示:
關於JMeter如何連線MySQL資料庫,前面文章已經詳解的講解過了。因為配置資料庫連線是比較固定的步驟,這裡就不重複講解了。
本篇文章主要詳細說明,使用
JDBC Request
元件,如何對資料庫進行查詢的各種操作。
JMeter中查詢語句的操作步驟:
- 新增測試計劃。
- 新增執行緒組,設定執行緒組的次數。
- 新增
JDBC Connection Configuration
元件,配置資料庫連線。 - 新增
JDBC Request
請求,編寫SQL語句,使用引數化。 - 執行指令碼,傳送SQL請求。
- 新增察看結果樹,檢視結果。
1、使用“使用者自定義變數”實現引數化
即:在SQL Query
使用引數化變數。
在JMeter中,有兩個地方可以設定“使用者自定義變數”。
一種是“測試計劃”介面中設定“使用者自定義變數”。
一種是新增配置元件中的“使用者自定義變數”。
我們以“測試計劃”為例。如下圖:
(1)在“測試計劃”介面中設定“使用者自定義變數”。
我們新增了一個自定義變數使用者ID,如下圖:
(2)在JDBC Request
介面的SQL Query
中,使用${變數名}
的方式進行引用。
- 我們在
Varíable Name
填寫對應的資料庫配置名稱,與JDBC Connection Configuration
元件中的Varíable Name
對應。 Query Type
:選擇Select Statement
,因為我們只進行一條查詢的SQL語句。- 編寫SQL語句,並使用
${變數名}
方式引用引數化變數。
如下圖所示:
2、 在SQL Query
中使用佔位符傳遞引數
傳遞的引數值有常量和變數之分。
(1)傳遞的引數值是常量
傳遞2個常量:使用者ID=3,使用者名稱=孫悟空。
需要注意:
- 如果我們需要傳送帶有佔位符的SQL語句,
Query Type
:需要選擇Prepared Select Statement
。 Parameter values
引數值和Parameter types
引數型別,都必須要填寫(引數型別與表設計結構中的型別一致即可)。如果有多個佔位符,就需要有多組資料,之間用逗號分隔。- 傳送SQL請求時,第一個引數會自動賦值給第一個佔位符,以此類推,注意引數的編寫順序。
如下圖所示:
(2)傳遞的引數值是變數
也就是佔位符所接收的引數是一個引數化變數。我們把對應常量的位置,變成引數化變數即可,其他同上。
如下圖所示:
各種形式的引數化可以這樣使用。關於引數化相關知識,前面文章有詳細說明。
3、Variables names
引數的使用方法
Variables names
引數的作用是,把SQL語句查詢出來的資料儲存到變數中。一般查詢返回幾個欄位,就用幾個變數來進行接收,不同的變數之間用逗號隔開。
JMeter官網給的解釋是:如果給這個引數設定了值,它會儲存SQL語句返回的資料和返回資料的總行數。
假如,SQL語句返回2行,3列的資料,且Variables names
中設定為A,B,C
,那麼如下變數會被設定為:
A_#=2 # A列的總行數
A_1=3 # A列的第一個資料,也就是第1列, 第1行的資料
A_2=4 # A列的第二個資料,也就是第1列, 第2行的資料
B_#=2 # B列的總行數
B_1=sunwukong@1268.com # B列的第一個資料,也就是第2列, 第1行的資料
B_2=zhubajie@1268.com # B列的第二個資料,也就是第2列, 第2行的資料
C_#=2 # C列的總行數
C_1=孫悟空 # C列的第一個資料,也就是第3列, 第1行的資料
C_2=豬八戒 # C列的第二個資料,也就是第3列, 第2行的資料
說明:
- 如果返回結果為0,那麼
A_#
和C_#
會被設定為0,其它變數不會設定值。- 如果第一次請求返回6行資料,第二次請求只返回3行資料,那麼第一次那多的3行資料,線上程變數中會被清除。
- 可以使用
${A_#}
、${A_1}
來獲取相應的值,作為引數化資料進行傳遞。- 可以新增
Debug Sampler
元件,來檢視引數是否獲取到了。
示例:
(1)JDBC Request
元件介面內容
在Variable names
中定義接收資料的變數名,多個變數名之間用逗號分隔。
如下圖所示:
(2)檢視結果
新增一個取樣器Debug Sampler
用來檢視輸出的結果。(Debug Sampler
元件可以檢視到JMeter指令碼執行中所有的變數)
JDBC Request
請求結果,如下圖所示:
檢視Debug Sampler
中的輸出結果,如下圖所示:
我們從上圖中可以看到,JMeter把從資料庫中查詢出來的資料,儲存線上程變數中了。
提示:
A
代表第一列所有的資料,A_#
可以獲取到第一列的行數。A_n
可以獲得第一列第n行的資料。B
和C
的功能類似, 假如我們只需要第一列和第三列的資料,可以寫成A,,C
,中間的,
不可以省略。
4、Result variable name
引數使用方法
如果給這個引數設定值,它會建立一個物件變數,儲存所有返回的結果。
示例:
(1)JDBC Request
元件介面內容
在Result variable name
中定義接收資料的變數名。
如下圖所示:
(2)檢視結果
新增一個取樣器Debug Sampler
用來檢視輸出的結果。(Debug Sampler
元件可以檢視到JMeter指令碼執行中所有的變數)
JDBC Request
請求結果,如下圖所示:
檢視Debug Sampler
中的輸出結果,如下圖所示:
(3)資料處理
上面檢視到的結果集,我們如何應用裡面的資料呢?
我們可以建立一個BeanShell
取樣器,也可以在JDBC Request
取樣器下一級新增後置處理器BeanShell PostProcessor
元件。
在裡邊編寫如下程式碼,來獲取需要的指定資料,提供給後面的介面請求使用。
物件中具體資料的獲取方法:
columnValue = vars.getObject("resultObject").get(0).get("Column Name")
5、總結:
以上我們就把Parameter values
、Parameter types
、Variable names
、Result variable name
的使用方式進行了說明。
在日常工作中,可以舉一反三,靈活使用。
6、注意事項:
(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