Jmeter動態獲取數據庫數據(超詳細)

目錄

(一)下載對應數據庫的jdbc驅動jar包

(二)Jmeter導入對應數據庫的jdbc驅動jar包

(三)JMeter連接Mysql數據庫

(四)創建線程組

(五)創建數據庫請求

(六)把從數據庫查得的數據作爲另一個請求的入參(針對只有1行數據處理)

方法一:使用後置處理器BeanShell PostProcessor處理結果集數據,重構變量

方法二:不需要使用後置處理器BeanShell PostProcessor,在JDBC Request是設置保存變量

方法三:其他

(七)查詢結果集有多條數據的情況,一行行取值

方法一:採用__V函數拼接2個變量。

方法二:採用__BeanShell函數獲取值,其中index是通過添加計數器count獲取的;


寫在前面:因爲是邊操作邊寫的,之前截的圖有些注意事項沒有說清楚,所以圖片有些調整之後是後面補進去的,所以看着圖片前後有點一樣。但操作順序說明是沒問題的。

當然這個也是參考了各位網上的大神的經驗並一一試驗得出來的結果。如果有類似又未標明出處的地方,敬請原諒。


 

(一)下載對應數據庫的jdbc驅動jar包


參考博客:https://www.cnblogs.com/FKdelphi/p/7670740.html

mysql的jdbc驅動包:mysql-connector-java-5.1.44-bin.jar;

下載地址:https://dev.mysql.com/get/Downloads/Connector-J/mysql-connector-java-5.1.44.zip

文件名:mysql-connector-java-5.1.44.zip


下載成功後解壓到某個目錄下。如:

(二)Jmeter導入對應數據庫的jdbc驅動jar包

JMeter需要連接數據庫,就要導入對應的jdbc驅動jar包。操作步驟如下:

(1)選中【測試計劃】,頁面最下方【添加目錄或jar包到ClassPath】,點擊【瀏覽】;

(2)選擇剛剛解壓的目錄裏的mysql數據庫的jdbc驅動jar包:mysql-connector-java-5.1.44-bin.jar;

(3)添加完成可看到對應的記錄

(三)JMeter連接Mysql數據庫

(1)選擇測試計劃-右鍵添加配置元件-JDBC Connection Configuration

(2)填入對應的連接信息:

Variable Name for created pool:變量名,類似服務別名,可自行定義

DataBase URL:格式【jdbc:mysql://數據庫地址:端口】,【jdbc:mysql://】是jdbc連接mysql數據庫固定前綴

JDBC Driver Class:選擇對應的驅動類

Username:用戶名

Password:密碼

(四)創建線程組

(1)選中測試計劃,右鍵添加線程組

(2)配置線程組參數

線程數:1

Ramp-Up時間(秒):1

循環次數:1

(五)創建數據庫請求

(1)選擇線程組,右鍵【添加-取樣器-jdbc request】

(2)爲了方便我們看請求有沒有成功,還是先新增一個察看結果樹:選中【線程組】,右鍵【添加-監聽器-察看結果樹】

(3)配置jdbc request的內容

【Variable Name Bound to pool】要與(三)連接數據庫時填寫的【Variable Name for created pool】變量名一致。

【Query Type】:選擇【Select Statement】。當然也可以選擇insert、update等,不過我只是爲了拿到數據庫裏的用戶數據,用來作爲接口測試的入參,所以select查詢就足夠了。

【Result Variable Name】:查詢結果集的變量名;

【Handle ResultSet】:設置查詢結果集的處理類型;

(4)這時候我們就可以允許一下看是否能查詢到我們想要的值了。不過運行之前要先保存下來。

(5)點擊允許,則執行線程組,發起jdbc request

(6)通過察看結果樹,查看請求結果

(6.1)從【取樣器結果】我們可以看到jdbc Request請求響應成功

(6.2)從【請求-Request Body】可以查看請求數據:檢查是不是我們寫的sql;或者如果之前寫的sql是帶參數的,這裏就可以看到實際發起請求的時候,具體的參數值。

(6.3)從【響應數據-Response Body】則可以查看本次請求返回的數據。因爲列較多,產生了折行。

(六)把從數據庫查得的數據作爲另一個請求的入參(針對只有1行數據處理)

方法一:使用後置處理器BeanShell PostProcessor處理結果集數據,重構變量

(1)在JDBC Request下添加後置處理器,處理查詢結果集:

(1.1)選擇JDBC Request,右鍵【添加-後置處理器-BeanShell PostProcessor】

(1.2)用腳本將查詢結果集中需要的字段放到新的變量裏去

以下爲腳本的代碼:

   Object member_result = vars.getObject("member_result");
   vars.put("uname",member_result.get(0).get("uname").toString());
   vars.put("name",member_result.get(0).get("name").toString());
var o_size = vars.getObject("member_result").size();
Object member_result = vars.getObject("member_result");
for(var i = 0;i<o_size;i++){
    var member = member_result.get(i);
    vars.put("uname",member.get("uname").toString());
    vars.put("name",member.get("name").toString());
}

(2)新建一個http請求:選擇線程組,右鍵【添加-取樣器-HTTP請求】

這個是copy我們目前在測試的的一個接口,從app錄製下來的腳本,裏面的參數我就直接參照配置了,GET/POSt請求的區別在入門的時候就瞭解下就知道了。簡單來說,Get相對簡單,一般是爲了獲取數據;POST相對比較安全,更多用來交互數據。

(3)因爲我用到的接口是帶信息頭的,所以還要在對應的請求下添加一個【http信息頭管理器】,配置對應的信息頭數據。

(3.1)選擇http請求,右鍵【添加-配置元件-HTTP信息頭管理器】

(3.2)添加信息頭的參數:每個接口要求的信息頭參數都不一樣,所以這裏只能根據各自具體的接口說明/文檔來填寫。

(4)填寫HTTP請求的內容:

協議:HTTP

服務名稱或IP:訪問地址

端口:8080

方法:POST。可選擇GET/POST/...還有其他的,我還不熟。

路徑:填寫對應的接口路徑

內容編碼:utf-8

消息體數據:我這個接口的參數的json格式的。對應的參數引用格式爲:${變量名}

(6)保存,運行,察看結果樹

(6.1)【取樣器結果】:成功

(6.2)【請求-Request Body】對應的參數值,取值正確;

(6.3)【響應數據-Response Body】:響應數據返回正確;

方法二:不需要使用後置處理器BeanShell PostProcessor,在JDBC Request是設置保存變量

(1)保存查詢sql結果字段


參考博客:https://www.cnblogs.com/wuyonghuan/p/7479582.html

ariable Name: 數據庫連接池的名字,需要與上面配置的JDBC Connection Configuration中Variable Name Bound Pool的Variable Name相同 

Query:填寫的sql語句未尾不要加“;” 

Parameter valus:參數值 

Parameter types:參數類型,可參考:Javadoc for java.sql.Types 

Variable names:保存sql語句返回結果的變量名 

Result variable name:創建一個對象變量,保存所有返回的結果 

Query timeout:查詢超時時間 

Handle result set:定義如何處理由callable statements語句返回的結果

variables names設置爲A,,C,那麼如下變量會被設置爲:

A_#=2 (總行數)

A_1=第1列, 第1行

A_2=第1列, 第2行

C_#=2 (總行數) 

C_1=第3列, 第1行

C_2=第3列, 第2行

 

如果返回結果爲0,那麼A_#和C_#會被設置爲0,其它變量不會設置值。

如果第一次返回6行數據,第二次只返回3行數據,那麼第一次那多的3行數據變量會被清除。

可以使用${A_#}、${A_1}...來獲取相應的值


 

(2)HTTP請求,可以直接使用JDBC Request 的設置的字段變量來進行傳值,格式如圖:${uname_1}、${name_1}

(3)保存、運行、察看結果樹

(3.1)JDBC Request的【響應數據-Response Body】

(3.2)HTTP請求,【取樣器結果】,請求響應成功

(3.3)HTTP請求,【請求-Request Body】,變量傳值正確

(3.4)HTTP請求,【響應數據-Response Body】,響應數據正確

方法三:其他

如果只是單純爲了傳個值,還是很簡單的,可以用正則表達式設置一個變量,也可以直接從數據庫查詢到數據直接把實際值代入使用就可以了。但我們更多想實現的是,從數據庫獲取數據,將符合條件的數據(通常不止一行)來循環調用http請求來進行接口測試/壓力測試。

 

(七)查詢結果集有多條數據的情況,一行行取值

方法一:採用__V函數拼接2個變量。


參考博客:

https://blog.csdn.net/defonds/article/details/41476727

https://www.cnblogs.com/beiank/p/9030792.html

2個變量的拼接,以下4種方式都是錯誤的:

1.${account_index}
2.${account_${index}}
3.${account}_${index}
4.${__V(${account} _${index})}

正確的方式是:${__V(account _${index})}


 

(1)添加一個循環控制器:目標接口放入到循環控制器下,另外添加一個計數器,因爲我們取的值是根據${username_N}來取的,那麼這個N可以通過計數器遞增的方式獲得。

(2)將目標HTTP請求移到循環控制器裏

(3)新增計數器:選擇循環控制器,右鍵【添加-配置元件-計數器】。因爲我們有2個字段作爲參數,所以添加2個計數器。

(3)生成函數:選項-函數助手對話框


參考說明:https://www.cnblogs.com/wuyonghuan/p/7479582.html

函數__V可以用於執行變量名錶達式,並返回執行結果。它可以被用於執行嵌套函數引用(目前JMeter不支持)。

例如,如果存在變量A1、A2和N=1,則:

${A1}:能正常工作。

${A${N}}:無法正常工作(嵌套變量引用)。

${__V(A${N})}:可以正常工作。A${N}變爲A1,函數 __V返回變量值A1。


生成2個函數:${__V(uname_${N},)}、${__V(name_${N},)}

(4)將生成的函數作爲變量使用,替換HTTP請求中需要參數化的參數值:

 

 

(5)JDBC Request,修改一下查詢sql,查詢結果集會返回多條數據;

 

(6)選擇線程組,設置循環次數=2(我們以2條數據來舉例子)

(7)保存、清除察看結果樹的記錄、運行、察看結果樹

(7.1)第一個HTTP請求數據:【請求-Request Body】

(7.2)第一個HTTP請求的響應數據:【響應-Response Body】

(7.3)第二個HTTP請求數據:【請求-Request Body】

(7.4)第二個HTTP請求的響應數據:【響應-Response Body】

當然,如果是壓測需要的話,還可以添加聚合報告來自動生成聚合報告來評估壓測結果。這裏就不再詳細說明。

方法二:採用__BeanShell函數獲取值,其中index是通過添加計數器count獲取的;

其實這個方法看起來更簡單,但不知道哪裏搞錯了還是怎麼樣,這個方法我試驗了幾次都沒出來正確的結果。待後續試驗出來再補充進去吧。

參考博客:https://www.cnblogs.com/beiank/p/9030792.html

${__BeanShell(vars.getObject("result").get(${__intSum(${index},-1)}).get("account"))}

${__BeanShell(vars.getObject("result").get(${__intSum(${index},-1)}).get("password"))}

 

 

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章