1. 程式人生 > >Jmeter將JDBC Request查詢結果作為下一個介面引數方法

Jmeter將JDBC Request查詢結果作為下一個介面引數方法

現在有一個需求,從資料庫tieba_info表查出rank小於某個值的username和count(*),然後把所有查出來的username和count(*)作為引數值,用於下一個介面。

tieba_info表結構如下圖

 

分析:

1.要查出username和count(*),那麼首先就要有1個或者2個 jdbc request,連線本地資料看,分別查詢出我們需要的username和count(*);

2.rank小於某個值,這個值我們可以做一個變數,方便管理。不管這個值是多少,我們查出來的count(*)將只有一個值,而username會有很多個,具體多少根據我們的條件rank來變化;

3.查詢出所有username後,我怎麼取到每一個username的值?

4.又怎麼把我們查出來的每一個username作為引數值去請求下一個介面?這裡先說下,需要做一個迴圈。

5.我事先並不知道能查出多少條資料,那如何知道我們需要迴圈多少次?

 

接下來逐一解決我們的問題。

 

實踐:

1.首先新增一個jdbc connection configuration,這裡的配置方法可以百度,我連線的是我本地的mysql資料庫

 

2.新增1個或者2個 jdbc request,分別查詢username和 count(*),我這裡是用了兩個

 

3.可以看到,在username這個請求中,select語句中出現了變數rank,那我們可以新增一個【使用者定義的變數】,名稱就是我們的sql語句裡面的變數引用名rank,值就根據需要自己填

 

4.sql語句寫完了,就要提取我們需要的結果了

這個時候可以新增檢視結果樹,看看我們獲取到的count(*)和username

 

count查出來的資料如下圖:

 

username查詢出來的資料如下

那我們需要的就是這個count(*)就是20,和20個username的值

 

 

5.上面我們只是查出來資料,接下來我們就要提取username和count(*)資料,再回到我們的count和username jdbc request

 

在username這個request裡面,下方的 variable name這裡填上你想使用的變數名,也就是之後的介面中要用到的,我取的username,同理,count的request裡也做相同操作,可以取為count

 

 

6.現在我們要測試我們的引數化到底成功沒有,我模擬請求介面localhost:3306/test,然後引數傳count和username,引數值就是我們獲取的username和count(*)

 

檢視下請求結果

我發現請求裡面 username和count引數化並沒有成功,那為什麼會不成功呢,經過一番搜尋,原來當使用jdbc request的結果作為引數時,要寫成${username_1}這樣子,1代表你查出來的資料第一行,想取第幾行就把1改成幾。那問題來了,我們查出來count(*)是肯定只有一條資料,那我們可以確定寫成${count_1},但是username卻有很多條,我是想所有的username都請求一次,也就是說如果是username這個變數的話,1這個數字應該是要不斷變化的而不是某個固定的值,那怎麼才能讓他不斷變化呢

 

7.計數器

對,就是計數器

我們新增一個計數器

由於我們從第一行開始取值,所以啟動填1,每次我們多1,所以遞增也填1,最大值可不填,number format就是數字格式,如果填000,取值是12,那最後會顯示為012,而我們只需要本身的數字,所以就填0,引用名稱就是後面需要用的變數名

 

8.有了計數器,能遞增了,那我們就能把username傳進去了。我們上面說了${username_1}是取第一行,${username_2}是取第二行,依次類推,那我們要從1開始取,一直到最後。上一步新增的計數器就起作用了,我們設定的計數器是從1開始計數,每次遞增1,那麼跟我們想要的完全吻合,index就是我們設定的計數器的變數名,可以直接用他來代替我們的數字1,2,3,4等等,那我們現在來把username和index兩個變數拼接起來,這裡如果你直接寫成 ${username_index}或者 ${username_${index}}都是不行的,因為兩個變數不能直接拼接,需要用到一個函式 __V,不瞭解這個函式的可以百度看看,作用就是可以使2個變數可以拼在一起,所以我們拼接後的username變數應該是${__V(username_${index})}

 

現在再來看看 我們請求介面有沒有把所有的username傳進去

 

結果發現,為啥還是隻請求了一次,明明count(*)查出來是20,那應該請求20次啊,為啥只把第一個username傳進去了呢?

 

9.這是因為,我們傳的username引數相當於做了引數化,有多個值,這時候就需要在設定執行緒數或者新增一個迴圈控制器,但是我們並不知道到底需要迴圈多少次或者需要設定多少執行緒數,才能讓username剛好傳完,這個時候,我們之前查詢的count就起作用了,count變數是我們之前查出來的所有資料的總數,這個總數是多少就說明我們需要多少執行緒或多少次迴圈。ok,那我們在http 請求上右擊,點選插入上級--邏輯控制器--迴圈控制器,迴圈次數,我們使用count變數,即${count_1},這樣就能把次數確定。這裡其實不能用新增執行緒的方式來做,因為count 和 username兩個jdbc request都在這個執行緒裡,如果設定多執行緒,這兩個也會多次請求,不合理,所以我們選擇更好的迴圈控制器

 

10.所有的東西都設定完了,就需要把我們的東西進行重新排序歸類

我們首先是有jdbc connection config,然後有count和username兩個jdbc request,然後我們有一個測試的http請求,一個計數器和一個迴圈控制器,那麼這時候就需要把計數器和http請求全部移入迴圈控制器了,否則還是無法傳入全部username值

最後的效果如圖,rank變數值是20,剛好20個http請求,每個請求的username都不同