測試開發(fā)必備技能: JMeter二次開發(fā)

為什么需要做二次開發(fā)?JMeter作為一款開源的性能、接口測試工具,有時候無法滿足我們工作的需要,一般體現(xiàn)在:協(xié)議不支持、沒有相應(yīng)數(shù)據(jù)處理功能等。
一般這種情況下,我們可以做的選擇有:
第一種找插件
第二種自定義實(shí)現(xiàn)
JMeter二次開發(fā)一般又分為三類情況:
自定義組件、依托于JMeter的core的jar實(shí)現(xiàn)。一般來說,代碼量較大
依托于java請求實(shí)現(xiàn)自定義協(xié)議的擴(kuò)展。推薦方式
自定義函數(shù)來實(shí)現(xiàn)特定的一些數(shù)據(jù)處理的功能。(和服務(wù)器沒有交互),比如加密、簽名的生成、編碼處理,解密等等。
首先,我們依賴的jar包分為兩種:
JMeter框架層面的:實(shí)現(xiàn)的是性能層面的統(tǒng)計(jì)相關(guān)工作。需要的jar包有ApacheJMeter_core.jar,是JMeter的核心jar包 ,所有基于JMeter的二次開發(fā)基本上都需要用到該jar包。
基于jave請求所以還需要ApacheJMeter_java.jar擴(kuò)展的協(xié)議本身所需要的:取決于協(xié)議本身
接下來打開eclipes,導(dǎo)入需要的jar包,自定義的java請求要繼承Jmeter所提供的.AbstractJavaSamplerClient類。可以看到這里需要重寫的方法是runTest方法。

我們先寫一個簡單的例子,認(rèn)識一下常見的方法:

將該項(xiàng)目導(dǎo)成jar包,放到JMeter lib目錄下,ext文件中
如何設(shè)置傳入?yún)?shù)?
重寫getDefaultParameters()方法,在runtest方法中,使用arg0. getParameter(“參數(shù)名”)調(diào)用
代碼:

效果:


到這里的話,我們就把JMeter層面的東西搞定了,那么我們怎么讓他實(shí)現(xiàn)我們想要的功能?
這個時候就要用到擴(kuò)展協(xié)議所需要的jar包了,我們把這個jar也導(dǎo)入到eclipse中,在runTest方法中調(diào)用,設(shè)置其返回結(jié)果,這樣就可以在這里面應(yīng)用了,因本人實(shí)力有限,這個地方舉一個簡單的例子。假設(shè)我們的業(yè)務(wù)(和服務(wù)器交互)是一個計(jì)算器,代碼如下:

在JMeter框架中我們實(shí)現(xiàn)的操作就是設(shè)置傳入的參數(shù),一般和業(yè)務(wù)有關(guān),方法就用getDefaultParameters:

其次是runTest方法,我們要做的第一步就是獲取傳到的參數(shù),使用arg0. getIntParamete方法,實(shí)例化業(yè)務(wù)對象,實(shí)例化SampleResult對象,開始計(jì)時,業(yè)務(wù)處理,設(shè)置結(jié)果,設(shè)置狀態(tài),結(jié)束計(jì)時,返回SampleResult對象即可。
有需要時,可在語句中使用try catch拋出異常,對異常狀態(tài)進(jìn)行處理

最后導(dǎo)出jar包即可,運(yùn)行效果:

這里需要注意的是業(yè)務(wù)類:
業(yè)務(wù)類所依賴的類都必須以jar包的形式存在于Jmeter的lib目錄下,以及業(yè)務(wù)類所以依賴的類,有可能在Jmeter的lib目錄中本身就存在。有可能會版本不一致,此時需要進(jìn)行評估,一般保留高版本(前提是能夠兼容低版本才行)。否則就可能需要進(jìn)行代碼層面的變更,使用統(tǒng)一的版本來實(shí)現(xiàn)。
在使用JMeter的過程中,我們經(jīng)常會需要進(jìn)行各種各樣的數(shù)據(jù)處理,比如說編碼、解碼、加密、解密、特定的值生成,如果JMeter本身沒有提供,我們則可以通過自定義函數(shù)的方式,實(shí)現(xiàn)擴(kuò)展。
我們依賴的jar包有哪些呢?
首先JMeter層面,依賴的jar包主要有兩個ApacheJMeter_core.jar以及ApacheJMeter_functions.jar兩個包,功能本身所依賴的包就是功能實(shí)現(xiàn)的jar包,功能本身是脫離JMeter存在的。
首先我們還是導(dǎo)入JMeter的jar包,創(chuàng)建javaproject項(xiàng)目,創(chuàng)建包,注意package中必須包含關(guān)鍵字functions,創(chuàng)建類,繼承自AbstractFunction。
這里需要重寫的方法有四個:

該方法就是返回Hello World,如果在使用時,在execute中調(diào)用功能包并返回結(jié)果,我們看一下怎么傳遞參數(shù)

導(dǎo)出jar包做法和基于java請求一樣,測試結(jié)果如下:

我們會發(fā)現(xiàn)一個問題,就是當(dāng)使用參數(shù)調(diào)用函數(shù)不能被調(diào)用,如圖,那么要怎么處理呢?

函數(shù)的入?yún)⒈旧硎荍meter的一個參數(shù)(類似于${xxx}),則需要進(jìn)行二次轉(zhuǎn)化,操作方法如下:

導(dǎo)出jra包,運(yùn)行腳本結(jié)果為:

這里就不在說如何調(diào)用功能jar包,處理方法和基于java請求二次開發(fā)一樣,在execute方法中進(jìn)行調(diào)用,返回結(jié)果即可,這里也要把功能的jar包也要放到lib目錄下。
小技巧:
如果希望將依賴包放在lib以外的目錄,則建議修改Jmeter的配置文件jmeter.properties. 中?user.classpath
自定義函數(shù),其package中必須包含關(guān)鍵字functions具體以Jmeter.properties文件中的配置項(xiàng)為準(zhǔn)。
classfinder.functions.contain=.functions
轉(zhuǎn)載自:https://guyufeiyu.blog.csdn.net/article/details/111505277
推薦閱讀:
END

長按二維碼/微信掃碼? 添加作者
閱讀原文
