轉載至:https://mp.weixin.qq.com/s/XcOEU3BsShTro9eRgsQEsA
01概述
為什么需要做二次開發?JMeter作為一款開源的性能、接口測試工具,有時候無法滿足我們工作的需要,一般體現在:協議不支持、沒有相應數據處理功能等。
一般這種情況下,我們可以做的選擇有:
-
第一種找插件
-
第二種自定義實現
JMeter二次開發一般又分為三類情況:
-
自定義組件、依托於JMeter的core的jar實現。一般來說,代碼量較大
-
依托於java請求實現自定義協議的擴展。推薦方式
-
自定義函數來實現特定的一些數據處理的功能。(和服務器沒有交互),比如加密、簽名的生成、編碼處理,解密等等。
02基於java請求的二次開發
首先,我們依賴的jar包分為兩種:
-
JMeter框架層面的:實現的是性能層面的統計相關工作。需要的jar包有ApacheJMeter_core.jar,是JMeter的核心jar包 ,所有基於JMeter的二次開發基本上都需要用到該jar包。
基於jave請求所以還需要ApacheJMeter_java.jar -
擴展的協議本身所需要的:取決於協議本身
接下來打開eclipes,導入需要的jar包,自定義的java請求要繼承Jmeter所提供的.AbstractJavaSamplerClient類。可以看到這里需要重寫的方法是runTest方法。
我們先寫一個簡單的例子,認識一下常見的方法:
將該項目導成jar包,放到JMeter lib目錄下,ext文件中
如何設置傳入參數?
重寫getDefaultParameters()方法,在runtest方法中,使用arg0. getParameter(“參數名”)調用
代碼:
效果:
到這里的話,我們就把JMeter層面的東西搞定了,那么我們怎么讓他實現我們想要的功能?
這個時候就要用到擴展協議所需要的jar包了,我們把這個jar也導入到eclipse中,在runTest方法中調用,設置其返回結果,這樣就可以在這里面應用了,因本人實力有限,這個地方舉一個簡單的例子。假設我們的業務(和服務器交互)是一個計算器,代碼如下:
在JMeter框架中我們實現的操作就是設置傳入的參數,一般和業務有關,方法就用getDefaultParameters:
其次是runTest方法,我們要做的第一步就是獲取傳到的參數,使用arg0. getIntParamete方法,實例化業務對象,實例化SampleResult對象,開始計時,業務處理,設置結果,設置狀態,結束計時,返回SampleResult對象即可。
有需要時,可在語句中使用try catch拋出異常,對異常狀態進行處理
最后導出jar包即可,運行效果:
這里需要注意的是業務類:
業務類所依賴的類都必須以jar包的形式存在於Jmeter的lib目錄下,以及業務類所以依賴的類,有可能在Jmeter的lib目錄中本身就存在。有可能會版本不一致,此時需要進行評估,一般保留高版本(前提是能夠兼容低版本才行)。否則就可能需要進行代碼層面的變更,使用統一的版本來實現。
03JMeter自定義函數
在使用JMeter的過程中,我們經常會需要進行各種各樣的數據處理,比如說編碼、解碼、加密、解密、特定的值生成,如果JMeter本身沒有提供,我們則可以通過自定義函數的方式,實現擴展。
我們依賴的jar包有哪些呢?
首先JMeter層面,依賴的jar包主要有兩個ApacheJMeter_core.jar以及ApacheJMeter_functions.jar兩個包,功能本身所依賴的包就是功能實現的jar包,功能本身是脫離JMeter存在的。
首先我們還是導入JMeter的jar包,創建javaproject項目,創建包,注意package中必須包含關鍵字functions,創建類,繼承自AbstractFunction。
這里需要重寫的方法有四個:
該方法就是返回Hello World,如果在使用時,在execute中調用功能包並返回結果,我們看一下怎么傳遞參數
導出jar包做法和基於java請求一樣,測試結果如下:
我們會發現一個問題,就是當使用參數調用函數不能被調用,如圖,那么要怎么處理呢?
函數的入參本身是Jmeter的一個參數(類似於${xxx}),則需要進行二次轉化,操作方法如下:
導出jra包,運行腳本結果為:
這里就不在說如何調用功能jar包,處理方法和基於java請求二次開發一樣,在execute方法中進行調用,返回結果即可,這里也要把功能的jar包也要放到lib目錄下。
小技巧:
小技巧:
-
如果希望將依賴包放在lib以外的目錄,則建議修改Jmeter的配置文件jmeter.properties. 中 user.classpath
-
自定義函數,其package中必須包含關鍵字functions具體以Jmeter.properties文件中的配置項為准。
classfinder.functions.contain=.functions