干貨技術(shù),第一時間送達(dá)!
開課通知:重磅消息 | 2021年最新全棧測試開發(fā)技能實戰(zhàn)指南(第2期)
大家好,我是黎潘,來自重慶,狂師老師的全棧測開訓(xùn)練營中上一期的學(xué)員。
大多數(shù)測試人員在談到性能測試時,往往會倍感壓力。對于我來說更是如此,想做好性能測試需要龐大的知識體系
,不斷實踐所總結(jié)的經(jīng)驗教訓(xùn)更是彌足珍貴。而且每個人對性能測試的理解都有獨到的地方,此次有幸參加全棧測開訓(xùn)練營在狂師老師的指導(dǎo)下逐步揭開性能測試得神秘面紗,結(jié)合課堂學(xué)習(xí)及自身消化理解后的,歸納了一些性能測試的基礎(chǔ)知識,希望對大家理解性能測試有所幫助。
性能測試含義:系統(tǒng)在一個給定的環(huán)境和場景中的性能表現(xiàn)是否與預(yù)期目標(biāo)一致,評判系統(tǒng)是否存在性能缺陷,并根據(jù)測試結(jié)果識別性能瓶頸,改善系統(tǒng)性能的完整的過程。
介入時機(jī):通常是在功能測試完成之后,并且系統(tǒng)功能處于相對穩(wěn)定狀態(tài)。
客戶端:web端,PC端,移動端,小程序,每一個都是不同領(lǐng)域的性能測試,關(guān)注點都不盡相同。還包括一個服務(wù)端的性能測試,本篇也主要是以服務(wù)端的性能測試來展開的。
使用過程中更加關(guān)注響應(yīng)時間,穩(wěn)定性??偟脕碚f就是用戶體驗要好。
系統(tǒng)最大并發(fā),最大業(yè)務(wù)處理量,能支持多少用戶訪問,能否長時間提供服務(wù),服務(wù)器資源使用,數(shù)據(jù)庫資源使用,系統(tǒng)是否可以實現(xiàn)擴(kuò)展。總的來說,更加關(guān)注系統(tǒng)的穩(wěn)定性,資源利用率,可擴(kuò)展性,系統(tǒng)容量等。
架構(gòu)設(shè)計,數(shù)據(jù)庫設(shè)計,代碼設(shè)計,是否存在不合理的內(nèi)存使用和線程同步方式,以及資源競爭等,總的來說,更加關(guān)注系統(tǒng)架構(gòu),數(shù)據(jù)庫設(shè)計,設(shè)計與代碼實現(xiàn)等。
系統(tǒng)資源指標(biāo),業(yè)務(wù)性能指標(biāo),DB性能指標(biāo),系統(tǒng)穩(wěn)定性,支持最大并發(fā),性能拐點等,幾乎包括了上述所有人員的關(guān)注點。
并發(fā)用戶數(shù):并發(fā)用戶數(shù)取決于業(yè)務(wù)并發(fā)用戶數(shù)和用戶行為模式,也就是說實際使用的用戶并不是每種用戶行為都會對服務(wù)端產(chǎn)生壓力,通常是指同一批用戶同時執(zhí)行一個對后端服務(wù)產(chǎn)生壓力的操作行為。
響應(yīng)時間:響應(yīng)時間是系統(tǒng)最重要的性能指標(biāo),直觀的反映了系統(tǒng)的快慢。指的是用戶端發(fā)出請求到得到響應(yīng)的整個過程所經(jīng)歷的。
系統(tǒng)處理能力:系統(tǒng)處理能力是指系統(tǒng)在利用系統(tǒng)硬件平臺和軟件平臺進(jìn)行信息處理的能力,通常有以下幾個指標(biāo)衡量。
吞吐量:系統(tǒng)在單位時間內(nèi)處理請求的數(shù)量。
事務(wù)成功率:單位時間內(nèi)系統(tǒng)可以成功完成多少個定義的事務(wù)。
超時錯誤率:主要指事務(wù)由于超時或系統(tǒng)內(nèi)部其它錯誤導(dǎo)致失敗占總事務(wù)的比率。
CPU使用率:指用戶進(jìn)程與系統(tǒng)進(jìn)程消耗的CPU時間百分比。
內(nèi)存利用率:內(nèi)存利用率=(1-空閑內(nèi)存/總內(nèi)存大?。?100%。
磁盤I/O:磁盤吞吐量簡稱為 Disk Throughput,是指在無磁盤故障的情況下單位時間內(nèi)通過磁盤的數(shù)據(jù)量。
網(wǎng)絡(luò)帶寬:發(fā)送和接收字節(jié)的速率,包括幀字符在內(nèi)。
數(shù)據(jù)庫性能指標(biāo):sql語句,連接數(shù),讀寫速度,資源使用率等。
上述只是一些常見的指標(biāo),通常還包括一些其他中間件,以及整個鏈路所經(jīng)過的服務(wù)器指標(biāo)。
未達(dá)到系統(tǒng)瓶頸:隨著并發(fā)用戶數(shù)的增加,系統(tǒng)吞吐量會逐漸增加,此時響應(yīng)時間會較快。
達(dá)到系統(tǒng)瓶頸:隨著并發(fā)用戶數(shù)的增加,系統(tǒng)吞吐量不再會增加,此時響應(yīng)時間會開始變長。
超過系統(tǒng)瓶頸:隨著并發(fā)用戶數(shù)的增加,系統(tǒng)吞吐量出現(xiàn)下降,此時響應(yīng)時間會逐漸拉長,甚至無響應(yīng)。
后端性能測試:通過模擬一定的并發(fā)用戶量,獲取一系列需要的系統(tǒng),業(yè)務(wù)性能指標(biāo),來驗證是否滿足我們預(yù)期性能需求或者探索系統(tǒng)的容量和潛在的問題。
代碼級性能測試:在單元測試階段,針對代碼本身,例如通過多次執(zhí)行單元測試用例,獲取一些關(guān)鍵算法的性能指標(biāo),是否滿足需求。
壓力測試:系統(tǒng)在一定資源飽和的情況下,模擬一定用戶量,不斷對系統(tǒng)施壓,驗證系統(tǒng)處于壓力情況下的性能表現(xiàn),尋找系統(tǒng)的性能瓶頸點。
配置測試:觀察系統(tǒng)在不同配置下性能的表現(xiàn),了解不同環(huán)境配置對系統(tǒng)性能的影響程度。
并發(fā)測試:模擬多個用戶同一時間訪問一個系統(tǒng),模塊或數(shù)據(jù)記錄等其他并發(fā)操作,關(guān)注系統(tǒng)可能存在的性能瓶頸,如內(nèi)存泄漏,線程死鎖或資源競爭等問題。
可靠性測試:給系統(tǒng)施加一定的壓力,持續(xù)運(yùn)行一段時間,觀察系統(tǒng)能否穩(wěn)定運(yùn)行。
性能基準(zhǔn)測試:基于固定的硬件環(huán)境和部署架構(gòu)(比如專用的服務(wù)器、固定的專用網(wǎng)絡(luò)環(huán)境、固定大小的集群規(guī)模、相同的系統(tǒng)配置、相同的數(shù)據(jù)庫背景數(shù)據(jù)等),通過執(zhí)行固定的性能測試場景得到系統(tǒng)的性能測試報告,然后與上一版本發(fā)布時的指標(biāo)進(jìn)行對比,如果發(fā)現(xiàn)指標(biāo)有“惡化”的趨勢,就需要進(jìn)一步排查。
穩(wěn)定性測試:又稱可靠性測試,主要是通過長時間(7*24 小時)模擬被測系統(tǒng)的測試負(fù)載,來觀察系統(tǒng)在長期運(yùn)行過程中是否有潛在的問題。通過對系統(tǒng)指標(biāo)的監(jiān)控,穩(wěn)定性測試可以發(fā)現(xiàn)諸如內(nèi)存泄漏、資源非法占用等問題。
并發(fā)測試:是在高并發(fā)情況下驗證單一業(yè)務(wù)功能的正確性以及性能的測試手段。高并發(fā)測試一般使用思考時間為零的虛擬用戶腳本來發(fā)起具有“集合點”的測試。
容量規(guī)劃測試:是為了完成容量規(guī)劃而設(shè)計執(zhí)行的測試。容量規(guī)劃的主要目的是,解決當(dāng)系統(tǒng)負(fù)載將要達(dá)到極限處理能力時,我們應(yīng)該如何通過垂直擴(kuò)展(增加單機(jī)的硬件資源)和水平擴(kuò)展(增加集群中的機(jī)器數(shù)量)增加系統(tǒng)整體的負(fù)載處理能力的問題。
目前市面上比較常見的服務(wù)端性能測試少說也有幾十種,這里我們簡單的比較下常見的三種,即JMeter,locust,LoadRunner。
通過以上對比,大家結(jié)合自己公司的需求,選擇合適的性能測試工具。
Locust是使用Python語言編寫實現(xiàn)的開源性能測試工具,簡潔、輕量、高效,并發(fā)機(jī)制基于gevent協(xié)程,可以實現(xiàn)單機(jī)模擬生成較高的并發(fā)壓力。中文意為:蝗蟲,蝗蟲過境,寸草不生。
直接通過pip install locust
命令安裝。
安裝成功后可以輸入pip show locust
命令查看是否安裝成功,以及通過locust --help
查看幫助信息。
from locust import HttpUser, TaskSet, task
class WebsiteTasks(TaskSet):
# 任務(wù)啟動前置執(zhí)行
#def on_start(self):
self.login()
# self.client屬性使用Python request庫的所有方法,調(diào)用和使用方法和requests完全一致
#def login(self):
# self.client.post("/login", {"username": "mikezhou", "password": "123456"})
# 此腳本用不到提前登陸,只起個示例作用,運(yùn)行前注釋掉
@task(2) # 通過@task()裝飾的方法為一個事務(wù),方法的參數(shù)用于指定該行為的執(zhí)行權(quán)重,參數(shù)越大每次被虛擬用戶執(zhí)行的概率越高,默認(rèn)為1
def index(self):
self.client.get("/")
def about(self):
self.client.get("/about/")
class WebsiteUser(HttpUser):
# 被測系統(tǒng)的host,在終端中啟動locust時沒有指定--host參數(shù)時才會用到
host = "http://example.com"
# TaskSet類,該類定義用戶任務(wù)信息,必填。這里就是WebsiteTasks類名,因為該類繼承TaskSet
tasks = [WebsiteTasks]
# 每個用戶執(zhí)行兩個任務(wù)間隔時間的上下限(毫秒),具體數(shù)值在上下限中隨機(jī)取值,若不指定默認(rèn)間隔時間固定為1秒
min_wait = 3000
max_wait = 10000
locust腳本命令運(yùn)行
# 方法一:腳本調(diào)試無頭模式運(yùn)行
locust -f locustfile.py --headless -u 10 -r 1 -t 30s
# -f:指定文件
# -u:指定用戶量
# -r:每秒啟動用戶數(shù)
# -t:運(yùn)行時間
# --headless:開啟無頭模式,即不使用UI界面操作
# 方法二:指定IP和端口啟動,使用UI界面
locust -f locustfile.py --web-host 127.0.0.1 --web-port 8080
# 以上就是簡單的啟動locust腳本的方式,詳細(xì)可以查看官方文檔或者locust --help
由于本篇是對性能測試?yán)碚撝R的分享,想了解更多l(xiāng)ocust的高級使用方法,可以參考官方文檔。
注意: 后端性能測試工具是實現(xiàn)后端性能測試的技術(shù)手段,不能簡單地把使用后端性能測試工具等同于后端性能測試。一般是在測試腳本開發(fā)和測試執(zhí)行階段發(fā)揮作用。
對于我們初學(xué)性能測試時,往往會陷入一個誤區(qū),那就是單純的去學(xué)習(xí)性能測試工具,認(rèn)為學(xué)會了工具的使用,就掌握了性能測試。這其實是大錯特錯的,工具的學(xué)習(xí)只是其中的一個階段,而且是比較基礎(chǔ)的一個階段,在整個性能測試流程中,性能測試執(zhí)行策略,性能場景和分析才是重中之重,也是最難的部分。
性能測試的學(xué)習(xí)路徑可以分為五個階段:
日常工作中,被問及何時進(jìn)行性能測試時,往往很多人都是摸不著頭腦,大多數(shù)情況下都是被動接受領(lǐng)導(dǎo)或者開發(fā)給的任務(wù),才回去進(jìn)行性能測試,很少人會主動出擊,去思考在什么階段進(jìn)行性能測試,下面給出幾點建議,當(dāng)然大前提肯定是在功能測試之后,整個系統(tǒng)都是處于一種穩(wěn)定的狀態(tài)。
1. 測試負(fù)載組成
2. 負(fù)載策略
3. 資源監(jiān)控范圍定義
4. 終止方式
5. 負(fù)載產(chǎn)生規(guī)劃
性能測試方案是在正式進(jìn)行性能測試之前的工作,主要包括:
今天談到的性能測試知識,不過是九牛一毛。想要正真掌握性能測試還需要不斷的親身實踐,擴(kuò)大自己知識的廣度和深度,對于初識性能測試且沒有實際經(jīng)驗的我來說,這將是我以后學(xué)習(xí),并加以實踐的基石。
如果你覺得文章還不錯,幫忙 點贊、轉(zhuǎn)發(fā)、關(guān)注、留言 ,因為這將是我持續(xù)輸出更多優(yōu)質(zhì)文章的最強(qiáng)動力!