轉Jmeter之JDBC請求參數化
Jmeter之JDBC請求參數化
在HTTPsample中,我們經常會使用參數化或者正則表達提取器(關聯)使我們的請求參數轉換為變量,以便更正確、多樣的調試腳本。那么,同樣是工作中經常用到的JDBC請求,它的參數化以及關聯該怎么做呢?這篇文章給大家詳細介紹JDBC請求的參數化。
環境准備
Jmeter(我使用的是3.1版本,最新版本為3.3,不影響本次演示)
一個可連接數據庫
JDBC驅動
OK,下面進入正文。
A
首先,我們在測試計划下,把JDBC驅動包添加上,也可以將驅動包放入jmeter的lib目錄下,即可自動加載。
B
然后,新建一個線程組→JDBC Connection Configuration(連接數據庫組件)→JDBC Request(JDBC請求)
C
接下來,配置JDBC Connection Configuration
Ps 下面介紹比較重要的幾個參數其他地方可照截圖配置即可。
Variable Name:連接名稱,自定義填寫。
Validation Query:驗證查詢,不同版本的填寫格式可能不同(比如3.1是Select 1,2.6是Select1),格式錯誤會報錯。最新的Jmeter3.3已經做成下拉框,比較人性化。
Database URL:數據庫url,格式固定。
jdbc:mysql://{ip}:{port}/{dbname}?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true
jdbc:mysql:// 表明連接的數據庫是mysql
ip 數據庫服務器地址
port mysql端口號
dbname 數據庫名稱
useUnicode=true 使用Unicode編碼格式(字符集編碼格式)
characterEncoding=utf8 使用UTF-8解碼(字符集編碼格式)
allowMultiQueries=true 允許多個query一起使用(1個請求中添加多個sql語句)
D
配置完畢,接下來填寫JDBC請求
Variable Name:與JDBC Connection Configuration中的Variable Name保持一致
Query Type:語句類型,查詢用select,增刪改用update,一起用可以選擇callable
Query:填寫對應的語句(這里用了一個簡單的查詢語句作為示例)
E
以上,我們JDBC請求已經完成,我們添加一個查看結果樹,看看請求結果。
JDBC請求響應正常。
准備工作已經完成,接下來,開始我們今天的目標。
將查詢語句參數化
1
方法1:使用CSV元件,將語句對應的部分替換成CSV文件中內容(與http請求參數化方式一樣)
查詢結果正常,參數取值正常。成功!
2
方法2:使用占位符,將替換語句中對應的部分。
a:Query Type修改為Prepared Select Statement
b:在where子句中將參數數值填寫為?
c :在下方的Parameter values中把值填上,多個參數用,分隔,數量與?保持一致(第一個值對應第一個?,以此類推)
d:Parameter types填為varchar,多個參數用,分隔,數量與?保持一致(不管什么數據類型均填寫為varchar)
上圖的查詢語句最終為:
select id,stuid,cname,grade from score where id = 10 or cname = 娃哈哈;
我們來看一下結果
查詢結果正確。成功!
注意:
1、Parameter values只能用在where子句中,如果放在查詢字段中的話,它會將該字段的結果全部替換為值本身,而不是數據庫的查詢結果。如下:
查詢結果如下,id沒有正確獲取,失敗!
2、Parameter values也可以使用變量噢,也就是CSV元件中定義變量后,可以在Parameter values中使用${}引用,這個大家自己嘗試一下,在此不做演示。
獲取查詢結果
上面只是介紹了如何給JDBC請求做參數化,那么,如果我想獲取JDBC的查詢結果,類似於正則表達式提取器獲取http請求返回值,該怎么做呢?
由於查詢返回的是一個結果集,以行列的形式呈現,所以,我們用通常的正則表達式提取是行不通的。但是,JDBC請求本身提供了這種功能,就是Query下方的Variable Name(與上方的連接名稱不一樣!!!)
Variable N
ame是按照查詢結果列數取該列的所有值,多個參數以,分隔。我們以示例說明
Variable Name設置如圖,為方便查看,我們添加一個Debug PostProcessor。查看參數結果。
下面是我們的查詢結果
查看Debug PostProcessor結果
從Debug PostProcessor的結果來看,Variable Name中定義的test1,test2,test3,test4分別是查詢結果中的第一、第二、第三、第四列所有的結果,test1_#則代表這一列結果的總數,也就是查詢結果的總行數。如果要使用里面任意參數,直接${}引用就OK。
如果只想獲取某一列的查詢結果,有2種方法。
1
方法1:直接修改sql,只查詢需要的那一列,Variable Name中填寫1個參數即可。
2
方法2:指定參數的列數,比如cname的查詢結果中為第三列,那么在Variable Name中可以寫成這樣,表示第一、第二列都為空,第三列的結果保存為test參數。
以上結果大家可以自己試驗。
OK。現在我們知道Variable Name會將某一列的結果保存為數組,並可以直接引用,那么,我們現在想獲取這個數組的所有結果,也就是獲取這個字段所有的值,該怎么操作呢?
同樣,有2種方法。
1
方法1:使用foreach控制器,因為Variable Name輸出的是一個數組,那么就可以使用foreach控制器,將數組內的值全部取出來。
運行一下,查看取值結果
取值正常,成功!
雖然,foreach能夠取出所有的值,但是foreach控制器是發現如果還能夠往下取值,它就會自動循環,而不進行迭代。這在大多數情況不符合我們的使用需求。
2
方法2:利用計數器,進行每次迭代的更替取值。下面進行演示。
修改線程組設置,運行,查看取值結果
取值正確,成功!
使用計數器和JDBC的Variable Name配合,可以完成從數據庫取值后,通過迭代來控制參數取值的目的。是不是覺得這種方式很熟悉?沒錯!其實咱們的CSV元件就是通過迭代來控制參數取值的。也就是說,使用上面這種方式,我們可以直接從數據庫查到我們想要的數據,然后通過迭代來取值,從而省去了獲取參數化文件和配置CSV元件的過程。
雖然,使用JDBC和計數器的方式來實現參數化略顯繁瑣,但是因為是直接從數據庫中取值,所以即使數據發生變化,也不用去修改腳本。也不存在CSV文件路徑、編碼格式以及數據准確性等等一系列的問題。並且,由於JDBC請求只是作為獲取數據來源用的,所以使用僅一次控制器即可,對本身測試的影響並不大(查詢數據不大的情況下)。
以上,是本篇分享的所有內容,如有不合理之處,希望及時指出。