目錄
背景:
常用的 JMeter 類和功能的解釋:
JMeter 編寫性能測試腳本的大致流程示意圖:
源碼實現方式:
(1) 環境初始化
(2) 環境初始化
(3)?創建測試計劃
(4)?創建 ThreadGroup
(5)?創建循環控制器
(6)?創建 Sampler
(7)?創建結果收集器
(8)?構建 tree,生成 jmx 腳本
(9)?測試執行
(10) 結果收集
背景:
JMeter 是一個功能強大的性能測試工具,若開發一個性能測試平臺,用它作為底層執行引擎在合適不過。如要使用其API,就不得不對JMeter 整個執行流程,常見的類有清楚的了解。
常用的 JMeter 類和功能的解釋:
-
TestPlan
?類:代表一個測試計劃,它是性能測試的頂級元素。您可以使用它來設置全局的測試屬性,如測試名稱、線程組、監聽器等。 -
ThreadGroup
?類:代表線程組,它定義了并發執行的線程數、啟動延遲時間、循環次數等。線程組是性能測試的基本單位,所有的線程都在線程組內執行。 -
LoopController
?類:代表循環控制器,它定義了循環的次數或條件。可以將循環控制器添加到線程組中,以便在每個線程中執行多次循環。 -
HTTPSampler
?類:代表 HTTP 請求采樣器,用于發送 HTTP 請求。您可以設置請求的 URL、方法(GET、POST 等)、請求參數、請求頭等。 -
StandardJMeterEngine
?類:代表 JMeter 引擎,負責配置和執行測試計劃。通過將測試計劃配置給引擎,可以啟動和執行性能測試。 -
JMeterUtils
?類:提供了一些 JMeter 的實用方法和屬性。通過加載 JMeter 屬性文件并初始化本地設置,可以確保 JMeter API 的正確運行。
為了能夠在代碼中創建和配置測試計劃、線程組、循環控制器和其他元素,以及執行性能測試,這些類的功能和方法是我們必須要熟悉的。掌握了這些類,那么利用jmeter如何編寫性能測
試腳本是怎樣的,我們也來回顧下:
JMeter 編寫性能測試腳本的大致流程示意圖:
源碼實現方式:
(1) 環境初始化
需要在項目中引入 上述JMeter核心API,這樣我們才能使用 JMeter 提供的各種功能和類
import org.apache.jmeter.control.LoopController;
import org.apache.jmeter.engine.StandardJMeterEngine;
import org.apache.jmeter.protocol.http.sampler.HTTPSampler;
import org.apache.jmeter.testelement.TestPlan;
import org.apache.jmeter.threads.ThreadGroup;
import org.apache.jmeter.util.JMeterUtils;
(2) 環境初始化
JMeter API 在執行過程中,首先會讀取 JMeter 軟件安裝目錄文件下配置文件里的屬性,所以我們要通過 JMeter API 讀取指定的 JMeter 主配置文件的目錄以及 JMeter 的安裝目錄,
其中環境初始化主要包括以下 2 個步驟:
- 通過 JMeterUtils.loadJMeterProperties 加載 JMeter 主配置文件 JMeter.properties,然后把 jmeter.properties 中的所有屬性賦值給 JMeterUtils 對象,以便之后獲取所需的配置;
- 設置 JMeter 的安裝目錄,JMeter API 會根據我們指定的目錄加載腳本運行時需要的配置
JMeterUtils.loadJMeterProperties("jmeter.properties");JMeterUtils.setJMeterHome(~/jemter)
JMeterUtils.initLocale();
(3)?創建測試計劃
使用?TestPlan
?類創建一個測試計劃,并設置相關屬性。
TestPlan testPlan = new TestPlan("My Test Plan");
testPlan.setProperty(TestElement.TEST_CLASS, TestPlan.class.getName());
testPlan.setProperty(TestElement.GUI_CLASS, TestPlanGui.class.getName());
(4)?創建 ThreadGroup
使用?ThreadGroup
?類創建一個線程組,并設置相關屬性,例如線程數、循環次數等
ThreadGroup threadGroup = new ThreadGroup();
threadGroup.setName("My Thread Group");
threadGroup.setNumThreads(10);
threadGroup.setRampUp(5);
threadGroup.setSamplerController(loopController);
(5)?創建循環控制器
這一步是一個可選項。我們在實際測試過程中,創建循環控制器是為了模擬一個用戶多次進行同樣操作的行為,不創建循環控制器則默認是只執行一次操作。循環控制器創建的代碼如下:
LoopController loopController = new LoopController();//設置循環次數,1 代表循環 1 次loopController.setLoops(1);loopController.setFirst(true);loopController.setProperty(TestElement.TEST_CLASS, LoopController.class.getName());loopController.setProperty(TestElement.GUI_CLASS, LoopControlPanel.class.getName());loopController.initialize()
(6)?創建 Sampler
使用?HTTPSampler
?類創建一個 HTTP 請求采樣器,并設置請求的 URL、方法等屬性
HTTPSampler httpSampler = new HTTPSampler();
httpSampler.setDomain("example.com");
httpSampler.setPort(80);
httpSampler.setPath("/api/endpoint");
httpSampler.setMethod("GET");
(7)?創建結果收集器
結果收集器可以保存每次 Sampler 操作完成之后的結果的相關數據,例如,每次接口請求返回的狀態、服務器響應的數據。
ResultCollector resultCollector = new ResultCollector();resultCollector.setName(ResultCollector.class.getName());
(8)?構建 tree,生成 jmx 腳本
以上步驟其實都是為了創建了一個 HashTree 節點做準備。把創建都添加到 子 HashTree 節點中,然后把子 HashTree 加到 testplan 中,最后再把 tesplan 節點加到構建好的父 HashTree 節點,這樣就生成了我們的腳本可執行文件 jmx。代HashTree subTree = new HashTree(
通過以上代碼就可以創建出 JMeter 可識別的 HashTree 結構,并且可以通過 saveTree 保存為 test.jmx 文件。如果是現成的jmx文件,可直接通過?HashTree?jmxTree?=
SaveService.loadTree(file);?loadTree 會把 jmx 文件轉成內存對象,并返回內存對象中生成的 HashTree。
subTree.add(httpSamplerProxy);subTree.add(loopController);subTree.add(threadGroup);subTree.add(resultCollector);HashTree tree = new HashTree();tree.add(testPlan,subTree);SaveService.saveTree(tree, new FileOutputStream("test.jmx"));} catch (IOException e) {e.printStackTrace();}
(9)?測試執行
通過腳本文件的執行(測試執行),我們便可以開始對服務器發起請求,進行性能測試。測試執行主要包括 2 個步驟:
- 把可執行的測試文件加載到 StandardJMeterEngine;
- 通過 StandardJMeterEngine 的 run 方法執行,便實現了 Runable 的接口,其中 engine.run 執行的便是線程的 run 方法
StandardJMeterEngine engine = new StandardJMeterEngine();engine.configure(jmxTree);engine.run();
(10) 結果收集
JMeter API 提供了一個結果收集器(ResultCollector),用于收集和處理性能測試結果。它是?SampleListener
?接口的一個實現類,可以監聽每個測試樣本的事件,并對測試結果進行
處理。我們可以重寫 sampleOccurred 方法來收集每次 loop 的結果。該方法的參數 SampleEvent 中包含相應的測試結果。然后把測試結果數據存到消息隊列里面,比如kafka ,后端獲取存
儲的實時采集數據,進行相應的計算,生成的數據返回給前端進行繪制展示。
?以下是我收集到的比較好的學習教程資源,雖然不是什么很值錢的東西,如果你剛好需要,可以評論區,留言【777】直接拿走就好了
各位想獲取資料的朋友請點贊 + 評論 + 收藏,三連!
三連之后我會在評論區挨個私信發給你們~