1. 程式人生 > >Jmeter將JDBC Request查詢結果作為下一個接口參數方法

Jmeter將JDBC Request查詢結果作為下一個接口參數方法

多條 在一起 循環控制 nbsp 根據 如果 sso log 設置

現在有一個需求,從數據庫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都不同

技術分享圖片

Jmeter將JDBC Request查詢結果作為下一個接口參數方法