Jmeter 將 JDBC Request 查詢結果作為下一個介面引數方法
一、前言
本文只介紹將 JDBC Request
查詢結果作為下一個介面引數的方法,下載 mysql-connector-java-5.1.42-bin.jar
,怎麼將jmeter
連線資料庫等等準備工作可以百度,下面直接進入正題。
二、需求
存在一個tieba_info
表,表結構如下圖
現在有一個需求,從資料庫tieba_info
表查出rank
小於某個值的username
和uuid
,然後把所有查出來的 username
和 uuid
作為引數值,用於下一個介面,注意 username
和uuid
要一一對應
三、分析及實踐
1、分析
- 要查出
username
和uuid
jdbc request
,連線本地資料看,分別查詢出我們需要的username
和uuid
; rank
小於某個值,這個值我們可以做一個變數,方便管理。我們查出來的username
和uuid
可能會有很多個,具體多少根據我們的條件rank
來變化;- 查詢出所有
username
和uuid
後,我怎麼取到每一個username
和對應的uuid
的值? - 又怎麼把我們查出來的每一組
username
和uuid
作為引數值去請求下一個介面?這裡先說下,需要做一個迴圈。 - 我事先並不知道能查出多少條資料,那如何知道我們需要迴圈多少次?
2、實踐
1). 首先新增一個jdbc connection configuration
這裡的配置方法可以百度,我連線的是我本地的mysql
資料庫
2). 新增 1 個或者 2 個 jdbc request
,分別查詢 username
和 uuid
我這裡是用了兩個
可以看到,在這 2 個請求中,select 語句中出現了變數rank
,那我們可以
3). 新增一個【使用者定義的變數】
名稱就是我們的 sql 語句裡面的變數引用名rank
,值就根據需要自己填
sql 語句寫完了,就要
4). 確認是否查詢出資料
這個時候可以新增檢視結果樹,看看我們獲取到的 uuid
和 username
uuid
查出來的資料如下圖:
username
那我們需要的資料已經可以看到了,就是 uuid
和 username
下面的那些資料,他們是一一對應的
上面我們只是查出來資料,接下來我們就要
5). 提取username
和 uuid
資料
再回到我們的uuid
和username
兩個jdbc request
,在 username
這個request 裡面,下方的 variable name
這裡填上你想使用的變數名,也就是之後的介面中要用到的,我取的 username
,同理,uuid
的 request 裡也做相同操作,可以取為 uuid
,如 3、4 兩張圖
6). 驗證引數化是否成功
我模擬請求介面 localhost:3306/test
,然後引數傳 uuid
和 username
,引數值分別是我們獲取的 uuid
和 username
,那根據變數的寫法,我們可以寫成下圖所示。
注: ${變數名} 是
jmeter
裡面引數化的寫法
現在執行,然後檢視下請求結果
我發現請求裡面 username
和 uuid
引數化並沒有成功,那為什麼會不成功呢,經過一番搜尋,原來當使用 jdbc request 的結果作為引數時,要寫成 ${username_0}
這樣子,username
就是你的變數名,0 代表索引,索引是 0 就表示第一行,索引是 1 就表示第二行。
例如,我想取username
查詢結果第 4 行的資料,那我的變數值就需要寫成 ${username_3}
,再看看上面 uuid
和username
查詢結果是怎麼展示的
可以看到,查詢出來的資料,第一行是一個標題,這個標題就是我們 sql 語句裡面要查詢的欄位名,也就是說,我們在引數化的時候,第一行是不能取的,要從第二行開始取值,再回憶下,第一行的索引是 0,第二行的索引是 1,所以如果我們取第二行的uuid
應該是${uuid_1}
,同理 username
應該是 ${username_1}
那問題又來了,我們查出來的 username 和 uuid 有很多條,我是想所有的 username
和uuid
都請求一次,也就是說 ${username_1}
和 ${uuid_1}
裡面的 1 這個數字應該是要不斷變化的而不是某個固定的值,那怎麼才能讓他不斷變化呢
7). 新增計數器
對,就是計數器
我們新增一個計數器
由於我們從第 2 行開始取值,索引是 1,所以啟動填 1,每次我們往後多 1,所以遞增也填 1,最大值可不填,number format 就是數字格式,如果填 000,取值是 12,那最後會顯示為 012,而我們只需要本身的數字,所以就填 0,引用名稱就是後面需要用的變數名
有了計數器,能遞增了,那我們就需要
8). 把 username
和uuid
傳進去了
我們上面說了 ${username_1}
是取第二行,${username_2}
是取第三行,依次類推,那我們要從第二行也就是索引等於 1 開始取,一直到最後。上一步新增的計數器就起作用了,我們設定的計數器是從 1 開始計數,每次遞增 1,那麼跟我們想要的完全吻合,index
就是我們設定的計數器的變數名,可以直接用他來代替我們的索引 1,2,3,4 等等,那我們現在來把username
和index
兩個變數拼接起來,這裡如果你直接寫成 ${username_index}
或者 ${username_${index}}
都是不行的,因為兩個變數不能直接拼接,需要用到一個函式 __V
,不瞭解這個函式的可以百度看看,作用就是可以使 2 個變數可以拼在一起,所以我們拼接後的 username
變數應該是 ${__V(username_${index})}
,同理 uuid
的變數應該是 ${__V(uuid_${index})}
現在再來看看 我們請求介面有沒有把所有的username
傳進去
結果發現,引數化成功了,uuid
和username
的值與資料庫一致,並且匹配成功。但為啥只請求了一次,明明符合條件的資料有很多,那應該請求多次啊,為啥只把第一組 username
和uuid
傳進去了呢?
這是因為,我們傳的username
和 uuid
引數相當於做了引數化,有多個值,這時候就需要
9). 設定執行緒數或者新增一個迴圈控制器
但是我們並不知道到底需要迴圈多少次或者需要設定多少執行緒數,才能讓username
和uuid
剛好傳完,這個時候,我們需要多加一個 jdbc request 了,來查詢出我們符合條件的資料有多少條。SELECT count(*) from tieba_info where rank <= ${rank}
就是查詢符合條件的資料總數,同理我們在 variable names 填上一個變數名,以供後面使用,這裡我取 count
count
變數是我們之前查出來的所有資料的總數,這個總數是多少就說明我們需要多少執行緒或多少次迴圈。ok,那我們在 http 請求上右擊,點選插入上級 – 邏輯控制器 – 迴圈控制器,迴圈次數,我們使用count
變數,由於 count
變數查詢出來的結果肯定只有一個,那我們可以直接取結果的第二行資料,索引是 1,即${count_1}
,這樣就能把次數確定。這裡其實不能用新增執行緒的方式來做,因為這幾個 jdbc request 都在這個執行緒裡,如果設定多執行緒,jdbc request 也會多次請求,不合理,所以我們選擇更好的迴圈控制器
所有的東西都設定完了,就需要
10). 把我們的東西進行重新排序歸類
我們首先是有 jdbc connection config,然後有 uuid
和username
兩個 jdbc request,然後我們有一個測試的 http 請求,一個計數器,一個 count
的 jdbc request 和一個迴圈控制器,那麼這時候就需要把計數器和 http 請求全部移入迴圈控制器了,讓引數迴圈請求測試介面
最後的效果如圖,rank 變數值是 18,剛好 18 個 http 請求,每個請求的 username
和 uuid
都不同