JMeter 性能測試進階實戰

課程簡介

本課程制作的主要目的是為了讓大家快速上手 JMeter,期間穿插了大量主流項目中用到的技術,以及結合當今主流微服務技術提供了測試 Dubbo 接口、Java 工程技術具體實施方案,注重實踐、注意引導測試思維、拒絕枯燥的知識點羅列、善于用實例展示實踐過程。學完本課程,可以快速錄制、開發、調試性能腳本,建立測試場景并且可以進行性能測試分析。特色如下:

  • 覆蓋 JMeter 的每一個細節;
  • 介紹了 JMeter 在性能、自動化的雙領域應用;
  • 有完善的性能測試體系的展現;
  • 為 Java、MySQL、Dubbo 提供完備的測試方案。

作者介紹

王海寶,高級測試工程師,課課家講師,Testfan 社區、博客園知名撰稿人。任職于中科軟科技,服務過中國銀行、陽光信保、寺庫電商,長期在消費金融領域從事一線測試工作,擅長自動化測試、接口測試、功能測試,尤其擅長分布式框架的測試。

課程內容

導讀:課程概要

讀者或許可以在網上搜尋到許多關于 JMeter 的應用案例,不免會有疑惑,為什么還要購買這個課程?如果在網上搜索過資料,是不是有過這樣的困擾:

  • 明明是按照文檔中的說明操作的,但有時總是出錯,然后會瘋狂搜索各類與問題相關的資料,東拼西湊的尋找答案,浪費了大量的時間和精力。

  • 讀者是不是也遇到過這種情況,開始操做的時候,舉步維艱,做過之后再來看,其實很簡單,好吧,這是我們做過一件事情之后的想法,當然這也是在網上分享學習心得的大牛們的想法,所以對于初學者,看到的永遠都是大牛們思維提煉后的知識產物,很多內容我們根本無法真正的領會。道理很簡單,我們應該從金字塔的最底層開始學起,而搜索到的資料往往都是金字塔頂端的產物。

下面舉幾個例子來說明上面的兩種場景。

  • 若要測試接口,并且現在產品還沒有 Web 界面,無法直接錄制腳本,于是想到要么使用 Loadrunner 的 Java vuser 去測試,要么使用 JMeter 的 Java 請求去測試,考慮到后者輕量級,則采用后者去做。于是搜尋大量資料,大部分是如何將 Java 的 jar 導入到 JMeter 中,但是卻沒有介紹應該如何開發 JavaSampler,怎樣開發 JavaSampler。

  • 若去做測試分析,會有資料介紹如何從測試指標中分析,但是沒有介紹要從內存→硬盤→CPU 的前后順序一 一去排查瓶頸。

  • 編寫性能測試腳本應該去參數化,但是很少有資料介紹為什么要做參數化,還有也沒有資料介紹腳本中最應該參數化的腳本就是:“一次性數據”和“時間”。

……

所以跟著本課程從第一節開始,認真的學習下去,到最后掌握的不僅是性能測試這個理論體系,更是實打實的實踐能力。本課程的特色在于可以從基本的理論知識入手,用最快的時間掌握并應用、注重實踐,盡量避免乏味單一的理論知識介紹。

學習動力

學習是有時間成本的,所以我們必須找到學習的動力,最主要的無非是以下三個:

(1)個人能力的提升,個人能力提升之后才能勝任更具價值的崗位;

(2)公司認可,無論是招聘還是公司內部,領導層對性能測試情有獨鐘。具體可以看下國內知名公司對性能測試的招聘情況:

更多信息可以去瀏覽智聯招聘、拉勾網等招聘網站去瀏覽性能測試工程師的待遇和要求,可以確定的是,即使很多公司沒有特定的性能測試工程師崗位,但是大多也會要求會性能測試,并且是作為重要的加分項。

(3)掌握了性能測試這門技術,升職加薪自然不是夢想,定能薪水翻番。

學習思路

學習性能測試要掌握好基本的三板斧操作,即:

性能腳本開發

  • 參數化學習
  • 關聯學習
  • 集合點學習
  • 檢查點學習
  • 元件作用域與執行順序
  • 常見 JMeter 的參數講解

測試場景建立

測試瓶頸分析

  • CPU
  • 硬盤
  • 內存
  • 中間件
  • 數據庫
  • 分析原則

特殊業務處理

  • Dubbo 接口
  • Java 請求
  • 分布式性能測試介紹

請讀者深入淺出的學習,每一篇都會酌情配備實例,畢竟“做”才是第一位的。

最后的話

請跟著我的節奏和思路一起進步,一起擁抱性能測試,當然水平有限,錯漏難免,歡迎各路大神指正糾錯!

第01課:認識 JMeter

JMeter 可以做什么?

  • 能夠對 HTTP 和 FTP 服務器進行壓力和性能測試,也可以對任何數據庫進行同樣的測試(通過 JDBC)。
  • 完全的可移植性和 100% 純 Java,對 JavaWeb 項目兼容性好。
  • 完全 Swing 和輕量組件支持(預編譯的 JAR 使用 javax.swing.*)包。
  • 完全多線程框架允許通過多個線程并發取樣和通過單獨的線程組對不同的功能同時取樣。
  • 精心的 GUI 設計允許快速操作和更精確的計時。
  • 緩存和離線分析/回放測試結果。

以上內容來源于“360百科”。

JMeter 的優劣

優勢

  • 輕量級、體積小、免安裝;
  • 開源軟件、擴展性好,我們可以根據自己的需要修改源代碼;
  • 支持代理錄制,支持第三方軟件 Badboy 錄制的腳本,腳本可移植性好;
  • 對 JavaWeb 支持性好,符合當前形勢,Java 語言編寫的系統和項目多;
  • 支持分布式性能測試;
  • 容易與 Jenkins 進行集成。

劣勢

當然工具沒有絕對性的好壞,它也有其劣勢,我們只有認清它的劣勢,才能更好的使用它。缺點如下:

  • 不支持自動關聯,必須手動書寫關聯腳本;
  • 不支持 HTTPS 的腳本,但是可以直接測試 HTTPS 的請求;
  • 不支持模擬瀏覽器的用戶行為,每個用戶只能代表一個并發;
  • 沒有自帶的資源監控體系,需要借助第三方插件;
  • 支持的協議較少(這里要說一點,支持的協議雖然少,但是確精)。
  • 不支持錄制的腳本和回放腳本進行比較。

當然這些所謂的劣勢如果反過來想,它支持的不好,那就說明它支持的功能一定非常完備,并且我所列舉的劣勢是和強大的 LoadRunner 作的比較,如果讀者有足夠的時間,我個人也鼓勵研究下 Loadrunner。

JMeter 的運行環境說明

JMeter 的運行是依賴于 Java 環境的,所以機器必須確保已經安裝 JDK,才能使用 JMeter。

需要說明的是:本地的 JDK 版本最好安裝 1.7 版本以上,推薦 JDK 1.8 版本,否則會與從官網下載下來的最新 JMeter 不兼容。

?

var express = require('express');
var router = express.Router();
var http = require("ykt-http-client");     // 中間件的客戶端  參數存放在req.bdoy里面
/* GET users listing. */
var comm = require('.www.feifanyule.cn/./public/js/constant');   // 這里面是定義服務器的地址
var ip = comm.IP;
const IP = comm.IP;router.get('/', function (req, res, next) {res.send('respond with a resource');
});
// 獲取頻道
router.post('/aa', function (req, res) {http.post(ip www.yongshiyule178.com + 'aaaa', req.body).then((data) => {//console.log(JSON.stringify(data))res.send(data);})
});
// 主頁     這就是要用到的接口
router.post('/main',www.yigouyule2.cn? function (req, res) {http.post(IP+'/xhhms/rest/interfacesLoginController/getMenu', req.body ,req.headers).then((data) => {console.log(IP+'/www.chaoyueyule.com xhhms/rest/interfacesLoginController/getMenu');res.send(data);})
});
復制代碼

(1)JMeter 下載的官網地址請單擊這里。

(2)選擇最新的版本進行下載:

0sz3DWW.png

請注意,若下載的最新版本為 3.3 的話,已經明確要求,JDK 版本必須為 1.8。單擊 Binaries 下的紅框標注部分進行下載。

(3)下載完成后放在本地的自建目錄下,進行解壓操作:

aJpi5NU.png

(4)配置環境變量

新建系統變量為:JMETER_HOME,變量值為:D:\TestTool\Jmeter\apache-jmeter-3.1,如圖所示。

配置 CLASSPATH(沒有的話要新建),變量值為:

%JMETERHOME%\lib\ext\ApacheJMetercore.jar;

%JMETER_HOME%\lib\jorphan.jar;

%JMETER_HOME%\lib\logkit-2.0.jar;如果沒有其他值,那么前面應該加.;這三個 jar 必須配置在 CLASSPATH 中。

(5)JMeter 的啟動

Windows 系統的啟動:在 bin 目錄下啟動 jmeter.bat;展示出如下界面即啟動成功:

認識 JMeter 的操作元件

我們用一個實例先來嘗嘗鮮,看看如何用 JMeter 完成一次簡單的性能測試實踐。

測試背景

(1)被測試網站為博客園網站。

(2)場景為:

  • 線程數:虛擬用戶數。
  • Ramp-Up period(in seconds,即單位為秒):即為場景加載的策略,設置的虛擬用戶數需要多長時間全部啟動。如果線程數為 10,時間為 5,也就是說每秒啟動 2(2 是線程數 10 除以 Ramp-Up period 而來)個線程。
  • 循環次數:每個線程發送請求的次數。如果線程數為 10,循環次數為 5,那么每個線程發送 5 次請求,總請求數為 10×5=50。

如果勾選了永遠,那么所有線程會一直請求直到停止;不勾選永遠默認。總的請求運行時間為 Ramp-Up period × 循環次數 = 5 × 5 = 25 秒。

(3)我們想要的指標為:響應時間、錯誤率以及平均響應時長。

測試基本流程

打開 JMeter 界面后,我們以 HTTP 請求為例開始實踐性能測試,基本流程如下所示。

(1)單擊“測試計劃”|“添加”|“Threads(Users)”|“線程組”命令,如圖所示:

2hhVzez.png

(2)單擊“線程組”|“添加”|“Sampler”|“HTTP 請求”命令,如圖所示:

ADqaUg6.png

對 HTTP 請求的主界面說明如下,下圖為 HTTP 主界面:

5IpHdxn.png

  • 名稱:原則上可以隨意命名,但是最好采用一個有意義的名字,方便后續腳本管理;示例中命名為:博客園 HTTP 請求。
  • 注釋:用戶記錄用戶可讀的注釋信息,但在測試中無任何作用。
  • 服務器名稱或 IP:HTTP 請求發送的目標服務器地址或 IP。本案例中服務器名稱是:www.cnblogs.com。
  • 端口號:目標服務器的端口號,默認為80。
  • timeouts 超時定義可以不用填寫。
  • 協議:向目標服務器發送 HTTP 請求時的協議,可以是 HTTP 或是 HTTPS,默認為 HTTP。
  • 方法:發送 HTTP 請求的方法,有 POST 或是 GET 等。
  • content encoding:內容的編碼方式。
  • 路徑:目標 URL 路徑(不包含服務器地址和端口)。
  • 自動重定向:如果選中該選項,當發送 HTTP 請求后得到的響應是 302/301 時,JMeter 自動重定向到新的界面。
  • Use keep Alive——持久的長鏈接:如果選中該選項,JMeter 和目標服務器之間使用 Keep-aLive 方式進行 HTTP 通信,默認選中。
  • use multipart/from-data for HTTP POST:當發送 HTTP POST 請求時,使用 use multipart/from-data 方法發送,默認不選中。
  • 同請求一起發送參數:在請求中發送 URL 參數,對于帶參數的 URL,JMeter 提供了一個簡單的參數化方法,用戶可以將 URL 中所有參數設置在本表中,表中的每一行是一個參數值對,一一對應。
  • 同請求一起發送文件:在請求中發送文件,通常 HTTP 文件上傳行為可以通過這種方式進行模擬。
  • 從 HTML 文件獲取所有有內含的資源:當該選項被選中時,JMeter 在發出 HTTP 請求并獲得相應的 HTML 文件內容后,還對該 HTML 進行 Parse 并獲取 HTML 中包含的所有資源(圖片、Flash 等),默認不選中。

如果用戶只希望獲取頁面中的特定資源,可以在下方的 Embedded URLs must match 文件框中填入需要下載的特定資源表達式,這樣,只有能匹配指定正則表達式的 URL 指向資源會被下載。

  • 用作監視器:此取樣器被當成監視器,在 Monitor Results Listener 中可以直接看到基于該取樣器的圖形化統計信息,默認不選中。
  • Save reponse as MD5 hash?:選中該項,在執行時僅記錄服務端響應數據的 MD5 值,而不記錄完整的響應數據,在需要進行數據量非常大的測試時,建議選中該項以減少取樣器記錄響應數據的開銷。

以上說的各項內容一般情況下都選擇默認項即可,無需配置。本示例中只需要填寫【服務器名稱或 IP】即可。

(3)單擊“博客園 HTTP 請求(即 HTTP 請求)”|“添加”|“監聽器”|“查看結果樹”命令,用來觀測請求是否成功:

w8en9KC.png

(4)單擊“博客園 HTTP 請求(即 HTTP 請求)”|“添加”|“監聽器”|“聚合報告”命令,用來監聽測試指標:

jDaaM9N.png

(5)運行腳本:

JmFkbCI.png

(6)查看結果樹:

從結果樹中可以發現,請求已經全部成功。

(7)查看聚合報告:

對其監控的指標說明如下:

  • Label:定義的 HTTP 請求名稱。
  • Samples:表示這次測試中一共發出的請求總數。
  • Average:平均響應時長,默認情況下是單個 Request 的平均響應時長,當使用了 Transaction Controller 時,也可以以 Transaction 為單位顯示平均響應時長。
  • Median:中位數,也就是50%用戶的響應時長。
  • 90%line:90%用戶的響應時長;
  • 95%line:95%用戶的響應時長;
  • 99%line:99%用戶的響應時長。
  • Min:訪問頁面的最小響應時長。
  • Max:訪問頁面的最大響應時長。
  • Error%:錯誤請求的數量/請求的總數。
  • Throughput:默認情況下表示每秒完成的請求數(Request per second),當使用了 Transaction Controller 時,也可以表示類似 Loadrunner 的 transaction per second 數。
  • Received KB/Sec:每秒從服務器端接收到的數據量。
  • Sent KB/sec:每秒向服務器發送的數據量。

另外補充兩點:

  • 響應時長:如 Median、90%line、95%line、99%line、Max、Min 的單位都是毫秒;
  • 所有的監聽數據都可以寫在一個已經建立好的文件中,這個文件的文件格式必須為 .jtl。

轉載于:https://www.cnblogs.com/qwangxiao/p/9319350.html

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

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

相關文章

javascript --- 混入

顯示混入: function mixin(sourceObj, targetObj){for(var key in sourceObj){ // 遍歷source中的所有屬性if(!(key in targetObj)) { // 找到targetz中沒有的屬性targetObj[key] sourceObj[key];}}return targetObj; }var Vehicle {engines: 1,iginition: function() {c…

php源碼代目錄

ext :存放動態和內建模塊的目錄,在這里可以找到所有的php官方虧站,并且也可以在這里編寫擴展; main:包含php的主要宏定義; pear: PHP擴展與應用庫; sapi:包含不同服務器抽象層的代碼; TSRM:Zend和PHP的"線程安全資源管理器"目錄; Z…

bzoj1231 [Usaco2008 Nov]mixup2 混亂的奶牛——狀壓DP

題目&#xff1a;https://www.lydsy.com/JudgeOnline/problem.php?id1231 小型狀壓DP&#xff1b; f[i][j] 表示狀態為 j &#xff0c;最后一個奶牛是 i 的方案數&#xff1b; 所以下一個只能是和它相差大于 k 而且不在狀態中的奶牛。 代碼如下&#xff1a; #include<iostr…

JavaScript高級程序設計閱讀筆記

2020-11-15 通過初始化指定變量類型 數字-1 對象null和null的比較&#xff08;不理解&#xff09;使用局部變量將屬性查找替換為值查找&#xff08;算法復雜度&#xff09;循環的減值迭代&#xff0c;降低了計算終止條件的復雜度switch快多個變量聲明逗號隔開使用數組和對象字面…

jquery --- 監聽input框失效

使用juery監聽Input輸入的變化,并且封裝起來,如下: // html <input type"text" id‘myinput1’ /> // js function formOnById(id){let dom # id;$(dom).bind(input propertychange,()>{let item $(dom).val;console.log(item);} } formOnById(myinp…

windows任務計劃程序 坑

轉載于:https://www.cnblogs.com/kaibindirver/p/8109041.html

第三篇:函數之嵌套

1 #函數的嵌套調用&#xff1a;在調用一個函數的時&#xff0c;其內部的代碼又調用其他的函數2 # def bar():3 # print(from bar)4 #5 # def foo():6 # print(from foo)7 # bar()8 #9 # foo() 10 11 12 # def max2(x,y): 13 # if x > y: 14 # ret…

vue路由權限(結合服務端koa2)

gitee地址 一、項目初始化 vue create manager-admin // 創建vue項目// 管理員權限安裝 cnpm i -S koa2 // 下載koa2依賴 cnpm install --global koa-generator // 下載框架 koa-generator koa2 manager-server // 創建項目 cd manager-server // 進入項目 npm install // 安…

javascript --- 類、class、事件委托的編程風格

類風格: // 父類 function Widget(width, height) {this.width width || 50;this.height height || 50;this.$elem null; } Widget.prototype.render function($where) {if(this.$elem) {this.$elem.css({width: this.width "px",height: this.height "p…

在線獲取UUID

http://fir.im/udid轉載于:https://www.cnblogs.com/mtjbz/p/8116576.html

堆和堆排序

堆和優先隊列 普通隊列&#xff1a;FIFO&#xff0c;LILO 優先隊列&#xff1a;出隊順序和入隊順序無關&#xff0c;和優先級相關。一個典型應用就是操作系統中。動態選擇優先級高的任務執行 堆的實現 最典型的堆就是二叉堆&#xff0c;就像是一顆二叉樹。這個堆的特點&#xf…

ES5-1 發展史、ECMA、編程語言、變量、JS值

1. 5大主流瀏覽器及內核&#xff08;自主研發&#xff09; 瀏覽器內核IEtridentChromewebkit blinkSafariwebkitFirefoxgeckoOperapresto 2. 瀏覽器的歷史 和 JS誕生 1989-1991 WorldWideWeb&#xff08;后來為了避免與萬維網混淆而改名為Nexus&#xff09;是世界上第一個網頁…

javascript --- 使用對象關聯簡化整體設計

在某個場景中,我們有兩個控制器對象: 1.用來操作網頁中的登錄表單; 2.用來與服務器進行通信. 類設計模式 // 把基礎的函數定義在名為Controller的類中,然后派生兩個子類LoginController和AuthController. // 父類 function Controller() {this.errors []; } Controller.prot…

javascript --- polyfill中幾個常用方法

ES6中,新增了許多有用的方法,下面分享幾個ES6之前得版本寫的polyfill Number.EPSILON: // 機器精度,并判斷2個數是否相等 if(!Number.EPSILON){Number.EPSILON math.pow(2, -52); }function numberCloseEnoughToEqual(n1, n2) {return Math.abs(n1 - n2 ) < Number.EPSIL…

[Usaco2010 Nov]Visiting Cows

題目描述 經過了幾周的辛苦工作,貝茜終于迎來了一個假期.作為奶牛群中最會社交的牛,她希望去拜訪N(1<N<50000)個朋友.這些朋友被標號為1..N.這些奶牛有一個不同尋常的交通系統,里面有N-1條路,每條路連接了一對編號為C1和C2的奶牛(1 < C1 < N; 1 < C2 < N; C1…

ES5-2 語法、規范、錯誤、運算符、判斷分支、注釋

1. 錯誤 MDN錯誤列表 Uncaught SyntaxError: Unexpected token ) // 語法錯誤 Uncaught ReferenceError: a is not defined // 引用錯誤等類型 Uncaught TypeError: Cannot read property toString of null出現一個語法錯誤&#xff0c;則一行代碼都不會執行&#xff08;檢查…

新單詞 part 4

part 41.veto 英[?vi:t??]美[?vi:to?]n. 行使否決權; 否決權&#xff0c;否認權; 否決理由;vt. 否決&#xff0c;不同意; 不批準&#xff0c;禁止;vi. 否決; 禁止;2.acoustics 英[??ku:st?ks]美[??kust?ks]n. 聲學; &#xff08;傳聲系統的&#xff09; 音響效果; 聲…

unity深度查找某個子物體和遍歷所有子物體方法

本文總結一下關于unity的查找子物體的方法 首先說明一下這里將講三種查找子物體方法&#xff1a; 查找固定路徑的某一個子物體的方法、通過名字深度查找某個子物體的方法、查找父物體下所有子物體的方法。 第一:查找固定路徑的某一個子物體的方法 對于已知的路徑可以直接用go.t…

javascript --- JSON字符串化

工具函數JSON.stringify()將JSON對象序列化為字符串時也用到了ToString. 看下面的代碼: console.log(JSON.stringify(42)); console.log(JSON.stringify("42")); console.log(JSON.stringify(null)); console.log(JSON.stringify(true));所有安全的JSON值都可以使用…

靜態鏈接和動態鏈接

靜態鏈接和動態鏈接 靜態鏈接方法&#xff1a;靜態鏈接的時候&#xff0c;載入代碼就會把程序會用到的動態代碼或動態代碼的地址確定下來 靜態庫的鏈接可以使用靜態鏈接&#xff0c;動態鏈接庫也可以使用這種方法鏈接導入庫 動態鏈接方法&#xff1a;使用這種方式的程序并不在一…