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