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

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

一、前言

本文只介紹將 JDBC Request 查詢結果作為下一個介面引數的方法,下載 mysql-connector-java-5.1.42-bin.jar,怎麼將jmeter連線資料庫等等準備工作可以百度,下面直接進入正題。

二、需求

存在一個tieba_info 表,表結構如下圖

tieba_info表

現在有一個需求,從資料庫tieba_info表查出rank小於某個值的usernameuuid,然後把所有查出來的 usernameuuid作為引數值,用於下一個介面,注意 usernameuuid 要一一對應

三、分析及實踐

1、分析

  1. 要查出usernameuuid
    ,那麼首先就要有 1 個或者 2 個 jdbc request,連線本地資料看,分別查詢出我們需要的 usernameuuid
  2. rank 小於某個值,這個值我們可以做一個變數,方便管理。我們查出來的usernameuuid可能會有很多個,具體多少根據我們的條件 rank 來變化;
  3. 查詢出所有usernameuuid 後,我怎麼取到每一個username 和對應的 uuid的值?
  4. 又怎麼把我們查出來的每一組 usernameuuid 作為引數值去請求下一個介面?這裡先說下,需要做一個迴圈。
  5. 我事先並不知道能查出多少條資料,那如何知道我們需要迴圈多少次?

2、實踐

1). 首先新增一個jdbc connection configuration

這裡的配置方法可以百度,我連線的是我本地的mysql 資料庫

jdbc connection configuration

2). 新增 1 個或者 2 個 jdbc request,分別查詢 usernameuuid

我這裡是用了兩個

uuid jdbc request

username jdbc request

可以看到,在這 2 個請求中,select 語句中出現了變數rank,那我們可以

3). 新增一個【使用者定義的變數】

名稱就是我們的 sql 語句裡面的變數引用名rank,值就根據需要自己填

變數rank

sql 語句寫完了,就要

4). 確認是否查詢出資料

這個時候可以新增檢視結果樹,看看我們獲取到的 uuidusername

uuid 查出來的資料如下圖:

uuid結果

username

查詢出來的資料如下

username結果

那我們需要的資料已經可以看到了,就是 uuidusername 下面的那些資料,他們是一一對應的

上面我們只是查出來資料,接下來我們就要

5). 提取usernameuuid資料

再回到我們的uuidusername 兩個jdbc request,在 username 這個request 裡面,下方的 variable name 這裡填上你想使用的變數名,也就是之後的介面中要用到的,我取的 username,同理,uuid 的 request 裡也做相同操作,可以取為 uuid,如 3、4 兩張圖

username提取語句

6). 驗證引數化是否成功

我模擬請求介面 localhost:3306/test,然後引數傳 uuidusername,引數值分別是我們獲取的 uuidusername,那根據變數的寫法,我們可以寫成下圖所示。

注: ${變數名} 是jmeter 裡面引數化的寫法

介面引數化

現在執行,然後檢視下請求結果

檢視結果

我發現請求裡面 usernameuuid 引數化並沒有成功,那為什麼會不成功呢,經過一番搜尋,原來當使用 jdbc request 的結果作為引數時,要寫成 ${username_0}這樣子,username就是你的變數名,0 代表索引,索引是 0 就表示第一行,索引是 1 就表示第二行。

例如,我想取username查詢結果第 4 行的資料,那我的變數值就需要寫成 ${username_3},再看看上面 uuidusername 查詢結果是怎麼展示的

img

可以看到,查詢出來的資料,第一行是一個標題,這個標題就是我們 sql 語句裡面要查詢的欄位名,也就是說,我們在引數化的時候,第一行是不能取的,要從第二行開始取值,再回憶下,第一行的索引是 0,第二行的索引是 1,所以如果我們取第二行的uuid應該是${uuid_1},同理 username應該是 ${username_1}

那問題又來了,我們查出來的 username 和 uuid 有很多條,我是想所有的 usernameuuid 都請求一次,也就是說 ${username_1}${uuid_1}裡面的 1 這個數字應該是要不斷變化的而不是某個固定的值,那怎麼才能讓他不斷變化呢

7). 新增計數器

對,就是計數器

我們新增一個計數器

計數器

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

有了計數器,能遞增了,那我們就需要

8). 把 usernameuuid傳進去了

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

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

img

結果發現,引數化成功了,uuidusername 的值與資料庫一致,並且匹配成功。但為啥只請求了一次,明明符合條件的資料有很多,那應該請求多次啊,為啥只把第一組 usernameuuid傳進去了呢?

這是因為,我們傳的usernameuuid引數相當於做了引數化,有多個值,這時候就需要

9). 設定執行緒數或者新增一個迴圈控制器

但是我們並不知道到底需要迴圈多少次或者需要設定多少執行緒數,才能讓usernameuuid剛好傳完,這個時候,我們需要多加一個 jdbc request 了,來查詢出我們符合條件的資料有多少條。SELECT count(*) from tieba_info where rank <= ${rank}就是查詢符合條件的資料總數,同理我們在 variable names 填上一個變數名,以供後面使用,這裡我取 count

img

count 變數是我們之前查出來的所有資料的總數,這個總數是多少就說明我們需要多少執行緒或多少次迴圈。ok,那我們在 http 請求上右擊,點選插入上級 – 邏輯控制器 – 迴圈控制器,迴圈次數,我們使用count 變數,由於 count變數查詢出來的結果肯定只有一個,那我們可以直接取結果的第二行資料,索引是 1,即${count_1},這樣就能把次數確定。這裡其實不能用新增執行緒的方式來做,因為這幾個 jdbc request 都在這個執行緒裡,如果設定多執行緒,jdbc request 也會多次請求,不合理,所以我們選擇更好的迴圈控制器

所有的東西都設定完了,就需要

10). 把我們的東西進行重新排序歸類

我們首先是有 jdbc connection config,然後有 uuidusername 兩個 jdbc request,然後我們有一個測試的 http 請求,一個計數器,一個 count的 jdbc request 和一個迴圈控制器,那麼這時候就需要把計數器和 http 請求全部移入迴圈控制器了,讓引數迴圈請求測試介面

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

img

四、最後成果