Jmeter 參數化方式、提取上個接口的參數、函數助手常用的函數(用戶定義的變量、CSV數據文件設置、用戶參數、JSON提取器、正則表達式提取器)


一、在測試過程中一般的幾種參數化方式

1、用戶定義的變量

  當我們每次去調用接口都要手動修改手機號碼,並且注冊和登錄接口都要同步修改,這樣操作相當繁瑣,針對這個問題我們使用用戶定義的變量的工具進行優化

  添加:在線程組上:右鍵—>添加—>配置元件—>用戶定義的變量

    • 用戶自定義變量是固定的,與下面的“用戶參數”有點不同(比如:${__Random(1000,9999,)},多個虛擬用戶請求時,生成的四位數都是固定同一個)

  

   我們把注冊和登錄的手機號和密碼都提取出來放到這里

  

   定義了之后,我們需要調用該參數,調用方式是在對應的取樣器里,使用${key}的格式替換取樣器請求體里的值,這樣我們就可以每次只修改一次就可以在所有的接口上通用了

  

  雖然在此基礎上已經得到了相應的優化,我們能不能做到每次運行的時候都不用去修改用戶定義的變量里面的值呢?答案是可以的,這時候我們要使用到函數助手,構造相應的隨機函數

  

   對於函數的各種用法,這里不做說明,可以通過函數助手的幫助去查看各個函數的使用方法

  

  我們通過函數助手來構造一個生成隨機手機號的方法來替換用戶定義的變量的值

  

2、CSV數據文件設置

  該方法也是參數化的一種場景,我們可以提前使用csv文件或者其它文本文件(txt、log、xml、json...)構造大量數據,然后再讀取文件里面的內容引用到對應的接口當中去,這里要注意的是在國內csv我們使用excel編輯器保存后遇到中文會出現亂碼的情況,因此需要進行轉碼后才能正常使用!

  在線程組上:右鍵—>添加—>配置元件—>CSV 數據文件設置

  

   我們先構造測試數據

  

   然后配置CSV數據文件設置:

  

   此時我們可以直接替換接口參數的值為該變量名稱,但是不可以替換用戶定義的變量的值,會引用不到

  

  執行結果如下:

  

  我們如果設置並發量為5,則會依次讀取每一行數據

  

   

3、用戶參數

  在用戶定義的變量中使用隨機生成手機號的方式執行,它的執行原理是在整個線程組執行會話之前創建一次后,執行過程中的所有線程都會去使用這個值,並不是每個線程組使用時都會隨機生成不一樣的值,所以在並發測試中,遇到這種情況就不行了,因此我們可以用戶參數的工具來使得每個線程組調用的時候都能隨機生成一個隨機數

  • 用戶參數是隨機生成的,於上面的 “用戶自定義變量” 有點不同(比如:${__Random(1000,9999,)},多個虛擬用戶請求時,生成的四位數都是隨機生成的)
  • 使用 ${名稱} 進行調用參數

  在線程組上:右鍵—>添加—>前置處理器—>用戶參數

  

   我們可以將上面用戶定義的變量中由函數助手生成的函數拿到用即可

  

   我們將接口參數化替換

  

  設置並發為10,查看結果:

  

   

二、正則提取

  上面我們處理的是隨機數,這里我們則要通過一些方法將下個接口要使用的參數用上個接口的請求體、響應頭或者響應體中提取出來,以此來處理接口依賴的問題,因為暫時沒有好的實例,這里只講使用方法

1.JSON提取器

  • json 格式參數
    • 格式:{"key":"vale":"名稱":"值"}  
    • value值為string  要用雙引號""  
    • value值為int   不要雙引號""  
    • value值為 double   不要雙引號""  
  • 多個key-value 對,使用用逗號分開
  • 最后一個key-value 對后面沒有逗號

在指定的接口取樣器上:右鍵—添加—后置處理器—JSON提取器

  

我們在查看結果樹里面將JSON Path Tester調出來,可以進行編寫表達式進行測試驗證表達式是否正確,注意該提取器只適用於接口的json響應體

  

JSON提取器的表達式語法格式為:$.key的格式

  

如果響應體遇到嵌套列表的形式,如:

{"domain": 
    [
     {"id": "sdfhhsdfafvgg"}, 
     {"name": "Tom"}
    ]
}

如果要提取name的值,表達式為:$.domain[1].name

復制代碼
復制代碼
{
    "tenant": "admin",
    "domain": [
         {"id": "sdfhhsdfafvgg", "name": "Tom"},
         {"id": "234gdgdh45h", "name": "Jerry"}
         ]
    }    
復制代碼
復制代碼

如果要提取所有name的值,表達式為:$..name  返回結果為一個列表

我們將正確的表達式填入到JSON提取器的配置當中,后面的接口就可以通過${變量名稱}的方式調用該參數

  

  

2.正則表達式提取器

  在指定的接口取樣器上:右鍵—添加—后置處理器—正則表達式提取器

  

  正則表達式的格式:左邊界(.*?)右邊界  以code為例:

  

  • 0:隨機
  • -1:匹配所有

  我們執行一次查看提取結果:

  

正則表達式提取器 》頁面

Apply to 應用范圍

    • Main sample and sub-samples
      • 當前請求的結果和當前請求的子請求的結果,兩方面去匹配
    • Main sample only
      • 當前的請求
    • Sub-samples only
    • JMeter Variable
      • jmeter 二次提取

引用名稱

    • 其他地方引用時的變量名稱,我這里寫的phone,可自定義設置,引用方法:${引用名稱}

正則表達式

    • 數據提取器,()括號里為你要獲取的的值。"mobilephone":"( 相當於LR左邊界, )","leaveamount"相當於LR右邊界。而括號里\d+為正則表達式,用來匹配所需要獲取的數據,何謂正則表達式文章末尾會附上說明

模板

    • $$對應正則表達式提取器類型。-1全部,0 隨機,1第一個2第二個,以此類推,若只有一個正則一般就填寫$1$

匹配數字

    • 正則表達式匹配數據的所有結果可以看做一個數組,匹配數字即可看做是數組的第幾個元素。-1表示全部,0隨機,1第一個,2第二個,以此類推。若只要獲取到匹配的第一個值,則填寫1

缺省值

    • 匹配失敗時的默認值。可以不寫。若需用於后續邏輯判斷,可簡單寫為 ERROR。

常用正則表達式:

  • ():表達式的開始結束
  • .*:匹配 0次或者 多次的任何字符
  • \d+:匹配多個數字字符串,和 [0-9]+ 語法一樣
  • \w+:英文字母或 數字 的字符串,和 [a-zA-Z0-9]+ 語法一樣
  • 用 $$ 引用起來,只想用第一個用 $1$ ,如果在正則表達式中有多個正則表達式,則可以是 $2$ $3$ 等等;

    

更多關於正則表達式的語句請跳轉到此博客地址:https://www.cnblogs.com/shouhu/p/12165289.html

三、函數助手常用的函數

  •   位置打開:Tools  >  函數助手
  •   常用函數random.、time.、v函數

__Random:隨機動態生成數(譯:瑞德姆)

  設置最小值,最大值 > 生成  >  復制后添加到用戶定義的變量或者用戶參數中

  

__time:當前時間函數

  • 如果參數需要為當前日期,那公式為: ${__ time(yyy-MM-dd,)} 或者${__ time(YMDHMS.,)}
  • ${__ time/yyyy-MM-dd HH:mm:ss:SSS,time)} :格式化生成時間格式2018-06-01 11:08:23:635
  • ${__ _time()}: 默認該公式精確到毫秒級別,13位數 1527822855323
  • ${__ _time(1000.)}: 該公式精確到秒級別,10位數 1527822871

三種時間格式:

  • YMD = yyyyMMdd
  • HMS = HHmmss
  • YMDHMS = yyyyMMdd-HHmmss
    • 時間格式:yyyy-MM-dd HH:mm:ss.SSS >> 生成格式:2019-10-22 21:51:17.456 

  1、默認生產為時間戳

  

   2、添加時間格式:yyyy-MM-dd HH-mm-ss

  

  以上可以作為開始時間,那么結束時間呢?

  怎么在開始時間上增加 2天 == 時間位移函數:__timeShift

__timeShift():時間位移函數

  格式:yyyy-MM-dd HH-mm-ss

  -P5D5:負號后面都進行減時間

  PT5h5m5s.89s:只轉換時間,日期不變

  

 

   

  

 

 

--dataTimeConvert:時間戳轉換為時間

     

 

   

 

   

 

  

 

 

 

 

 

__V:嵌套函數

  已經定義了一個變量A要再在這個變量名后面加一個變量(如遞增數字)N不能直接用${A${N}},必須用嵌套函數

    • __ V: ${_ _V(A,${N}}腳本調優

__setProperty():設置jmeter 屬性 

  

__P:獲取屬性-----獲取   __setProperty()函數的屬性值

跨線程組的時候可以用

  

MD5:密碼加密

  

可以查看函數助手的幫助文檔,建議用谷歌瀏覽器

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM