1. 程式人生 > >jmeter 指令碼增強(引數化)

jmeter 指令碼增強(引數化)

jmeter 之中通常場景需求需要很多不同的資料作為請求的一部分引數,所以需要將這些不同的資料做為引數使用變數傳遞給每次請求 指令碼的引數化主要有以下幾種方式 1. 使用配置元件CSV Data Set Config 配置解析:
  • Filename: 讀取的檔案,檔案裡有自己準備為可變引數的賦值資料,多引數可使用多列,檔案字尾也不限制,可以寫相對路徑也可以寫絕對路徑。
  • File encoding: 讀取檔案時的編碼型別,預設是UTF-8,所以如果你的檔案不是這個編碼方式,那就需要與自己的檔案編碼方式一致
  • Variable Names(comma-delimited):引數變數名稱,引數檔案裡有幾列這裡就有幾個變數,並且順序與引數檔案裡的每一列相對應,是以逗號分隔(半形),變數名是自定義的,但是定義一個比較有意義的變數名會使指令碼具有更好的可讀性。
  • Delimiter(use '\t' for tab): 檔案中每一列的分隔符,預設是逗號 (半形),但是注意這裡是配置引數檔案裡的分隔符,而不是定義變數名的分隔符,變數名的分隔符只能是逗號。
  • Allow quoted data?:  此欄位表示是否允許引數檔案中的引數值已經被引用,比如引數檔案中的值在雙引號裡,那麼這裡需要設定True才能正常讀取引數檔案中的值,這裡預設是False,比如下圖的引數檔案中的第一列均有雙引號,那麼這裡就需要設定為True才能正常讀取

  • Recyle on EOF:設定引數檔案讀到末尾的時候是否從頭再讀,預設是True
  • Stop thread on EOF:執行緒讀取檔案到末尾是是否停止,預設False,如果這裡設為True, Recyle on EOF 這個設定也是True時,則指令碼執行執行緒數會以執行緒數和引數檔案的行數中數值最小的為準
  • Sharing mode:這個配置元件共享給哪些執行緒,All threads
    測試計劃中所有執行緒,假如說有3個執行緒,則每個執行緒讀取分別對應引數檔案裡的行;Current thread group:當前執行緒組,假設有執行緒組A、執行緒組BA組內有執行緒A1到執行緒A3,執行緒組B內有執行緒B1到執行緒B3。取值情況是:執行緒A1取到了第1行,執行緒A2取第2行,現在B1取第1行,執行緒B2取第2行等等;Current thread:當前執行緒,假設測試計劃內有執行緒1到執行緒3,則每個執行緒都取引數檔案的第一行。
  • 注:對於Allow quoted data 和 Sharing mode中的edit選專案前還沒搞明白
配置完成後就可以在指令碼中使用定義好的變數,使用方法是${變數名},如下: 在請求中使用
在響應斷言中使用 2. 使用jmeter自帶函式獲取引數值 jmeter中可以獲取引數值的有__Random( , , )__threadNum__CSVRead( , )__StringFromFile( , , , )四個函式
  • __Random(,,):使用函式助手對話方塊,開啟此函式設定如圖,最後一個欄位是選填的,定義隨機取到的值儲存的變數名,比如請求的時候使用了隨機函式,然後響應斷言的時候需要用到此隨機值,即可使用自定義的變數,${Rvalue},將生成的字串拷貝到用到的地方,可以看到此函式的使用形式為$__Random(param1,param2,param3),前兩引數是隨機數的開始和結束值,最後一個引數是此函式隨機生成的值所儲存的變數,熟悉了構成就可以直接手動去寫了,不用再使用函式助手對話方塊

請求中使用 響應斷言中使用隨機函式生成的值
  • __threadNum:這個函式使用時沒有任何引數,只是生成當前執行緒的執行緒編號,使用方法${__threadNum},如響應斷言中加入這個函式,在斷言結果中檢視到如圖

  • __CSVRead(,):通過列讀取檔案,開啟函式助手對話方塊,第一行是要讀取的引數檔案路徑,注意這裡必須是絕對路徑,第二行是要讀取的檔案列,從第0列開始,即視覺可見的檔案的第一列,0即檔案中第一列,所以要讀取檔案中的第二列是需要設定為1
請求中使用此函式
  • __StringFromFile( , , , ):從檔案讀取內容,開啟函式助手對話方塊如圖,有四個引數,第一個是引數檔案路徑,注意也是絕對路徑;第二個引數是此函式讀取的值所儲存的變數,可以用在後續腳本里比如${Svalue};第三個和第四個引數分別是檔案開始和結束的序列號(用在從多個檔案讀取引數值的時候),只有第一個引數是必填,其他根據情況選填。
                讀取多個檔案的用法為${__StringFromFile(D:\performancetest\jmeter\script\user#.dat,Svalue,1,3)} ,其中檔案路徑引數中的#號代表後面兩個引數從1到3的取值,所以讀取的檔案就是user1.dat、user2.dat、user3.dat,讀取規則為按照次序先讀完第一個檔案的所有行,如果已經滿足執行緒需要,則之後的檔案就不會讀取,如果第一個檔案的行數不能滿足執行緒需要,則讀取第二個檔案,以此類推;如果所有檔案的行數都不能滿足執行緒需要,那麼指令碼會繼續執行,但是很多執行緒都沒有取到值,不會迴圈讀取。                 多次迴圈讀取一個檔案時${__StringFromFile(D:\performancetest\jmeter\script\user.dat,Svalue,,)} ,後面兩個引數都為空就可以。                 指定迴圈次數讀取一個檔案時,${__StringFromFile(D:\performancetest\jmeter\script\user.dat,Svalue,,2)},通過最後一個引數進行設定就行,設定為2就是引數檔案所有行被讀取完畢後 依然沒能滿足執行緒需要會繼續從檔案第一行再次迴圈讀取。                 此函式沒有提供按列讀取的引數,所以使用這個函式的時候的引數檔案只能讀取一列
在請求中使用: 在響應斷言中使用函式讀取的值所儲存的變數Svalue: 3. 從資料庫中取值作為引數化 在測試計劃中加入資料庫配置及請求,在請求下新增後置處理器-->正則表示式提取器,jdbc請求 正則表示式提取器的設定:引用名稱即為後續需要用到變數名,正則表示式必須包含在()裡,我這裡使用者都是字母和數字的組合,所以使用([0-9a-z]+),可以根據自己的實際情況進行,預設值是如果沒有匹配到任何內容就使用預設值作為username的值 登陸請求中使用在資料庫中查詢到的使用者名稱進行登陸 響應斷言中使用資料庫中查詢到的使用者名稱作為登陸成功後的驗證點