本文版權歸xmeter.net 所有。歡迎轉載,轉載請注明出處讶踪。
摘要##
JMeter提供了多種方式來自定義腳本來實現JMeter不支持的功能,常見的方式有插入BeanShell腳本和通過擴展JMeter提供的Java接口泊交,本文通過實現一個簡單的功能來比較兩種不同的實現方式下對JMeter的性能影響乳讥,并對這兩種不同的實現方式的使用場景提供推薦。
測試場景##
假設測試腳本需要產生一個長度為1024的隨機字符串廓俭,字符串產生后將其賦值給一個名為“data”的變量云石,供后面的Sampler來使用,在本文中使用的是“Dummy Sampler”研乒,該Sampler能讓用戶手工輸入“Request Data”和“Response Data”汹忠,使用過程中易于調試和測試。BeanShell版的JMeter測試腳本結構如下告嘲。需要注意的是Dummy Sampler不是JMeter標準提供的Sampler错维,讀者如果有興趣,參見https://jmeter-plugins.org 安裝步驟將其安裝到你的JMeter中橄唬。
BeanShell Preprocessor中的代碼如下赋焕,生成了隨機字符串后將值賦值給變量“data”。
在Dummy Sampler里的“Response Data”輸入框中傳入變量“data”仰楚,如下圖所示隆判。
Java擴展JMeter的實現方式下,測試腳本的基本結構與上類似僧界,如下圖所示侨嘀,不一樣的地方是把“BeanShell Preprocessor”替換成了“User Parameters”。
“User Parameters”下加入一個變量捂襟,該變量的值是自定義擴展的一個函數 - “${__MyRandomFunc()}”咬腕。
該自定義函數MyRandomFunc的實現方式如下所示,具體請參見這篇文章來學習如何擴展自定義函數葬荷。
測試配置##
測試運行之前涨共,將兩個測試用例的ThreadGroup的數目設置成100,每個Thread運行100次宠漩。
測試機器是在青云上申請的標準虛機:
1)2核CPU*2GB內存
2)20GB硬盤
3)操作系統(tǒng)CentOS 7举反,64位
4)Java版本是Open JDK 8
5)JMeter版本是3.0
JMeter測試采用非UI方式運行。
測試結果##
BeanShell執(zhí)行完測試約用了1分18秒左右扒吁,控制臺打印出的測試結果如下火鼻。JMeter進程CPU使用率為137%,內存使用率為14%.
summary + 2802 in 00:00:23 = 120.6/s Avg: 276 Min: 50 Max: 516 Err: 0 (0.00%) Active: 100 Started: 100 Finished: 0
summary + 4138 in 00:00:30 = 138.1/s Avg: 275 Min: 50 Max: 506 Err: 0 (0.00%) Active: 100 Started: 100 Finished: 0
summary = 6940 in 00:00:53 = 130.5/s Avg: 275 Min: 50 Max: 516 Err: 0 (0.00%)
summary + 3060 in 00:00:24 = 125.9/s Avg: 276 Min: 50 Max: 502 Err: 0 (0.00%) Active: 0 Started: 100 Finished: 100
summary = 10000 in 00:01:18 = 129.0/s Avg: 276 Min: 50 Max: 516 Err: 0 (0.00%)
Java擴展JMeter的實現方式執(zhí)行完測試約用了32秒,控制臺打印出的測試結果如下魁索。JMeter進程CPU使用率為50%融撞,內存使用率為5%.
summary + 6544 in 00:00:19 = 348.5/s Avg: 273 Min: 50 Max: 501 Err: 0 (0.00%) Active: 100 Started: 100 Finished: 0
summary + 3456 in 00:00:14 = 252.6/s Avg: 277 Min: 50 Max: 501 Err: 0 (0.00%) Active: 0 Started: 100 Finished: 100
summary = 10000 in 00:00:32 = 308.1/s Avg: 274 Min: 50 Max: 501 Err: 0 (0.00%)
由測試結果可以看到Java擴展JMeter方式下執(zhí)行時間,CPU蛾默、內存占用率比BeanShell方式下占明顯的優(yōu)勢懦铺。讀者需要注意的是Avg,Min和Max指的是“Dummy Sampler”的統(tǒng)計數據支鸡,兩種使用方式下Dummy Sampler的執(zhí)行時間都是一樣的冬念,而吞吐量后者比前者多了將近1倍,原因就在于測試步驟中的第一步的不同實現方式下牧挣,后者比前者快了很多急前。
使用建議##
BeanShell是JMeter內置的功能,但是由于它是腳本語言瀑构,動態(tài)加載執(zhí)行的裆针,因此效率不是很高,不太適合于在經常執(zhí)行的場景下寺晌,比如將BeanShell放在循環(huán)內部世吨,不斷地被執(zhí)行。比較適合的應用場景是放在執(zhí)行一次呻征、或者少數幾次的地方耘婚,比如在循環(huán)外部讀取配置文件內容等。
而Java擴展JMeter的實現方式的效率比較高陆赋,適合于放在經常執(zhí)行的測試步驟中沐祷,但是由于它不是JMeter內置的功能,擴展起來需要有些工作量攒岛,而且部署的時候也比較麻煩(分布式運行的時候需要將自定義的JAR拷貝至所有的機器上)赖临。讀者根據自己的使用場景來選擇適合自己的自定義腳本的方式。
關于我們##
XMeter成立于2016年灾锯,核心團隊都來自于IBM兢榨,是一家領先技術的性能測試持續(xù)集成咨詢與服務提供商。我們致力于提供給客戶可靠,簡單,低成本的性能測試解決方案顺饮。