在壓測的過程當中,爲了可以壓測整個鏈路,一般須要多個接口進行併發, 每一個接口的請求比例不盡相同。java
好比此時此刻,我在寫博客,不少人在瀏覽博客,或者點贊、評論博客等等等,這些行爲佔比是不一樣的。數組
那麼,咱們怎麼才能儘量的模擬線上真實場景,對每一個接口按照比例併發呢?併發
實現方法以下:dom
設定一個用做講解的併發場景:函數
好比,同一時刻,點贊博客的請求佔比10%,查看博客的請求佔比90%,比例是1:9。工具
如上場景,咱們能夠爲查看博客的請求設置循環次數爲9。性能
右擊【查看】請求→【插入上級】→【邏輯控制器】→【循環控制器】→【循環次數】設置爲9→【運行】→【查看結果樹】學習
在請求的名稱後面加上這個參數,就能夠看到請請求的順序:${__counter(true,i)}spa
${__threadNum}:統計線程數線程
${__counter(true,i)}:只統計該用戶的迭代次數,
${__counter(false,i)}:統計全部用戶的迭代次數,
${__threadNum}_${__counter(true,i):統計每一個線程下,每一個用戶的迭代次數。
能夠看出,【點贊】請求執行了1次,【查看】請求執行了9次
switch controller相似於程序中的switch函數,該Controller根據給定的值n(可使用參數)選擇執行其下的第n個子節點。
JMeter取樣器按順序編號,第一個取樣器(請求)編號爲0,第二個爲1,以此類推。
若是指定的編號超出了下面的節點數或者不指定,則運行第0個取樣器。
如上例,咱們給定的值n應該是{0,1,1,1,1,1,1,1,1,1};
0表明執行第一個取樣器,也就是其下的第一個子節點——【點贊】請求; 1表明執行第二個取樣器,也就是其下的第一個子節點——【查看】請求。
爲了更符合線上實際場景,咱們用一個random隨機數來控制請求的執行順序,而不是像方法1那樣順序執行。
操做步驟以下:
①添加BeanShell 取樣器及腳本
右擊【線程組】→【添加】→【取樣器】→【BeanShell 取樣器】→添加以下腳本
import java.util.Random; //設置比例爲1:9
int[] values = {0,1,1,1,1,1,1,1,1,1}; //利用random隨機函數來按照比例隨機執行http請求
int size = values.length; Random rd = new Random(); int n = rd.nextInt(size-1); System.out.println("value:"+values[n]); //新建參數"SWITCH_VALUE",並將經過隨機函數獲得的取樣器賦值給參數
vars.put("SWITCH_VALUE",String.valueOf(values[n]));
②添加Switch控制器
右擊【線程組】→【添加】→【邏輯控制器】→【switch 控制器】→設置控制變量,即上一步腳本里設置的參數「SWITCH_VALUE」→運行線程組
能夠看出,咱們共10條請求,【點贊】1條,【查看】9條。與咱們最初設置的1:9的比例一致。
如上場景,咱們能夠經過Java腳本自定義一個min-max的隨機數,而後用if控制器來控制發送哪一個請求。
如上場景,點贊與查看是1:9,咱們能夠定義一個生成1-10的隨機數,用if控制器來控制,if 隨機數=1,則執行【點贊】請求,if隨機數>1,則執行【查看】請求。
具體步驟以下:
①自定義隨機變量
選擇線程組→【添加】→【取樣器】→【Java請求】 (由於要寫Java腳本,因此須要先添加Java請求,在Java請求下添加取樣器)
選擇【Java請求】→【添加】→【前置處理器】→【BeanShell PreProcessor】→添加 設置自定義變量的腳本,生成隨機數【randNo】
//.......自定義隨機數的方法一........
import java.util.Random; class JmeterUtil{ public static int getRandNo(int min,int max){ Random random = new Random(); int randNo = random.nextInt(max)%(max-min+1) + min; return randNo; } } int r = JmeterUtil.getRandNo(1,10); vars.put("randNo",r.toString()); //.......自定義隨機數的方法二........
vars.put("randNo","${_Random(1,10)}");
②爲每一個請求添加if控制器,來控制比例
右擊【點贊】/【查看】請求→【插入上級】→【邏輯控制器】→【若是(If)控制器】→添加隨機數【randNo】的判斷
在這裏要注意,這裏只能填一個變量來做爲判斷條件,而不能直接填【${randNo}=1】,這樣if控制器是沒法解析的,因此,咱們要內置jexl3函數來實現表達式的計算。
步驟以下:
點擊【工具】→選擇【函數助手對話框】→選擇【jexl3】函數→將表達式填入函數參數的【值】那一列→點擊【生成】→點擊生成的函數便可複製→將複製的函數表達式粘貼在if的判斷條件框裏
這裏是點讚的if控制器,點讚的比例是1,因此咱們的判斷條件爲randNo==1。
【查看】請求的if控制器設置同上,只是判斷表達式由【&{randNo}==1】改成【&{randNo}>1】
運行結果以下:
能夠看出,比例基本一致,【點贊】請求有2個,【查看】請求有8個,隨機數不是10個數必定是1-10都會出現,因此會出現這種2:8的現象,壓測過程當中請求較大,故比例誤差是微乎其微的,可忽略。
具體步驟:
①右擊線程組→【添加】→【配置元件】→【Random Variable】→設置變量名稱、隨機範圍
爲每一個請求添加if控制器的方法同方法三中的步驟同樣,連變量名都同樣,原樣操做便可。
優勢:操做簡單易於實現
缺點:只能順序執行,沒法隨機執行
優勢:
能夠隨機執行
缺點:
若是接口較多,比例誤差較大,設置起來比較費勁,例如2:10:88,數組裏是2個0,10個1,88個2。
由於每次都要讀一遍BeanShell 取樣器,嚴重影響性能,使結果偏離現實。
優勢:可拓展性高,能夠根據需求用腳本實現,
缺點:
學習成本高,不適宜新手
性能低,沒執行一次,都要先執行下這個Java腳本
優勢:
易上手,操做簡單
性能高,由於用的是JMeter內置隨機數,因此比方法3性能更高一些。
缺點:
可拓展性差,不能根據特殊需求控制隨機變量的隨機性,只能設置一個隨機區間。
因此,
根據經驗,方法4是最適用大衆的按比例壓測的方法。
初入職場熱愛分享的打工人一枚,請你們多多指教~~