好家伙,還不會(huì)模擬線上并發(fā)測(cè)試?

前言
隨著互聯(lián)網(wǎng)規(guī)模的不斷發(fā)展壯大,系統(tǒng)接口的并發(fā)要求也是越來(lái)越高了,雖然現(xiàn)在已經(jīng)有了很多技術(shù)可以提升系統(tǒng)的并發(fā)性能,但是測(cè)試又遇到了新的問(wèn)題,我們?cè)撊绾文M線上環(huán)境的并發(fā)量呢?
今天我們推薦的這款測(cè)試?yán)?,就可以很好地解決你的問(wèn)題,一起來(lái)看看吧。
Jmeter
jmeter是什么
這一款工具是Apache開源基金會(huì)下的一個(gè)開源項(xiàng)目,是由純java開發(fā)的,在測(cè)試圈比較知名,對(duì)于做過(guò)測(cè)試工作的小伙伴,這個(gè)工具應(yīng)該不陌生。

百度百科的解釋:
Apache JMeter是Apache組織開發(fā)的基于Java的壓力測(cè)試工具。用于對(duì)軟件做壓力測(cè)試,它最初被設(shè)計(jì)用于Web應(yīng)用測(cè)試,但后來(lái)擴(kuò)展到其他測(cè)試領(lǐng)域。它可以用于測(cè)試靜態(tài)和動(dòng)態(tài)資源,例如靜態(tài)文件、Java小服務(wù)程序、CGI腳本、Java對(duì)象、數(shù)據(jù)庫(kù)、FTP服務(wù)器, 等等。JMeter可以用于對(duì)服務(wù)器、網(wǎng)絡(luò)或?qū)ο竽M巨大的負(fù)載,來(lái)自不同壓力類別下測(cè)試它們的強(qiáng)度和分析整體性能。另外,JMeter能夠?qū)?yīng)用程序做功能/回歸測(cè)試,通過(guò)創(chuàng)建帶有斷言的腳本來(lái)驗(yàn)證你的程序返回了你期望的結(jié)果。為了最大限度的靈活性,JMeter允許使用正則表達(dá)式創(chuàng)建斷言。
Apache jmeter可以用于對(duì)靜態(tài)的和動(dòng)態(tài)的資源(文件,Servlet,Perl腳本,java對(duì)象,數(shù)據(jù)庫(kù)和查詢,F(xiàn)TP服務(wù)器等等)的性能進(jìn)行測(cè)試。它可以用于對(duì)服務(wù)器、網(wǎng)絡(luò)或?qū)ο竽M繁重的負(fù)載來(lái)測(cè)試它們的強(qiáng)度或分析不同壓力類型下的整體性能。你可以使用它做性能的圖形分析或在大并發(fā)負(fù)載測(cè)試你的服務(wù)器/腳本/對(duì)象。
簡(jiǎn)單來(lái)說(shuō),他就是一款壓測(cè)工具,可以對(duì)我們的接口進(jìn)行壓力測(cè)試,找到接口高并發(fā)場(chǎng)景下可能存在的系統(tǒng)缺陷。
它能干什么
根據(jù)官網(wǎng)給出的說(shuō)明,它可以完成以下工作:
能夠加載和性能測(cè)試許多不同的應(yīng)用程序/服務(wù)器/協(xié)議類型: 網(wǎng)絡(luò)協(xié)議- HTTP,HTTPS(Java,NodeJS,PHP,ASP.NET等)SOAP/REST網(wǎng)絡(luò)服務(wù)FTP服務(wù)通過(guò) JDBC連接的數(shù)據(jù)庫(kù)LDAP通過(guò) JMS的面向消息的中間件(MOM)郵件協(xié)議- SMTP(S),POP3(S)和IMAP(S)本機(jī)命令或 Shell腳本TCP協(xié)議Java對(duì)象功能齊全的 Test IDE,可進(jìn)行快速的Test Plan記錄(來(lái)自瀏覽器或本機(jī)應(yīng)用程序),構(gòu)建和調(diào)試。** CLI模式(命令行模式(以前稱為非GUI)/無(wú)頭模式)**從任何Java兼容操作系統(tǒng)(Linux、Windows、Mac OSX等)加載測(cè)試完整且可隨時(shí)呈現(xiàn)的動(dòng)態(tài) HTML 報(bào)告 通過(guò)從大多數(shù)流行的響應(yīng)格式,HTML,JSON, XML或任何文本格式中提取數(shù)據(jù)的能力,輕松實(shí)現(xiàn)關(guān)聯(lián) 100%基于Java,具有完全的可移植性 。完整的多線程框架允許通過(guò)多個(gè)線程進(jìn)行并發(fā)采樣,并通過(guò)單獨(dú)的線程組同時(shí)對(duì)不同的函數(shù)進(jìn)行采樣。 緩存和脫機(jī)分析/重放測(cè)試結(jié)果。 高度可擴(kuò)展的核心: 可插拔采樣器允許無(wú)限的測(cè)試功能。 可腳本化的采樣器(與 Groovy和BeanShell等JSR223兼容的語(yǔ)言)可以使用可插入計(jì)時(shí)器選擇幾個(gè)負(fù)載統(tǒng)計(jì)信息。 數(shù)據(jù)分析和可視化插件可實(shí)現(xiàn)出色的可擴(kuò)展性和個(gè)性化。 函數(shù)可用于為測(cè)試提供動(dòng)態(tài)輸入或提供數(shù)據(jù)操作。 通過(guò)針對(duì) Maven,Gradle和Jenkins的第三方開源庫(kù),輕松進(jìn)行持續(xù)集成。
從上面的說(shuō)明來(lái)看,Jmeter支持的協(xié)議很豐富,同時(shí)具備了極強(qiáng)的可擴(kuò)展性和可移植性,因?yàn)槭腔?code style="overflow-wrap: break-word;padding: 2px 4px;border-radius: 4px;margin-right: 2px;margin-left: 2px;background-color: rgba(27, 31, 35, 0.05);font-family: "Operator Mono", Consolas, Monaco, Menlo, monospace;word-break: break-all;color: rgb(255, 100, 65);">java開發(fā)的,所以它本身也是跨平臺(tái)的,同時(shí)還可以集成到maven、Gradle和Jenkins中,可以實(shí)現(xiàn)自動(dòng)化測(cè)試,這一點(diǎn)就很強(qiáng)了。
開箱
接下來(lái),我們就看下如何使用jmeter來(lái)完成我們的接口測(cè)試。
下載
首先,我們先去官網(wǎng)下載最新版本jmeter:
https://jmeter.apache.org/download_jmeter.cgi
最新版本是5.4.1,運(yùn)行環(huán)境基于jdk1.8+

windows環(huán)境下選擇zip那個(gè)版本,不過(guò)也不影響,都是java開發(fā)的,解壓工具能解壓就行。
解壓運(yùn)行
直接解壓,然后進(jìn)入bin目錄,然后運(yùn)行jmeter.bat腳本就可以了,當(dāng)然前提條件是你要先配置本地的JDK環(huán)境,不會(huì)的小伙伴自行百度。

打開之后,它是這樣的

不習(xí)慣英文界面的小伙伴可以修改成中文

我不喜歡深色主題,所以我把它改成淺色了,想改的小伙伴自己改:

開始測(cè)試
在開始測(cè)試之前,我們先要啟動(dòng)一個(gè)接口服務(wù),我本地啟動(dòng)了一個(gè)springboot項(xiàng)目,就是上周的那個(gè)項(xiàng)目。單個(gè)springboot,內(nèi)置的Tomcat是支持10000并發(fā)的,這一點(diǎn)還是很強(qiáng)的。
打開之后,默認(rèn)已經(jīng)創(chuàng)建了一個(gè)測(cè)試計(jì)劃,我們可以直接用,修改相應(yīng)配置即可
配置測(cè)試計(jì)劃
設(shè)置名稱和注釋,這里的配置主要是方便你管理測(cè)試計(jì)劃,你不設(shè)置也不影響

創(chuàng)建線程組
選中測(cè)試計(jì)劃,右鍵選擇添加->線程->線程組

設(shè)置線程組配置
這里設(shè)置的就是我們的并發(fā)量,包括線程數(shù)、單個(gè)線程循環(huán)次數(shù)、延遲時(shí)間、持續(xù)時(shí)間等

添加測(cè)試請(qǐng)求
選中線程組,右鍵選擇添加->取樣器->HTTP請(qǐng)求。這里需要注意的是添加的時(shí)候必須在線程組下創(chuàng)建,否則是沒法測(cè)試的,因?yàn)樗械臏y(cè)試請(qǐng)求都是通過(guò)線程組發(fā)起的。

配置測(cè)試請(qǐng)求
這里就是配置我們接口的請(qǐng)求參數(shù),包括協(xié)議、接口地址、請(qǐng)求方式、請(qǐng)求參數(shù)等

這時(shí)候就可以選中測(cè)試計(jì)劃開始測(cè)試了,運(yùn)行之前會(huì)提示我們保存測(cè)試計(jì)劃:

保存完成后,測(cè)試自動(dòng)運(yùn)行,這時(shí)候測(cè)試雖然啟動(dòng)了,但是是不會(huì)顯示測(cè)試報(bào)告的,所以我們還需要增加報(bào)告。
增加報(bào)告
同樣是選中線程組,右鍵選擇添加->監(jiān)聽器->選擇需要的報(bào)告。這里我添加了兩個(gè)報(bào)告,一個(gè)是匯總圖,一個(gè)是匯總報(bào)告,你也可以根據(jù)自己的需要選擇。

然后再次運(yùn)行,我們會(huì)發(fā)現(xiàn)匯總圖和匯總報(bào)告這里就有結(jié)果了:
匯總報(bào)告
報(bào)告里面包含了接口響應(yīng)時(shí)間的統(tǒng)計(jì),包括平均響應(yīng)時(shí)間、最大響應(yīng)時(shí)間、異常率、系統(tǒng)吞吐量、發(fā)送/接受數(shù)據(jù)的統(tǒng)計(jì)等,還是比較詳細(xì)的。

匯總圖

圖表是支持配置的,你可以根據(jù)自己的需要進(jìn)行設(shè)置,選擇圖形左上角的設(shè)置菜單即可

圖表和數(shù)據(jù)都是可以保存的
其他圖表

增加斷言
寫過(guò)單元測(cè)試的小伙伴肯定聽過(guò)或者寫過(guò)斷言這個(gè)東西,斷言簡(jiǎn)單來(lái)說(shuō)就是我們?cè)跍y(cè)試程序的時(shí)候,需要對(duì)某一段代碼或方法運(yùn)行結(jié)果進(jìn)行比對(duì),以判斷程序業(yè)務(wù)邏輯是否正常,也就是做輸入輸出對(duì)比的。
比如我們將2傳入一個(gè)方法,根據(jù)我們的預(yù)期,應(yīng)該是5,如果處理之后結(jié)果與預(yù)期一致則斷言通過(guò),否則不通過(guò),單元測(cè)試的斷言這里就不說(shuō)了,有興趣的小伙伴自己去看看。
jmeter添加斷言很簡(jiǎn)單,選中線程組,右鍵選擇添加->斷言->選擇你需要的斷言方式。這里我們選擇json斷言

簡(jiǎn)單配置
Assert josn path exists設(shè)置json中你也校驗(yàn)的key,如果你只校驗(yàn)key存在即可,那可以去掉Additionally assert value的勾,這個(gè)配置勾選的話,會(huì)校驗(yàn)上面配置的key的值,而且你需要在expected value設(shè)置預(yù)期的值。

這時(shí)候直接運(yùn)行的話,是看不到斷言結(jié)果的,我們還需要增加斷言報(bào)告:
直接在監(jiān)聽器下選擇斷言結(jié)果就可以了。

然后再次運(yùn)行,斷言結(jié)果這里就有數(shù)據(jù)了,斷言如果通過(guò)是沒有數(shù)據(jù)顯示的:

但如果你指定的key不存在,就會(huì)有錯(cuò)誤提示了,提示結(jié)果中不存在這個(gè)字段:

如果你的返回值與斷言預(yù)期結(jié)果不一致,則會(huì)提示,結(jié)果不匹配:

補(bǔ)充
jmeter的測(cè)試計(jì)劃是支持多線程組的,也就是說(shuō)你的一個(gè)測(cè)試計(jì)劃可以配置多個(gè)接口,同時(shí)測(cè)試。
總結(jié)
jmeter作為一款流行的壓測(cè)工具,從上手體驗(yàn)來(lái)看,還是很不錯(cuò)的,操作沒有特別復(fù)雜,只需要簡(jiǎn)單配置就可以完成系統(tǒng)壓測(cè),這也可能是它比較流行的原因。目前,很多公司,系統(tǒng)上線前都是用jmeter進(jìn)行壓測(cè)的,這也從側(cè)面體現(xiàn)了它穩(wěn)定、強(qiáng)大的壓測(cè)功能。
今天的內(nèi)容依然是干貨滿滿,讓你直接可以開箱即用,而且也滿足了你絕大多數(shù)的測(cè)試場(chǎng)景,有接口壓測(cè)需要的小伙伴可以用起來(lái)了。
- END -