周燕 肖玉 王智超



摘? 要: 許多應用系統功能日益復雜,JMeter已有的功能組件時常無法滿足測試需求。文章根據JMeter的開源特性,對其進行二次開發,通過自定義函數擴展其已有功能;詳細介紹JMeter自定義函數開發的原理和流程并給出關鍵代碼的實現過程;結合WebTours系統,將完成的自定義函數應用于具體的測試場景。幫助測試人員快速掌握自定義函數的實現與應用,實現定制化的功能,以滿足個性化的測試需求。
關鍵詞: JMeter; 開源; 自定義函數; 二次開發
中圖分類號:TP31? ? ? ? ? 文獻標識碼:A? ? ?文章編號:1006-8228(2023)02-135-04
Abstract: Many application systems have increasingly complex functions, and JMeter's existing functional components often fail to meet the test requirements. In this paper, based on the open source characteristics of JMeter, we perform secondary development and extend its existing functions through custom functions. The principle and flow of JMeter custom function development are introduced in detail, and the realization process of key code is given. Combined with the WebTours system, the completed custom functions are applied to specific test scenarios. It helps testers to quickly master the implementation and application of custom functions, realize customized functions, and meet personalized test requirements.
Key words: JMeter; open source; custom functions; secondary development
0 引言
JMeter是Apache基金會旗下一款優秀的性能測試和接口測試工具,已經被越來越多的公司所采用。與同類的性能測試工具LoadRunner、接口測試工Postman相比,其優點是100%純Java[1]開發且開源、有較強的擴展性。它擁有豐富的插件、元件和函數等功能來滿足各種測試需求。但隨著應用系統業務邏輯復雜性的大幅提升,系統的功能也日益個性化,測試工作的難度陡增。JMeter已有功能更多的是針對一些通用性的功能而開發,很難滿足這種個性化的需求。得益于其開源特性,JMeter擁有其他測試工具所沒有的可靈活擴展性,用戶可根據實際功能需求和測試場景,對JMeter做二次開發[2],實現個性化的測試需求。JMeter二次開發一般分為三類情況:自定義組件、自定義請求和自定義函數。在JMeter中通過函數可以靈活的獲取動態變化的值,代替錄制腳本時所設置的固定值,對腳本進行參數化,使整個測試過程更加貼近實際的應用場景。
1 JMeter函數介紹
在性能和接口測試過程中,通常需要將用戶輸入的數據提交給服務器進行處理,例如測試登入功能需要用戶輸入用戶名和密碼。但是每個用戶登入的用戶名和密碼都不一樣,測試時為了模擬真實的用戶場景,就需要讓用戶輸入的內容每次都發生變化,這個過程叫做參數化。
JMeter中的配置元件與前置處理器[3]都可以實現參數化,但使用起來較復雜且不夠靈活,為了能夠更好的幫助用戶進行參數化,JMeter提供了一組庫函數來幫助用戶生成需要的數據。在JMeter菜單選項中的函數助手對話框中,可以看到JMeter自帶了許多的庫函數[4],如常用的RandomString、counter等,如圖1。每個函數主要分為上下兩部分,上半部分是函數參數,所有參數以表格的形式進行展示,左邊為參數的描述,方便用戶理解參數的含義,右邊則可由用戶來輸入該參數相應的值;下半部分是函數的結果,當用戶點擊“生成”按鈕后下方會展示根據用戶輸入的參數,該函數所返回的結果。同時JMeter會根據函數名和用戶選擇的參數,自動生成函數的調用字符串例如:${__RandomString(3,abc123dw,str)},并自動做了復制功能,用戶可以直接拷貝到需要調用的地方。
不同接口測試、性能測試項目或場景中,有不同的特性,已有的這些函數只能滿足80%的業務需要。例如函數庫中RandomString函數,可以生成指定長度的隨機字符串,但在實際測試業務中,需要的字符串可能還要求有固定的前綴,那么已有庫函數就無法滿足測試需求,而自定義函數剛好可以解決此問題。
2 開發自定義函數
JMeter不僅是一個測試工具,而且還是一個優秀的框架,其提供了豐富的jar包方便用戶進行二次開發,下面將在庫函數RandomString的基礎上進行優化擴展,開發一個自定義函數PrefixRandomString——帶前綴的隨機字符串,以此為例介紹自定義函數開發的原理和整個流程。
2.1 選擇開發工具
JMeter是使用Java開發的,進行二次開發時需要使用支持Java的開發工具,比如Eclipse、IntelliJ IDEA等來編寫自定義函數。下文中使用開源軟件Eclipse進行開發,先在eclipse中選擇菜單File->New->Java Project創建一個普通的Java項目即可。
2.2 添加依賴的jar包
JMeter安裝目錄lib/ext中的ApacheJMeter_core.jar包,是JMeter中的核心jar包,該jar包中實現了對JMeter進行二次開發的一些基本框架和功能。在進行開發時,要依賴該jar包,需要提前導入Java項目的referenced libraries中。
2.3 類的設計與實現
自定義函數的所有功能都封裝在Java類中,其代碼需要符合JMeter的編碼規范——擴展函數的Java類,其包名必須是.function,JMeter通過類的命名規則確保當其以非GUI模式運行時一些核心的類也能夠被正常加載。自定義函數類所在的包名可以參考JMeter自帶庫函數類所在包的名稱org.apache.jmeter.functions來進行命名;同時該類還要繼承ApacheJMeter_core.jar包中的AbstractFunction 類,并重寫父類中的四個方法。
⑴ getReferenceKey方法:該方法返回自定義函數的名稱。每個函數都有一個獨一無二的名稱,所以必須重寫這個方法。函數的名稱反映了其功能,要做到顧名思義,方便用戶使用。根據JMeter的規范,函數名稱一般以雙下劃線開頭,如__RandomString、__Time等,而且建議與類名同名。參考代碼如下:
@Override
public String getReferenceKey() {
return "__PrefixRandomString";
}
⑵ getArgumentDesc方法:該方法描述了函數的參數。如果自定義函數沒有參數,則可以不用重寫這個方法;如果有參數,為了便于函數調用者輸入參數,需要在這里返回函數參數說明。函數的參數一般情況下固定不變,常將其參數描述存放在全局靜態變量list中,而在函數體中直接將這個list返回,參考代碼如下:
private static final List
static {
args.add("指定前綴(必填)");
args.add("隨機字符串的長度(必填,不包括前綴)");
args.add("組成字符串的字符(可選)");
args.add("存儲結果的變量名(可選)");
}
@Override
public List
return args;
}
⑶ setParameters方法:該方法傳遞用戶調用過程中傳入的實際參數值。對于有參數的函數,可以在該方法中獲取用戶調用函數時傳遞過來的參數,并對參數的個數、類型等進行有效性校驗,保證函數的健壯性和正確性。參考代碼如下:
public void setParameters(Collection
arg0) throws InvalidVariableException {
//檢查參數是否為2到4個
checkParameterCount(arg0, 2, 4);
Object data[]=arg0.toArray();
//獲取前綴
prefix=((CompoundVariable) data[0]).execute();
//獲取長度
length=Integer.parseInt(((CompoundVariable) data[1])
.execute());
//如果指定了組成字符串的字符,則獲取使用的字符串
if (data.length>2) {
charsToUse=((CompoundVariable) data[2])
.execute().trim();
}
//如果輸入了存儲結果的變量名,則獲取變量名
if (data.length>3) {
varName=((CompoundVariable) data[3])
.execute().trim();
}
}
⑷ Execute方法:該方法是自定義函數中最關鍵的部分。根據業務規則,實現自定義函數的核心邏輯,將最終生成的結果返回,參考代碼如下:
@Override
public String execute(SampleResult arg0, Sampler
arg1) throws InvalidVariableException {
//最后的結果由用戶輸入的前綴+隨機生成的字符串組成
String myValue=prefix;
if (StringUtils.isEmpty(charsToUse))
myValue+=RandomStringUtils.random(length);
else {
myValue+=RandomStringUtils.random
(length, charsToUse);
}
//如果輸入了存儲結果的變量名,將結果保存到變量中
if (varName.length()>0) {
JMeterVariables vars=getVariables();
if (vars!=null) {
vars.put(varName, myValue);
}
}
returnmyValue;
}
2.4 單元測試
完成自定義函數的開發后,還需要測試函數功能是否正常。一般使用了java語言自帶的單元測試框架Junit[6]進行測試,開發工具Eclipse中已經集成了JUnit作為單元測試的工具。
2.5 使用自定義函數
代碼調試無誤后,在開發工具Eclipse中右鍵單擊項目名稱,選擇菜單Export->JAR file將整個項目打包導出為jar包,拷貝至jmeter安裝目錄lib/ext的文件夾下。JMeter啟動時會自動加載該目錄下符合要求的jar包。
重啟JMeter,打開函數助手對話框,在下拉列表中就能看到所開發的自定義函數,用戶像使用普通的庫函數一樣使用它即可,如圖2所示。
通過函數助手界面可以發現,getReferenceKey方法中所返回的函數名對應著界面下拉列表中的名稱;getArgumentDesc方法中返回的函數參數說明對應界面中函數參數表格的部分,可以在表格中輸入具體的參數值;而界面上顯示的結果則是Execute方法的返回值。下面將在WebTours系統使用該函數測試系統的登入功能。
3 WebTours系統案例分析
WebTours系統是LoadRunner自帶的測試系統,可以進行簡單的航班查詢、飛機訂票、取消航班、登入、退出、注冊等操作。首先安strawberry-perl-5.10.1.0, 接下來打開WebTours文件夾,雙擊 StartServer.bat,開啟服務器,然后在瀏覽器中輸入http://127.0.0.1:1080/WebTours/即可訪問系統[5]。在進行訂票操作之前,需要先在注冊頁面,輸入用戶名、密碼以及確認密碼完成注冊。
現使用JMeter對注冊功能進行并發測試,其測試場景為:批量注冊100個用戶,用戶名的命名是以user開頭且長度為6位的隨機字符串組成。線程數為5,循環20次。具體實現步驟如下:
⑴ 使用JMeter錄制登入腳本,通過分析post請求cgi-bin/login.pl的參數可知,username就是注冊時用戶輸入的用戶名。
⑵ 測試要求用戶名以user開頭,使用前面實現的自定義函數PrefixRandomString生成帶前綴的隨機字符串,作為參數替換錄制時的用戶名,如圖3所示。
⑶ 修改線程組的場景,設置線程數5個,循環次數20次,自動完成100次注冊操作。每次進行注冊請求時JMeter都會調用函數PrefixRandomString生成隨機的字符串作為用戶名。
⑷ 執行JMeter的腳本后,在WebTours安裝目錄WebTours\cgi-bin\users中,可以看到注冊成功的用戶名,全部以user作為前綴,如圖4所示。
4 結束語
自定義函數開發,是軟件測試人員對JMeter基礎操作熟悉的前提下所做的高級操作,也是測試復雜系統時所必備的技能。本文考慮實際應用場景,結合WebTours系統,詳細介紹了JMeter自定義函數開發的整個流程以及實際應用。有助于軟件測試人員快速的進行自定義函數的開發,完成個性化的測試任務。JMeter作為一款開源的測試工具,為用戶提供了更多的靈活性,在實際應用中還可以自定義組件和自定義請求,使JMeter能更好的滿足測試要求。
參考文獻(References):
[1] 明日科技.Java從入門到精通(第6版)[M].北京:清華大學出版社,2021
[2] 胡通.大話性能測試JMeter實戰[M].北京:人民郵電出版社,2021
[3] 陳志勇,馬利偉,萬龍.全棧性能測試修煉寶典JMeter實戰[M].北京:人民郵電出版社,2016
[4] 巴約·艾林勒著,黃鵬譯.JMeter性能測試實戰(第2版)[M].北京:人民郵電出版社,2020
[5] 張億軍.JMeter測試應用研究[J].信息技術與信息化,2021(10):61-64
[6] 賈美麗,康珺.JUnit在單元測試中的應用[J].計算機與現代化,2013(8):116-118
作者簡介:周燕(1985-),女,湖北荊州人,碩士,助教,主要研究方向:軟件開發、軟件測試。