您好,登錄后才能下訂單哦!
- 需求分析
在做接口自動化和性能測試,經常會遇到一些請求參數是根據上一個請求結果,動態變化的參數個數,參數名可能相同,也可能為序列遞增格式,參數個數可能為10、20個,這樣就導致手工不好模擬該請求效果,需要進行封裝自定義函數才能實現該效果
??Jmeter是一款開源的性能測試工具,目前是行業內使用率最高的性能測試工具之一,Jmeter是使用JAVA語言開發的,本文介紹如何使用JAVA語言開發自己需要的擴展函數
- 目前業界流行的兩種開發模式,本文介紹第二種
1、使用Jmeter二次開源環境,直接在org.apache.jmeter.functions包下面開發自己需要的函數,然后導出該jar包,替換Jmeter目錄的ApacheJMeter_functions.jar文件
2、直接在Maven 項目下開發自定義函數,然后打包,該方法、簡單、高效
- 開發思路
1、使用Eclipse創建Maven 項目,配置Pom文件,引入擴展function所需的依賴包;
2、創建類,然后繼承AbstractFunction,實現四個主方法;
3、對編寫好的項目進行編譯、打包
4、把打包好的函數放到jmeter擴展目錄,調用自定義函數,檢查是否正確;
JDK環境 | Jmeter依賴包版本 | Maven倉庫版本 |
---|---|---|
1.8 | 4.0 | 3.5.3 |
一、新建Maven項目
1.File》New》Project,選擇Maven》Maven Project,一直點擊Next,此處Package包名一定要以.functions格式結束,否則開發出來的函數,Jmeter讀取不到
2.配置Pom文件,Pom文件配置的Jmeter4.0版本,只要保存了Pom文件,系統就會自動下載和關聯相應的jar包,Pom配置文件如下:
3.保存Pom文件之后,系統會自動下載關聯的依賴文件,如下圖:
4.此時,由于對pom文件進行了修改,項目頂層會出現一把×,并且編譯可能就會報錯,需要執行Maven》Update Project更新外部依賴的Jar包
JMeter設計讓一些核心的類可以在非UI的方式下運行的時候能被加載進來,這些類會被優先加載。加載這些類的時候是通過命名規則來實現的。所有實現function的類必需包含".functions",所以我們自定義實現的類里必須包含".functions",比如如下申明的包名為:"jmeter.test.functions"
1.2. 首先在Jmeter.test.functions包下創建一個類,類名稱為Save_Body_Data,需要繼承AbstractFunction類,然后實現父類的四個方法
private static final List<String> desc = new LinkedList<String>(); /*該變量用來獲取對參數值輸入進行描述*/
private static final String KEY = "__Media_Save_Body_Data"; /*這個是在函數助手上顯示的函數名稱*/
static {
desc.add("請輸入第一個參數,類似variable=value,其中變量值可以寫成變量格式,格式為${value},如果有多個參數,只需要用&連接"
+ "類似variable=value&variable1=value1,第一個參數也可以置空,然后在Body data中填寫也行");
desc.add("請輸入第二個參數,該參數為變化的序列id,需要和jmeter中獲取的變量名保持一致");
desc.add("請輸入第三個參數,該參數為申明重復參遞增參數名是否一樣,填否則序列遞增,如id[0]、id[1],不填則默認相同");
desc.add("請輸入第四個參數,該參數值是用來在jmeter的Body_Data用來調用的,可以根據需要自定義,不填則默認為第二個參數名");
desc.add("請輸入第五個參數,該參數為序列的連接字符比如%、&,不填則默認為&");
/*該描述是針對函數的輸入值進行描述*/
}
這里主要是定義變量desc、KEY 然后將描述顯示到函數的參數描述中,如下圖
setParameters函數作用就是獲取函數輸入框界面輸入的值,將輸入的值傳遞給execute
public void setParameters(Collection<CompoundVariable> parameters) throws InvalidVariableException {
/*該函數用來獲取輸入的值*/
/*這里,后面的1,2分別指接受的最小參數個數為1,以及接受的最大參數個數為5*/
checkParameterCount(parameters,1,5);
values = parameters.toArray();
/*將值存入類變量中,把接受到的參數裝成array,然后用value[i]取出來 */
}
public String getReferenceKey() {
/*本方法是提供一個在Jmeter函數助手顯示的函數名稱*/
return KEY;
}
getArgumentDesc函數用來獲取對輸入參數的描述
public List<String> getArgumentDesc() {
/*該函數用來獲取對輸入參數的描述*/
return desc;
}
三、編譯、打包
編譯打包完成,在target目錄會生成一個jar包,如下圖所示
四、驗證開發的函數是否正常
- 函數功能介紹
1、本次開發的函數實現的效果為通過傳入5個參數,其中只有第二個為必填項,其它參數可以為空
2、第一個參數可以為空,當為空的時候,則需要把parameters中的參數和值在body data中手動寫入,本次就是在body data中手工寫入了不會變化的參數名,你也可以直接把這些參數傳入到第一個參數,格式為funid=imp_provider&destfunid=pur_apply_provider&parentId=${apply_id}
&pagetype=import&eventcode=import&user_id=${user}&dataType=json
3、第二個參數為獲取的變量名稱,該名稱一定要和jmeter中json path中定義的參數名一致,這樣才能獲取到jmeter中變化的參數
4、第三個參數為判斷重復變化的參數名稱的格式是一樣還是序列遞增,比如id[0],id[1],默認不填相同,如果是序列遞增,只需要填否
5、第四個參數則是用來保存整個函數封裝的字符串,默認不填則會把所有字符串封裝到第二個參數中,填寫了則封裝在該參數中,需要在body data中調用該變量,調用方式為${變量名}
6、第五個參數則為各個參數的連接方式,默認不填則為&
Jmeter.test.functions.jar下載方法見文章末尾介紹
完整源碼如下:
? ?如果文章對你有幫助,可以在右下角點擊關注功能,歡迎轉發、拍磚,本人會持續推出與測試有關的文章,與大家分享測試技術,每一篇原創文章都是用心編寫,杜絕抄襲復制,微信公眾號與本平臺文章同步,方便大家查閱
QQ技術交流群:加群請輸入驗證信息51CTO
??????????????
微信二維碼關注公眾號:
????????????
關注之后,回復資源下載,即可獲取本人共享的各種資源下載地址
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。