溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Jmeter如何實(shí)現(xiàn)參數(shù)名稱和個(gè)數(shù)動(dòng)態(tài)變化的接口請求

發(fā)布時(shí)間:2020-07-02 16:29:53 來源:網(wǎng)絡(luò) 閱讀:1489 作者:809316839 欄目:軟件技術(shù)
  • 需求分析
    在做接口自動(dòng)化和性能測試,經(jīng)常會(huì)遇到一些請求參數(shù)是根據(jù)上一個(gè)請求結(jié)果,動(dòng)態(tài)變化的參數(shù)個(gè)數(shù),參數(shù)名可能相同,也可能為序列遞增格式,參數(shù)個(gè)數(shù)可能為10、20個(gè),這樣就導(dǎo)致手工不好模擬該請求效果,需要進(jìn)行封裝自定義函數(shù)才能實(shí)現(xiàn)該效果

??Jmeter是一款開源的性能測試工具,目前是行業(yè)內(nèi)使用率最高的性能測試工具之一,Jmeter是使用JAVA語言開發(fā)的,本文介紹如何使用JAVA語言開發(fā)自己需要的擴(kuò)展函數(shù)

  • 目前業(yè)界流行的兩種開發(fā)模式,本文介紹第二種
    1、使用Jmeter二次開源環(huán)境,直接在org.apache.jmeter.functions包下面開發(fā)自己需要的函數(shù),然后導(dǎo)出該jar包,替換Jmeter目錄的ApacheJMeter_functions.jar文件
    2、直接在Maven 項(xiàng)目下開發(fā)自定義函數(shù),然后打包,該方法、簡單、高效

  • 開發(fā)思路
    1、使用Eclipse創(chuàng)建Maven 項(xiàng)目,配置Pom文件,引入擴(kuò)展function所需的依賴包;
    2、創(chuàng)建類,然后繼承AbstractFunction,實(shí)現(xiàn)四個(gè)主方法;
    3、對編寫好的項(xiàng)目進(jìn)行編譯、打包
    4、把打包好的函數(shù)放到j(luò)meter擴(kuò)展目錄,調(diào)用自定義函數(shù),檢查是否正確;
JDK環(huán)境 Jmeter依賴包版本 Maven倉庫版本
1.8 4.0 3.5.3

一、新建Maven項(xiàng)目

1.File》New》Project,選擇Maven》Maven Project,一直點(diǎn)擊Next,此處Package包名一定要以.functions格式結(jié)束,否則開發(fā)出來的函數(shù),Jmeter讀取不到
Jmeter如何實(shí)現(xiàn)參數(shù)名稱和個(gè)數(shù)動(dòng)態(tài)變化的接口請求
Jmeter如何實(shí)現(xiàn)參數(shù)名稱和個(gè)數(shù)動(dòng)態(tài)變化的接口請求
2.配置Pom文件,Pom文件配置的Jmeter4.0版本,只要保存了Pom文件,系統(tǒng)就會(huì)自動(dòng)下載和關(guān)聯(lián)相應(yīng)的jar包,Pom配置文件如下:
Jmeter如何實(shí)現(xiàn)參數(shù)名稱和個(gè)數(shù)動(dòng)態(tài)變化的接口請求
3.保存Pom文件之后,系統(tǒng)會(huì)自動(dòng)下載關(guān)聯(lián)的依賴文件,如下圖:
Jmeter如何實(shí)現(xiàn)參數(shù)名稱和個(gè)數(shù)動(dòng)態(tài)變化的接口請求
Jmeter如何實(shí)現(xiàn)參數(shù)名稱和個(gè)數(shù)動(dòng)態(tài)變化的接口請求
4.此時(shí),由于對pom文件進(jìn)行了修改,項(xiàng)目頂層會(huì)出現(xiàn)一把×,并且編譯可能就會(huì)報(bào)錯(cuò),需要執(zhí)行Maven》Update Project更新外部依賴的Jar包

  • 更新前:
    Jmeter如何實(shí)現(xiàn)參數(shù)名稱和個(gè)數(shù)動(dòng)態(tài)變化的接口請求
    Jmeter如何實(shí)現(xiàn)參數(shù)名稱和個(gè)數(shù)動(dòng)態(tài)變化的接口請求
  • 更新后,編譯、打包正常:
    Jmeter如何實(shí)現(xiàn)參數(shù)名稱和個(gè)數(shù)動(dòng)態(tài)變化的接口請求
    二、編寫自定義函數(shù)代碼
  • 要實(shí)現(xiàn)擴(kuò)展Jmeter function,主要有兩點(diǎn)
    1.1. 實(shí)現(xiàn)function的類的package聲明必須包含".functions"

    JMeter設(shè)計(jì)讓一些核心的類可以在非UI的方式下運(yùn)行的時(shí)候能被加載進(jìn)來,這些類會(huì)被優(yōu)先加載。加載這些類的時(shí)候是通過命名規(guī)則來實(shí)現(xiàn)的。所有實(shí)現(xiàn)function的類必需包含".functions",所以我們自定義實(shí)現(xiàn)的類里必須包含".functions",比如如下申明的包名為:"jmeter.test.functions"

Jmeter如何實(shí)現(xiàn)參數(shù)名稱和個(gè)數(shù)動(dòng)態(tài)變化的接口請求
1.2. 首先在Jmeter.test.functions包下創(chuàng)建一個(gè)類,類名稱為Save_Body_Data,需要繼承AbstractFunction類,然后實(shí)現(xiàn)父類的四個(gè)方法

      private static final List<String> desc = new LinkedList<String>();  /*該變量用來獲取對參數(shù)值輸入進(jìn)行描述*/

      private static final String KEY = "__Media_Save_Body_Data";  /*這個(gè)是在函數(shù)助手上顯示的函數(shù)名稱*/

      static {
          desc.add("請輸入第一個(gè)參數(shù),類似variable=value,其中變量值可以寫成變量格式,格式為${value},如果有多個(gè)參數(shù),只需要用&連接"
                + "類似variable=value&variable1=value1,第一個(gè)參數(shù)也可以置空,然后在Body data中填寫也行");  
          desc.add("請輸入第二個(gè)參數(shù),該參數(shù)為變化的序列id,需要和jmeter中獲取的變量名保持一致");  
          desc.add("請輸入第三個(gè)參數(shù),該參數(shù)為申明重復(fù)參遞增參數(shù)名是否一樣,填否則序列遞增,如id[0]、id[1],不填則默認(rèn)相同"); 
          desc.add("請輸入第四個(gè)參數(shù),該參數(shù)值是用來在jmeter的Body_Data用來調(diào)用的,可以根據(jù)需要自定義,不填則默認(rèn)為第二個(gè)參數(shù)名"); 
          desc.add("請輸入第五個(gè)參數(shù),該參數(shù)為序列的連接字符比如%、&,不填則默認(rèn)為&");
          /*該描述是針對函數(shù)的輸入值進(jìn)行描述*/
      }
  • 這里主要是定義變量desc、KEY 然后將描述顯示到函數(shù)的參數(shù)描述中,如下圖
    Jmeter如何實(shí)現(xiàn)參數(shù)名稱和個(gè)數(shù)動(dòng)態(tài)變化的接口請求

  • setParameters函數(shù)作用就是獲取函數(shù)輸入框界面輸入的值,將輸入的值傳遞給execute

    public void setParameters(Collection<CompoundVariable> parameters) throws InvalidVariableException {
          /*該函數(shù)用來獲取輸入的值*/
          /*這里,后面的1,2分別指接受的最小參數(shù)個(gè)數(shù)為1,以及接受的最大參數(shù)個(gè)數(shù)為5*/
          checkParameterCount(parameters,1,5);
          values = parameters.toArray();
          /*將值存入類變量中,把接受到的參數(shù)裝成array,然后用value[i]取出來 */
    }
    • getReferenceKey函數(shù)是提供一個(gè)在Jmeter函數(shù)助手顯示的函數(shù)名稱
    public String getReferenceKey() {
          /*本方法是提供一個(gè)在Jmeter函數(shù)助手顯示的函數(shù)名稱*/
        return KEY;
    }
  • getArgumentDesc函數(shù)用來獲取對輸入?yún)?shù)的描述

    public List<String> getArgumentDesc() {
          /*該函數(shù)用來獲取對輸入?yún)?shù)的描述*/
        return desc;
    }
  • execute函數(shù)用來實(shí)現(xiàn)獲取輸入的參數(shù),然后通過對參數(shù)做需要的處理,該函數(shù)是開發(fā)中最重要的模塊,并且進(jìn)行最后執(zhí)行,本次案例中主要實(shí)現(xiàn)的功能就是獲取上一個(gè)接口返回的變量個(gè)數(shù),然后對獲取的變量名和參數(shù)值進(jìn)行封裝,最后通過字符連接成我們需要的效果

Jmeter如何實(shí)現(xiàn)參數(shù)名稱和個(gè)數(shù)動(dòng)態(tài)變化的接口請求

三、編譯、打包

  1. 編寫代碼完成,就可以進(jìn)行編譯、打包操作了,右鍵點(diǎn)擊項(xiàng)目》Run As》Maven build
    Jmeter如何實(shí)現(xiàn)參數(shù)名稱和個(gè)數(shù)動(dòng)態(tài)變化的接口請求
  2. 在Goals中輸入package,然后點(diǎn)擊Apply》Run執(zhí)行編譯,打包操作
    Jmeter如何實(shí)現(xiàn)參數(shù)名稱和個(gè)數(shù)動(dòng)態(tài)變化的接口請求
  3. 編譯打包完成,在target目錄會(huì)生成一個(gè)jar包,如下圖所示
    Jmeter如何實(shí)現(xiàn)參數(shù)名稱和個(gè)數(shù)動(dòng)態(tài)變化的接口請求
    Jmeter如何實(shí)現(xiàn)參數(shù)名稱和個(gè)數(shù)動(dòng)態(tài)變化的接口請求

    四、驗(yàn)證開發(fā)的函數(shù)是否正常

    1. 首先把Jmeter.test.functions函數(shù)放到j(luò)meter的\lib\ext目錄
      Jmeter如何實(shí)現(xiàn)參數(shù)名稱和個(gè)數(shù)動(dòng)態(tài)變化的接口請求
    2. 然后啟動(dòng)jmeter,進(jìn)入選項(xiàng)》函數(shù)助手對話框,選擇_Media_Save_Body_Data,輸入?yún)?shù)值,點(diǎn)擊生成按鈕(點(diǎn)了生成,系統(tǒng)就會(huì)生成一個(gè)函數(shù),然后就相當(dāng)于做了復(fù)制功能,可以拷貝到需要調(diào)用的地方)本次 只輸入第二個(gè)參數(shù)值(該值必須為上一個(gè)接口定義的變量名稱,稍后介紹如何使用該函數(shù))
      Jmeter如何實(shí)現(xiàn)參數(shù)名稱和個(gè)數(shù)動(dòng)態(tài)變化的接口請求
    3. 首先需要在上一個(gè)接口添加JSON Extractor元件,用來獲取變化的參數(shù)值,
      Jmeter如何實(shí)現(xiàn)參數(shù)名稱和個(gè)數(shù)動(dòng)態(tài)變化的接口請求
    4. 然后使用BeanShell Sampler調(diào)用生成的函數(shù),該sample執(zhí)行成功之后,就會(huì)生成我們要的字段效果
      Jmeter如何實(shí)現(xiàn)參數(shù)名稱和個(gè)數(shù)動(dòng)態(tài)變化的接口請求
    5. 手工請求參數(shù)如下
      Jmeter如何實(shí)現(xiàn)參數(shù)名稱和個(gè)數(shù)動(dòng)態(tài)變化的接口請求
    6. 通過代碼實(shí)現(xiàn)的參數(shù)只需要用參數(shù)名稱=值然后每個(gè)參數(shù)使用&連接即可
      Jmeter如何實(shí)現(xiàn)參數(shù)名稱和個(gè)數(shù)動(dòng)態(tài)變化的接口請求
    7. 執(zhí)行結(jié)果,如下:
      Jmeter如何實(shí)現(xiàn)參數(shù)名稱和個(gè)數(shù)動(dòng)態(tài)變化的接口請求
      Jmeter如何實(shí)現(xiàn)參數(shù)名稱和個(gè)數(shù)動(dòng)態(tài)變化的接口請求
      • 函數(shù)功能介紹
        1、本次開發(fā)的函數(shù)實(shí)現(xiàn)的效果為通過傳入5個(gè)參數(shù),其中只有第二個(gè)為必填項(xiàng),其它參數(shù)可以為空
        2、第一個(gè)參數(shù)可以為空,當(dāng)為空的時(shí)候,則需要把parameters中的參數(shù)和值在body data中手動(dòng)寫入,本次就是在body data中手工寫入了不會(huì)變化的參數(shù)名,你也可以直接把這些參數(shù)傳入到第一個(gè)參數(shù),格式為funid=imp_provider&destfunid=pur_apply_provider&parentId=${apply_id}
        &pagetype=import&eventcode=import&user_id=${user}&dataType=json
        3、第二個(gè)參數(shù)為獲取的變量名稱,該名稱一定要和jmeter中json path中定義的參數(shù)名一致,這樣才能獲取到j(luò)meter中變化的參數(shù)
        4、第三個(gè)參數(shù)為判斷重復(fù)變化的參數(shù)名稱的格式是一樣還是序列遞增,比如id[0],id[1],默認(rèn)不填相同,如果是序列遞增,只需要填否
        Jmeter如何實(shí)現(xiàn)參數(shù)名稱和個(gè)數(shù)動(dòng)態(tài)變化的接口請求
        5、第四個(gè)參數(shù)則是用來保存整個(gè)函數(shù)封裝的字符串,默認(rèn)不填則會(huì)把所有字符串封裝到第二個(gè)參數(shù)中,填寫了則封裝在該參數(shù)中,需要在body data中調(diào)用該變量,調(diào)用方式為${變量名}
        6、第五個(gè)參數(shù)則為各個(gè)參數(shù)的連接方式,默認(rèn)不填則為&

Jmeter.test.functions.jar下載方法見文章末尾介紹
完整源碼如下:
Jmeter如何實(shí)現(xiàn)參數(shù)名稱和個(gè)數(shù)動(dòng)態(tài)變化的接口請求


? ?如果文章對你有幫助,可以在右下角點(diǎn)擊關(guān)注功能,歡迎轉(zhuǎn)發(fā)、拍磚,本人會(huì)持續(xù)推出與測試有關(guān)的文章,與大家分享測試技術(shù),每一篇原創(chuàng)文章都是用心編寫,杜絕抄襲復(fù)制,微信公眾號與本平臺(tái)文章同步,方便大家查閱


QQ技術(shù)交流群:加群請輸入驗(yàn)證信息51CTO
??????????????Jmeter如何實(shí)現(xiàn)參數(shù)名稱和個(gè)數(shù)動(dòng)態(tài)變化的接口請求


微信二維碼關(guān)注公眾號:

????????????Jmeter如何實(shí)現(xiàn)參數(shù)名稱和個(gè)數(shù)動(dòng)態(tài)變化的接口請求


關(guān)注之后,回復(fù)資源下載,即可獲取本人共享的各種資源下載地址

Jmeter如何實(shí)現(xiàn)參數(shù)名稱和個(gè)數(shù)動(dòng)態(tài)變化的接口請求

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI