『動善時』JMeter基礎 — 43、JMeter對資料庫的查詢操作

提示:

關於JMeter如何連接MySQL資料庫,前面文章已經詳解的講解過了。因為配置資料庫連接是比較固定的步驟,這裡就不重複講解了。

本篇文章主要詳細說明,使用JDBC Request組件,如何對資料庫進行查詢的各種操作。

JMeter中查詢語句的操作步驟:

  1. 添加測試計劃。
  2. 添加執行緒組,設置執行緒組的次數。
  3. 添加JDBC Connection Configuration組件,配置資料庫連接。
  4. 添加JDBC Request請求,編寫SQL語句,使用參數化。
  5. 運行腳本,發送SQL請求。
  6. 添加察看結果樹,查看結果。

1、使用「用戶自定義變數」實現參數化

即:在SQL Query使用參數化變數。

在JMeter中,有兩個地方可以設置「用戶自定義變數」。

一種是「測試計劃」介面中設置「用戶自定義變數」。

一種是添加配置元件中的「用戶自定義變數」。

我們以「測試計劃」為例。如下圖:

(1)在「測試計劃」介面中設置「用戶自定義變數」。

我們添加了一個自定義變數用戶ID,如下圖:

image

(2)在JDBC Request介面的SQL Query中,使用${變數名}的方式進行引用。

  1. 我們在Varíable Name填寫對應的資料庫配置名稱,與JDBC Connection Configuration組件中的Varíable Name對應。
  2. Query Type:選擇Select Statement,因為我們只進行一條查詢的SQL語句。
  3. 編寫SQL語句,並使用${變數名}方式引用參數化變數。

如下圖所示:

image

2、 在SQL Query中使用佔位符傳遞參數

傳遞的參數值有常量和變數之分。

(1)傳遞的參數值是常量

傳遞2個常量:用戶ID=3,用戶名=孫悟空。

需要注意:

  1. 如果我們需要發送帶有佔位符的SQL語句,Query Type:需要選擇Prepared Select Statement。
  2. Parameter values參數值和Parameter types參數類型,都必須要填寫(參數類型與表設計結構中的類型一致即可)。如果有多個佔位符,就需要有多組數據,之間用逗號分隔。
  3. 發送SQL請求時,第一個參數會自動賦值給第一個佔位符,以此類推,注意參數的編寫順序。

如下圖所示:

image

(2)傳遞的參數值是變數

也就是佔位符所接收的參數是一個參數化變數。我們把對應常量的位置,變成參數化變數即可,其他同上。

如下圖所示:

image

各種形式的參數化可以這樣使用。關於參數化相關知識,前面文章有詳細說明。

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列的總行數
[email protected]  		# B列的第一個數據,也就是第2列, 第1行的數據
[email protected]   		# 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中定義接收數據的變數名,多個變數名之間用逗號分隔。

如下圖所示:

image

(2)查看結果

添加一個取樣器Debug Sampler用來查看輸出的結果。(Debug Sampler組件可以查看到JMeter腳本運行中所有的變數)

JDBC Request請求結果,如下圖所示:

image

查看Debug Sampler中的輸出結果,如下圖所示:

image

我們從上圖中可以看到,JMeter把從資料庫中查詢出來的數據,存儲在執行緒變數中了。

提示:

  • A代表第一列所有的數據,A_#可以獲取到第一列的行數。
  • A_n可以獲得第一列第n行的數據。
  • B和C的功能類似, 假如我們只需要第一列和第三列的數據,可以寫成A,,C,中間的,不可以省略。

4、Result variable name參數使用方法

如果給這個參數設置值,它會創建一個對象變數,保存所有返回的結果。

示例:

(1)JDBC Request組件介面內容

在Result variable name中定義接收數據的變數名。

如下圖所示:

image

(2)查看結果

添加一個取樣器Debug Sampler用來查看輸出的結果。(Debug Sampler組件可以查看到JMeter腳本運行中所有的變數)

JDBC Request請求結果,如下圖所示:

image

查看Debug Sampler中的輸出結果,如下圖所示:

image

(3)數據處理

上面查看到的結果集,我們如何應用裡面的數據呢?

我們可以創建一個BeanShell取樣器,也可以在JDBC Request取樣器下一級添加後置處理器BeanShell PostProcessor組件。

在裡邊編寫如下程式碼,來獲取需要的指定數據,提供給後面的介面請求使用。

image

對象中具體數據的獲取方法: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

參考://www.cnblogs.com/linbo3168/p/6039489.html