基于 JMeter API 開發性能測試平臺

目錄

背景:

常用的 JMeter 類和功能的解釋:

JMeter 編寫性能測試腳本的大致流程示意圖:

源碼實現方式:

(1) 環境初始化

(2) 環境初始化

(3)?創建測試計劃

(4)?創建 ThreadGroup

(5)?創建循環控制器

(6)?創建 Sampler

(7)?創建結果收集器

(8)?構建 tree,生成 jmx 腳本

(9)?測試執行

(10) 結果收集


背景:

JMeter 是一個功能強大的性能測試工具,若開發一個性能測試平臺,用它作為底層執行引擎在合適不過。如要使用其API,就不得不對JMeter 整個執行流程,常見的類有清楚的了解。

常用的 JMeter 類和功能的解釋:

  1. TestPlan?類:代表一個測試計劃,它是性能測試的頂級元素。您可以使用它來設置全局的測試屬性,如測試名稱、線程組、監聽器等。

  2. ThreadGroup?類:代表線程組,它定義了并發執行的線程數、啟動延遲時間、循環次數等。線程組是性能測試的基本單位,所有的線程都在線程組內執行。

  3. LoopController?類:代表循環控制器,它定義了循環的次數或條件。可以將循環控制器添加到線程組中,以便在每個線程中執行多次循環。

  4. HTTPSampler?類:代表 HTTP 請求采樣器,用于發送 HTTP 請求。您可以設置請求的 URL、方法(GET、POST 等)、請求參數、請求頭等。

  5. StandardJMeterEngine?類:代表 JMeter 引擎,負責配置和執行測試計劃。通過將測試計劃配置給引擎,可以啟動和執行性能測試。

  6. 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 個步驟:

  1. 通過 JMeterUtils.loadJMeterProperties 加載 JMeter 主配置文件 JMeter.properties,然后把 jmeter.properties 中的所有屬性賦值給 JMeterUtils 對象,以便之后獲取所需的配置;
  2. 設置 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 個步驟:

  1. 把可執行的測試文件加載到 StandardJMeterEngine;
  2. 通過 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】直接拿走就好了

各位想獲取資料的朋友請點贊 + 評論 + 收藏,三連!

三連之后我會在評論區挨個私信發給你們~

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/35730.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/35730.shtml
英文地址,請注明出處:http://en.pswp.cn/news/35730.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【編碼魔法師系列_六大原則5】迪米特原則(Law of Demeter Principle)

學會設計模式,你就可以像擁有魔法一樣,在開發過程中解決一些復雜的問題。設計模式是由經驗豐富的開發者們(GoF)凝聚出來的最佳實踐,可以提高代碼的可讀性、可維護性和可重用性,從而讓我們的開發效率更高。通…

每日一題——旋轉數組的最小數字(II)

旋轉數組的最小數字——II 題目鏈接 注:此題是昨天旋轉數組的最小數字——I的拓展延伸,昨天題目數組的條件是不會存在重復元素,而本題數組的元素可以重復,因此建議先做前面一題,進行思考,這樣求解這一題的…

【單片機畢業設計3-基于stm32c8t6的智能家居系統】

【單片機畢業設計3-基于stm32c8t6的智能家居系統】 前言一、功能介紹二、硬件部分三、軟件部分總結 前言 🔥這里是小殷學長,單片機畢業設計篇3 基于stm32的智能家居控制系統 🧿創作不易,拒絕白嫖(有需可點擊最后鏈接&a…

Python自動化測試框架:Pytest和Unittest的區別

pytest和unittest是Python中常用的兩種測試框架,它們都可以用來編寫和執行測試用例,但兩者在很多方面都有所不同。本文將從不同的角度來論述這些區別,以幫助大家更好地理解pytest和unittest。 1. 原理 pytest是基于Python的assert語句和Pytho…

consul安裝啟動流程

普通軟件包安裝 首先cd /opt ,將安裝包放到該目錄下 下載consul安裝包 進入consul官網找到自己開發平臺對應的安裝包下載 https://www.consul.io/downloads.html 或使用命令 wget https://releases.hashicorp.com/consul/1.6.2/consul_1.6.2_linux_amd64.zip (如果…

vue3 table動態合并,自定義參數合并單元格

<template><div><el-table :data"tableData" :span-method"objectSpanMethod" border:header-cell-style"{ textAlign: center}"><el-table-column prop"area" label"區域" align"center"&g…

HW樣本《關于“XXXX”微信視頻號發布短視頻的信息說明.exe》的逆向分析

一、概述 樣本運行后會釋放《關于“XXXX”微信視頻號發布短視頻的信息說明.doc》并打開&#xff1b;同時釋放ncloud.exe惡意文件并啟動&#xff1b;調用cmd命令刪除樣本母體&#xff1b;其中ncloud.exe會從互聯網下載類似字母表的數據解密出CS木馬&#xff0c;在內存加載并運行…

《玩轉Python數據分析專欄》大綱

歡迎來到《玩轉Python數據分析分類專欄》&#xff01;在這個專欄中&#xff0c;我們將帶您深入探索數據分析的世界&#xff0c;以Python為工具&#xff0c;解析各個領域的實際應用場景。通過100篇教程&#xff0c;我們將逐步引領您從入門級到高級&#xff0c;從基礎知識到實戰技…

前端安全:探秘安全 HTTP 頭的設置

在當今數字化時代&#xff0c;前端安全至關重要。除了應對常見的攻擊方式外&#xff0c;通過設置安全 HTTP 頭&#xff0c;我們可以加強網站的安全性&#xff0c;減少潛在的威脅。本文將為您詳細解釋什么是安全 HTTP 頭&#xff0c;以及如何通過設置它們來保護您的前端應用。 1…

真就逮住23屆了使勁薅唄,24屆笑了

作者&#xff1a;阿秀 InterviewGuide大廠面試真題網站&#xff1a;https://top.interviewguide.cn 小伙伴們大家好&#xff0c;我是阿秀。 最近在朋友圈看到不少動態說"24屆明顯好轉"的消息&#xff0c;也收到不少私信問是不是24屆的相比于23屆好多了&#xff0c;更…

深度學習階段性回顧

本文針對過去兩周的深度學習理論做階段性回顧&#xff0c;學習資料來自吳恩達老師的2021版deeplearning.ai課程&#xff0c;內容涵蓋深度神經網絡改善一直到ML策略的章節。視頻鏈接如下&#xff1a;吳恩達深度學習視頻鏈接 &#xff08;注&#xff1a;本文出自深度學習初學者&a…

Vue中如何更好地封裝組件?

子組件接受父組件傳遞的事件 1.子組件使用事件名"$emit(父組件中傳遞的事件名,想給父組件傳遞的參數(可選))" click"$emit(click)" 2.子組件使用 v-on"$listeners" 父組件&#xff1a; <template><div id"app"><myCo…

MyBatis的XML映射文件

Mybatis的開發有兩種方式&#xff1a; 注解 XML配置文件 通過XML配置文件的形式來配置SQL語句&#xff0c;這份兒XML配置文件在MyBatis當中也稱為XML映射文件。 導學&#xff1a;在MyBatis當中如何來定義一份兒XML映射文件&#xff1f; 在MyBatis當中&#xff0c;定義XML…

使用 HTML、CSS 和 JavaScript 創建多步驟表單

使用 HTML、CSS 和 JavaScript 創建多步驟表單 為了處理又長又復雜的表單&#xff0c;我們需要將它們分成多個步驟。通過一次只在屏幕上顯示一些輸入&#xff0c;表單會感覺更容易理解&#xff0c;并防止用戶感到被大量的表單字段淹沒。 在本文中&#xff0c;我將逐步指導如何…

有哪些可能引起前端安全的問題?

跨站腳本 (Cross-Site Scripting, XSS) ?種代碼注??式,為了與 CSS 區分所以被稱作 XSS。早期常?于?絡論壇, 起因是?站沒有對?戶的輸?進?嚴格的限制, 使得攻擊者可以將腳本上傳到帖?讓其他?瀏覽到有惡意腳本的??, 其注??式很簡單包括但不限于 JavaScript / CSS …

基礎堆排序(Java 實例代碼)

目錄 基礎堆排序 一、概念及其介紹 二、適用說明 三、過程圖示 四、Java 實例代碼 src/runoob/heap/Heapify.java 文件代碼&#xff1a; 基礎堆排序 一、概念及其介紹 堆排序&#xff08;Heapsort&#xff09;是指利用堆這種數據結構所設計的一種排序算法。 堆是一個近…

Linux_5_Shell腳本編程

目錄 1 基礎1.1 程序組成1.2 程序編程風格1.3 編程語言1.4 編程邏輯處理方式 2 shell 腳本語言的基本結構2.1 shell腳本的用途2.2 shell腳本基本結構2.3 創建shell腳本過程2.4 腳本注釋規范2.5 第一個腳本2.6 腳本調試2.7 變量2.7.1 變量2.7.2 變量類型2.7.3 編程語言分類2.7.4…

【MAC】 M2 brew安裝 docker 運行失敗 解決

MAC 安裝 brew install --cask docker 之后一直顯示docker: Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?. 網上看了一些文章 發現 這個不適用于M2 所以要從官網上下載 docker 安裝成功

C++ 動態規劃經典案例解析之最長公共子序列(LCS)_窺探遞歸和動態規劃的一致性

1. 前言 動態規劃處理字符相關案例中&#xff0c;求最長公共子序列以及求最短編輯距離&#xff0c;算是經典中的經典案例。 講解此類問題的算法在網上一抓應用一大把&#xff0c;即便如此&#xff0c;還是忍不住有寫此文的想法。畢竟理解、看懂都不算是真正掌握&#xff0c;唯…

多線程與并發編程面試題總結

多線程與并發編程 多線程 線程和進程的區別&#xff1f; 從操作系統層面上來講&#xff1a;進程(process)在計算機里有單獨的地址空間&#xff0c;而線程只有單獨的堆棧和局部內存空間&#xff0c;線程之間是共享地址空間的&#xff0c;正是由于這個特性&#xff0c;對于同…