JMeter性能测试的基础知识和个人理解
JMeter性能測(cè)試的基礎(chǔ)知識(shí)和個(gè)人理解
1. JMeter的簡(jiǎn)介
??JMeter是Apache組織開發(fā)的開源項(xiàng)目,設(shè)計(jì)之初是用于做性能測(cè)試的,同時(shí)它在實(shí)現(xiàn)對(duì)各種接口的調(diào)用方面做的比較成熟,因此,常被用做接口功能測(cè)試和性能測(cè)試。它能夠很好的支持各種常見接口,如HTTP(S)、WebService、JDBC、JAVA、FTP等,并以多種形式展現(xiàn)測(cè)試結(jié)果。
2. 組成部分
??這部分主要是自己使用過的一些組件和配置的整合,不會(huì)詳細(xì)的講解每一個(gè)組件,有很多的組件都沒有介紹到,詳細(xì)的還請(qǐng)參考JMeter的官方文檔:https://wiki.apache.org/jmeter。
2.1 Thread Group(線程組)
??線程組模擬多個(gè)用戶,同時(shí)或者有順序的去執(zhí)行任務(wù)。一個(gè)線程組可設(shè)置多個(gè)線程,每個(gè)線程之間互不影響。通過線程組模擬多個(gè)用戶用來進(jìn)行服務(wù)器的并發(fā)或者負(fù)載測(cè)試。
??前提是創(chuàng)建一個(gè)Test Plan,對(duì)于Test Plan的創(chuàng)建,從File選項(xiàng)就可以創(chuàng)建了。關(guān)于線程組的創(chuàng)建,右鍵TestPlan,選擇【Add->Threads->Thread Group】,如下圖:
?? 添加完畢,如下圖是線程組的一些詳細(xì)的設(shè)置,具體的描述參考下文:
?? 關(guān)于【Action to be taken after a Sampler error】這里設(shè)置的是當(dāng)有一個(gè)請(qǐng)求出現(xiàn)了錯(cuò)誤時(shí),要怎么做。
?? Continue: 出錯(cuò)不會(huì)影響到其他的請(qǐng)求
??Start Next Thread Loop:停止當(dāng)前這一次的Thread Loop,不管當(dāng)前Thread Loop的請(qǐng)求是否完成,直接進(jìn)入下一次。
??Stop Thread:會(huì)停止了當(dāng)前的線程組
??Stop Test:停止這一次測(cè)試,會(huì)等待最后執(zhí)行的請(qǐng)求的響應(yīng)。
??Stop Test Now:強(qiáng)制停止這次測(cè)試,不會(huì)等待最后執(zhí)行的請(qǐng)求的響應(yīng)。
??關(guān)于 【Thread Properties】則是每一個(gè)線程的屬性
??Numbers of Threads:模擬的用戶或者線程數(shù)量
??Ramp-Up Period: 所有的線程在指定的時(shí)間內(nèi)完成啟動(dòng)
??Loop Count: 這一組線程執(zhí)行的次數(shù),舉個(gè)例子,線程數(shù)10,Loop Count為5,則這個(gè)測(cè)試最終會(huì)發(fā)起50個(gè)請(qǐng)求。
??Scheduler:指定一個(gè)線程組測(cè)試配置開始和結(jié)束時(shí)間,例如:指定Duration為3600,則一個(gè)小時(shí)后該測(cè)試就結(jié)束了。
2.2 Sampler(請(qǐng)求的類型)
??Sampler是JMeter的取樣器,采樣器用于發(fā)送請(qǐng)求到不同類型的服務(wù)器。其實(shí)通俗的理解可以將它看作是一種請(qǐng)求(不是很準(zhǔn)確),例如HTTP,FTP等,實(shí)際上它可以執(zhí)行許多的取樣。我一般使用的多是HTTP,所以就舉HTTP例子來講解下。
??添加一個(gè)HTTP Sampler,右鍵單擊線程組,依次選擇【Add->Sampler->HTTP Request】即可,如下圖:
??添加完HTTP取樣器后,配置該HTTP請(qǐng)求的一些參數(shù)以及URL等,途中的一些配置使用的是自定義變量進(jìn)行填入的,后面會(huì)提到該組件,HTTP請(qǐng)求具體如下圖:
??配置的HTTP Sampler將是前面的線程組中的每一個(gè)線程要執(zhí)行的具體的操作,那些線程組會(huì)按照線程組的配置,發(fā)送向指定的服務(wù)器應(yīng)用發(fā)送HTTP請(qǐng)求。
2.3 Configuration Element(配置組件)
??主要用于定義一些配置和一些變量,提供給其他的組件使用,例如自定義變量,像上面的HTTP Sampler中使用到的${host},${port}等變量,可以使得測(cè)試的配置更加的靈活。
??添加一個(gè)自定義的變量,右鍵單擊線程組,依次選擇【Add->Config Element->User Defined Variables】即可,如下圖:
??添加完該組件后,定義一些自定義變量,如下圖所示:
2.4 Listener(監(jiān)聽器)
??Listener提供的組件可以用來對(duì)請(qǐng)求的數(shù)據(jù)和響應(yīng)的結(jié)果進(jìn)行分析和統(tǒng)計(jì),例如Summary Report可以統(tǒng)計(jì)測(cè)試信息的概要信息,View Result Tree可以監(jiān)聽攔截到每一次請(qǐng)求的數(shù)據(jù)和響應(yīng)的數(shù)據(jù)結(jié)果。
2.4.1 Summary Report
??添加Summary Report,右鍵單擊線程組,依次選擇【Add->Listener->Summary Report】即可,如下圖:
??Summary Report主要包括了請(qǐng)求數(shù),平均響應(yīng)時(shí)間,最小響應(yīng)時(shí)間,最大響應(yīng)時(shí)間,出錯(cuò)率,吞吐量,每秒接收數(shù)據(jù)和每秒發(fā)送數(shù)據(jù)等,詳細(xì)如下圖所示:
2.4.1 View Result Tree
??添加View Result Tree,右鍵單擊線程組,依次選擇【Add->Listener->View Result Tree】即可,如下圖:
??View Result Tree主要監(jiān)聽了請(qǐng)求的信息和響應(yīng)的數(shù)據(jù)信息,詳細(xì)如下圖所示,
??對(duì)于Listener而言,是沒有什么需要配置的,主要是通過這些組件,將數(shù)據(jù)可視化,方便測(cè)試人員分析和統(tǒng)計(jì)結(jié)果。
2.5 Timer(定時(shí)器)
??JMeter可以使用定時(shí)器來定義請(qǐng)求之間的等待時(shí)間。如果不指定,JMeter會(huì)一個(gè)請(qǐng)求完成后立即執(zhí)行下一個(gè)請(qǐng)求,沒有任何等待時(shí)間。
2.5.1 Synchronizing Timer(模擬并發(fā))
??性能測(cè)試中我們經(jīng)常提到一個(gè)概念就是“并發(fā)”,其實(shí)在實(shí)際真實(shí)的性能測(cè)試中是不存在真正的并發(fā)的。為了更真實(shí)的模擬對(duì)一個(gè)請(qǐng)求的并發(fā)測(cè)試場(chǎng)景,我們通常設(shè)置一個(gè)聚合請(qǐng)求的點(diǎn),JMeter中提供了這樣的一個(gè)功能設(shè)置,就是Timer中的Synchronizing Timer,它通過設(shè)置一個(gè)請(qǐng)求總數(shù)和一個(gè)等待時(shí)間,保證在指定時(shí)間內(nèi)達(dá)到設(shè)置的請(qǐng)求數(shù)時(shí),作為一組請(qǐng)求發(fā)送出去。舉個(gè)例子:請(qǐng)求數(shù)為20,等待時(shí)間無限長(zhǎng)(即設(shè)置為0),那么需要請(qǐng)求數(shù)達(dá)到20個(gè)時(shí)(原有的線程數(shù)一定要有20個(gè)或者以上,否則永遠(yuǎn)將無法滿足這個(gè)條件,就不會(huì)發(fā)送了),JMeter才會(huì)發(fā)送請(qǐng)求,這樣保證了最接近并發(fā)的場(chǎng)景。
??添加一個(gè)Synchronizing Timer的步驟:右鍵單擊線程組,依次選擇【Add->Timer->Synchronizing Timer】即可,如下圖:
??設(shè)置Synchronizing Timer的一組請(qǐng)求的數(shù)量和等待請(qǐng)求數(shù)達(dá)到設(shè)置的數(shù)量值時(shí)的等待時(shí)間,即超時(shí)時(shí)間,如果為0表示一直等待,如果請(qǐng)求數(shù)達(dá)不到設(shè)置的值則一直不會(huì)發(fā)送。如果設(shè)置了值則如果指定時(shí)間內(nèi)沒有達(dá)到那么多個(gè)請(qǐng)求,時(shí)間到了也會(huì)將請(qǐng)求都發(fā)送出去,基本設(shè)置如下圖:
??注意:這個(gè)請(qǐng)求數(shù)量和超時(shí)時(shí)間的設(shè)置不合理會(huì)導(dǎo)致不會(huì)發(fā)請(qǐng)求。如果超時(shí)時(shí)間設(shè)置為0了,那么一定要保證Synchronizing Timer設(shè)置的請(qǐng)求數(shù)小于線程總數(shù),才能保證可以集合到指定的請(qǐng)求數(shù)。如果設(shè)置了超時(shí)時(shí)間則可以避免這種情況的出現(xiàn),達(dá)到超時(shí)時(shí)間后無論是否滿足了設(shè)置的請(qǐng)求數(shù)都會(huì)發(fā)送出去。
??關(guān)于模擬并發(fā)的一些理解,如果使用Synchronizing Timer模擬50個(gè)并發(fā),那么假設(shè)我們使用了一個(gè)有50個(gè)線程的線程組,超時(shí)時(shí)間設(shè)置為0,則該測(cè)試每次都會(huì)等到有50個(gè)線程準(zhǔn)備好了,一起發(fā)送請(qǐng)求,這樣就模擬了指定時(shí)刻50個(gè)用戶像系統(tǒng)并發(fā)請(qǐng)求的場(chǎng)景。這種請(qǐng)求往往是一瞬間的事情,如果只有50個(gè)線程,那么下一次發(fā)起這個(gè)請(qǐng)求肯定需要等到所有的請(qǐng)求和響應(yīng)完成,才能發(fā)起,至于這期間的間隔時(shí)間是多少就是不確定的,可能是1s,可能是5s,也可能是10s甚至是100s,都有可能;如果想要持續(xù)的發(fā)起50個(gè)并發(fā),讓兩組并發(fā)之間的時(shí)間盡可能的短,則可能需要將線程數(shù)進(jìn)行調(diào)大,設(shè)置為200,300或者500,其實(shí)這個(gè)值越大未必越好,或者說不斷的發(fā)起指定的并發(fā)請(qǐng)求未必是合理的,因?yàn)椴l(fā)越大,每次并發(fā)的間隔越短的話,系統(tǒng)接收到的請(qǐng)求越多,那么很可能會(huì)已經(jīng)超出了系統(tǒng)的負(fù)載,那么服務(wù)器就會(huì)處理超時(shí),其實(shí)這樣也沒什么意義了。所以對(duì)于這個(gè)并發(fā)的設(shè)置該怎么測(cè),要怎么的效果,還需要根據(jù)實(shí)際的情況進(jìn)行調(diào)整,尋找系統(tǒng)合適的并發(fā)數(shù),做一定持續(xù)時(shí)間的并發(fā)數(shù)反而比設(shè)置短時(shí)間的持續(xù)并發(fā)來的有意義些。
2.5.2 Constant Throughput Timer(常數(shù)吞吐量計(jì)時(shí)器)
??常數(shù)吞吐量計(jì)時(shí)器,可以對(duì)測(cè)試計(jì)劃設(shè)置指定的吞吐量,以指定的吞吐量測(cè)試系統(tǒng)。
??添加一個(gè) Constant Throughput Timer的步驟:右鍵單擊線程組,依次選擇【Add->Timer-> Constant Throughput Timer】即可,如下圖:
??常數(shù)吞吐量計(jì)時(shí)器,指定吞吐量,如下圖的吞吐量設(shè)置為了每分鐘3000,則TPS為50,即每秒50個(gè)請(qǐng)求,然后還有個(gè)選項(xiàng)是設(shè)置這個(gè)吞吐量是基于哪一些線程的,如果選擇This thread only則控制每個(gè)線程的吞吐量,選擇這種模式時(shí),總的吞吐量為設(shè)置的target Throughput 乘以該線程的數(shù)量。例如該測(cè)試計(jì)劃總共開啟來的10個(gè)線程,每分鐘吞吐量為600(即每秒10個(gè)請(qǐng)求),那么總的吞吐量就為10個(gè)線程*10個(gè)請(qǐng)求,每秒的吞吐量為100。其他的選項(xiàng)分別問所有激活的線程組成或者線程組的組成,例如基于線程組則表明,該線程組的吞吐量控制為指定的數(shù)量。具體如下圖:
??關(guān)于吞吐量的理解,假設(shè)有一個(gè)場(chǎng)景,我想要測(cè)試一組數(shù)據(jù)維持1min,然后每秒的吞吐量控制為50TPS;對(duì)于這種場(chǎng)景,我進(jìn)行了一組測(cè)試,新建了個(gè)測(cè)試計(jì)劃,添加的一個(gè)線程組,配置的用戶數(shù)為1個(gè)(即線程數(shù)為1),然后添加一個(gè)Constant Throughput Timer,設(shè)置每分鐘的吞吐量為3000,即50TPS(每秒的請(qǐng)求數(shù)),然后進(jìn)行測(cè)試。雖然只使用了一個(gè)用戶或者說線程,但是依然可以模擬出每秒50個(gè)請(qǐng)求的場(chǎng)景,這個(gè)就是Constant Throghput Timer的作用。
??至于它和上面的Synchronizing Timer有什么區(qū)別?其實(shí)他們兩個(gè)使用的場(chǎng)景或者目標(biāo)是不一樣的,Synchronizing Timer控制的是為測(cè)試計(jì)劃或者線程組的所有線程設(shè)置一個(gè)閾值,只有線程到達(dá)了某個(gè)值才統(tǒng)一一起發(fā)送,這就像某個(gè)指定時(shí)刻像系統(tǒng)發(fā)起指定的請(qǐng)求。而Synchronizing Timer控制的是指定的線程或者線程組它們的吞吐量,通過指定吞吐量來進(jìn)行一定吞吐量對(duì)系統(tǒng)進(jìn)行持久性測(cè)試。
2.6 Assertions(斷言)
??斷言就是斷定測(cè)試結(jié)果的正確性,通過斷言可以根據(jù)我們知道的結(jié)果來判斷請(qǐng)求響應(yīng)是否正確。用于檢查測(cè)試中得到的響應(yīng)數(shù)據(jù)等是否符合預(yù)期,用以保證性能測(cè)試過程中的數(shù)據(jù)交互與預(yù)期一致。
2.6.1 Response Assertion
??JMeteer可以通過,右鍵【Test Plan或者 Thread Group】添加斷言,選擇【Add->Assertions->Response Assertion】,具體如下圖所示:
??添加完后,下面是響應(yīng)斷言的一些配置選項(xiàng),可以設(shè)置斷言應(yīng)用到那些請(qǐng)求,斷言的目標(biāo)對(duì)象是什么,例如針對(duì)"Text Respone"斷言等,還有添加斷言的期待值,具體如下圖:
2.6.2 JSON Assertion
??JMeteer可以通過,右鍵【Test Plan或者 Thread Group】添加斷言,選擇【Add->Assertions->Json Assertion】,具體如下圖所示:
??添加完后,下面是JSON斷言的一些配置選項(xiàng),JSON斷言主要是針對(duì)響應(yīng)的JSON數(shù)據(jù),可以通過$.符號(hào)來取JSON得值,然后與斷言的期望值匹配,進(jìn)而決定請(qǐng)求的響應(yīng)有沒達(dá)到了期望,具體如下圖:
??對(duì)于Jmeter的斷言來說,基本上是這樣進(jìn)行添加和配置。用于檢查測(cè)試中得到的響應(yīng)數(shù)據(jù)等是否符合預(yù)期,用以保證性能測(cè)試過程中的數(shù)據(jù)交互與預(yù)期一致,通過斷言可以幫助我們篩選正確的響應(yīng)。
3.運(yùn)行JMeter
3.1 GUI的JMeter運(yùn)行
??GUI的JMeter運(yùn)行就上面的圖示一般,運(yùn)行只需要點(diǎn)擊按鈕就好,如下圖:
??一般來說說,JMeter的GUI運(yùn)行方式,會(huì)比較好系統(tǒng)的資源,所以需要比較多的內(nèi)存,容易出現(xiàn)Out Of Menmory問題,用于實(shí)踐不是太長(zhǎng)的測(cè)試場(chǎng)景效果會(huì)比較好,否則可能會(huì)出現(xiàn)卡死的現(xiàn)象。幾個(gè)小時(shí)甚至十幾個(gè)小時(shí)的測(cè)試都可以采用GUI方式測(cè)試,但如果時(shí)持續(xù)好幾天甚至超長(zhǎng)時(shí)間,推薦使用命令運(yùn)行。
3.1 命令行的JMeter運(yùn)行(最佳實(shí)踐)
??命令行的運(yùn)行方式是官方推薦的方式,這種方式?jīng)]那沒好系統(tǒng)的資源,不用渲染GUI界面,可以長(zhǎng)時(shí)間穩(wěn)定的運(yùn)行,但是由于是命令行所以一些結(jié)果的分析沒那沒詳細(xì)和直接,需要使用圖形界面的工具解析測(cè)試的日志和結(jié)果得到詳細(xì)的分析結(jié)果。
??參考下面的表中的JMeter的一些常用的參數(shù)釋義:
| 命令參數(shù) | 命令參數(shù)釋義 |
| ------------ | ------------ |
| -n | 設(shè)置命令行模式,在非 GUI 模式下運(yùn)行 JMeter |
| -t | 指定JMX腳本路徑,參數(shù)為:JMX腳本路徑,如果非當(dāng)前目錄需要使用全路徑或者相對(duì)路徑 |
| -l | 指定結(jié)果文件路徑(jtl或者csv文件),參數(shù)為:結(jié)果文件路徑,如果不存在會(huì)自動(dòng)創(chuàng)建 |
| -j | 指定執(zhí)行日志路徑,參數(shù)為:日志路徑,如果路徑不存在,不會(huì)自動(dòng)創(chuàng)建,同事將日志輸出到控制臺(tái)即命令行。 |
| -g | 指定測(cè)試結(jié)果文件路徑。僅用于生成測(cè)試報(bào)表。參數(shù)為:csv結(jié)果文件 |
| -e | 設(shè)置測(cè)試完成后生成測(cè)試報(bào)表 |
| -o | 指定測(cè)試報(bào)表生成文件夾。文件夾必須為空或者不存在,參數(shù)為:報(bào)表文件夾路徑。 |
??命令行運(yùn)行測(cè)試計(jì)劃:
#windows方式(CMD需要進(jìn)入到JMeter的bin目錄下),Linux也是進(jìn)入到JMeter的bin目錄下 #1.普通的執(zhí)行測(cè)試 jmeter -n -t test.jmx #2.指定結(jié)果文件及日志路徑的測(cè)試 jmeter -n -t test.jmx -l report\testresult.csv -j reporttestog.log #3.特別注意如果使用SSH連接到Linux執(zhí)行命令,那么需要使用nohup和&來保證進(jìn)程在session關(guān)閉時(shí)不會(huì)退出,&表示測(cè)試程序會(huì)在后臺(tái)運(yùn)行。 nohup jmeter -n -t test.jmx & nohup jmeter -n -t test.jmx -l report\testresult.csv -j reporttestog.log &?? 針對(duì)生成的testresult.csv,可以使用GUI的JMeter創(chuàng)建Listener的聚合器等組件來對(duì)日志進(jìn)行詳細(xì)的分析,方便以圖形的方式展現(xiàn)測(cè)試的結(jié)果以及日志。
??停止測(cè)試計(jì)劃的命令:
#停止測(cè)試計(jì)劃的命令有兩種,推薦第一種。 #1.使用shutdown.sh(Linux)或者shutdown.cmd(widnows) ./shutdown.sh 或者 ./shutdown.cmd #2.使用stoptest.sh(Linux)或者stoptest.cmd(widnows) ./stoptest.sh 或者 ./stoptest.cmd??使用shutdown腳本停止測(cè)試,如果有的線程還沒運(yùn)行完畢也會(huì)等待它們執(zhí)行結(jié)束;如果使用stoptest腳本停止測(cè)試則直接結(jié)束測(cè)試不管是否還有線程還未執(zhí)行完畢。一般推薦shutdown的方式,除非卡住了的情況才是用stoptest方式。
4.參考文檔
?? http://jmeter.apache.org/
??https://www.cnblogs.com/fengpingfan/p/5586711.html
?
轉(zhuǎn)載于:https://www.cnblogs.com/linchuanye/p/10799056.html
總結(jié)
以上是生活随笔為你收集整理的JMeter性能测试的基础知识和个人理解的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Python语言的程序结构
- 下一篇: WPF动画之后属性值无法改变