1.什么是性能
性能測試,一種非功能測試技術(shù),用于根據(jù)不同工作負載下的響應(yīng)性和穩(wěn)定性確定系統(tǒng)參數(shù)。 性能測試度量系統(tǒng)的質(zhì)量屬性,如響應(yīng)速度、可伸縮性、可靠性和資源使用情況。
性能測試跟功能測試的區(qū)別
性能測試 | 功能測試 |
---|---|
驗證系統(tǒng)在不同負載下的表現(xiàn) | 驗證是否符合產(chǎn)品需求定義的功能 |
通過自動化功能實現(xiàn) | 可以通過人工或自動化測試 |
需要模擬多用戶同時使用情況 | 一個用戶操作 |
需要與客戶、測試、開發(fā)、BDA和運維team合作 | 需要與客戶、測試和開發(fā)合作 |
測試環(huán)境需要接近生產(chǎn)環(huán)境的軟硬件配置 | 不需要一定接近生產(chǎn)環(huán)境 |
不同角色關(guān)注的性能是不一樣的,進行性能測試就需要在各角色其關(guān)注的維度進行分析測試。
用戶視角:
操作的響應(yīng)速度,頁面數(shù)據(jù)的加載速度,提交數(shù)據(jù)的響應(yīng),是否存在崩潰。
老板視角:
主要關(guān)心產(chǎn)品的成本跟收入,用戶的滿意度。
運維視角:
關(guān)心資源的(如CPU、內(nèi)存、DB)利用率,服務(wù)的穩(wěn)定性(7*24H),可拓展性,系統(tǒng)的容量是多少。
開發(fā)視角:
關(guān)心架構(gòu)的設(shè)計與業(yè)務(wù)是否匹配(技術(shù)選型,如使用哪種DB、緩存、消息組件等),數(shù)據(jù)庫的設(shè)計,代碼(邏輯性能問題,內(nèi)存是否是否合理,線程同步操作是否合理,是否存在不合理資源競爭,是否有更高效的算法或數(shù)據(jù)結(jié)構(gòu))
測試視角:
結(jié)合上面角色視角的需求,具體化為各種類型跟各種指標。如業(yè)務(wù)性能指標(QPS,響應(yīng)時間,成功率等),資源指標,支持最大并發(fā),最優(yōu)并發(fā),穩(wěn)定性等。
2.性能測試的好處跟目的
驗證Feature是否符合性能要求,測量響應(yīng)速度,提高用戶滿意度等。這些都會直接或間接地影響公司產(chǎn)品的收入。
性能測試的最終目的是為了最大限度的滿足用戶的需求,通常要達成以下目標:
- 性能評估:測試中評估系統(tǒng)的QPS、響應(yīng)時間、成功率等
- 尋找系統(tǒng)瓶頸,進行系統(tǒng)調(diào)優(yōu)
- 檢測軟件中的問題
- 驗證穩(wěn)定性和可靠性
3. 常見性能問題
- 長加載時間
- 長響應(yīng)時間
- 可拓展性差
- 性能瓶頸
記得工作中遇見過高流量的系統(tǒng)直接被壓垮,CPU內(nèi)存資源不夠,DB連接池爆滿,出現(xiàn)慢查詢導致整個系統(tǒng)的響應(yīng)時間變長,Redis緩存穿透把DB壓垮,業(yè)務(wù)暴增消息消費系統(tǒng)沒有及時處理消息等各種花樣的性能問題。
4.性能測試的組成
以中小型電商網(wǎng)站為例,性能基本組成會經(jīng)過多個路徑,包括
- 客戶端(Web、移動端、小程序)性能
- DNS性能
- 負載均衡服務(wù)性能
- Nginx集群性能、折損率
- CDN緩存性能(回源率、穿透率)
- 應(yīng)用服務(wù)器性能
- DB性能(Mysql/Redis/Memcache)
5. 關(guān)注指標
測試關(guān)注指標一般可分為業(yè)務(wù)指標、資源指標、應(yīng)用指標、前端指標。
- 業(yè)務(wù)指標:如并發(fā)用戶數(shù)、TPS(系統(tǒng)每秒處理事務(wù)數(shù))、成功率、響應(yīng)時間。
- 資源指標:如CPU資源利用率、內(nèi)存利用率、I/O、內(nèi)核參數(shù)(信號量、打開文件數(shù))等。
- 應(yīng)用指標:如空閑線程數(shù)、數(shù)據(jù)庫連接數(shù)、GC/FULL GC次數(shù)、函數(shù)耗時等。
- 前端指標:如頁面加載時間、網(wǎng)絡(luò)時間(DNS、連接時間、傳輸時間等)。
這些指標一般都會使用一些有圖形界面的監(jiān)控工具搭配使用,可以清晰直觀地查看具體數(shù)值及趨勢變化。
6. 性能測試類型
性能的壓力模型
為得到性能關(guān)注的指標,基本分為以下性能測試類型:
容量測試(Capacity testing):容量測試(或者叫體積測試,Volume Testing)是用于確定一個單位容量能夠支持的最大負載。一般如新系統(tǒng)上線會做容量測試,評估系統(tǒng)能承受多大壓力。
負載測試(Load Testing):負載測試用于驗證被測試系統(tǒng)或者程序是否可以處理預期的負載流量,并驗證正常和峰值負載條件下的系統(tǒng)和程序行為。負載測試的定義有時太廣泛和模糊,很多其他測試都可以看作是負載測試的一種,比如容量測試,也是一種負載測試。
可擴展性測試(Scalability Testing):可擴展性(或者叫可伸縮性)測試用于確定一個程序和系統(tǒng)的非功能性特征能不能在變化的環(huán)境里合理擴展。這里的環(huán)境變化包括系統(tǒng)環(huán)境的變化、負載量的大小、請求的多樣性、數(shù)據(jù)量的大小等。
尖峰測試(Spike Testing):尖峰測試用于確定系統(tǒng)在負載(比如用戶請求數(shù))突然變化時的系統(tǒng)行為。這種測試是通過突然增加或減少由用戶產(chǎn)生的負載來觀察系統(tǒng)的行為。測試的目標是確定性能在這樣的場景下是否會受損,系統(tǒng)是否會失敗,或者是否能夠處理負載的顯著變化。尖峰測試的核心是負載變化的突然性,所以也算是一種壓力測試。或如常見的電商秒殺活動上線前也會做壓力測試及尖峰測試來評估系統(tǒng)的行為。
浸泡測試(Soak Testing):浸泡測試有時也叫耐力測試(Endurance Testing 或者耐久測試),是一種非功能性測試。耐力測試是長時間測試具有預期負載量的系統(tǒng),以驗證系統(tǒng)的行為是否正常。
壓力測試(Stress Testing): 壓力測試也是一種負載測試,不過它偏重的是在負載增加到超過系統(tǒng)設(shè)計預期后觀察和驗證系統(tǒng)的行為。
還有其他如瓶頸測試(Bottleneck Testing),斷點測試(Breakpoint Testing)、基準測試(Benchmark Testing)等。
7. 常用性能測試工具
- ApacheBench: 一個輕量級工具。主要用于 HTTP 協(xié)議的性能測試。非常簡單快捷。不支持場景化測試。
- JMeter : Apache提供的完全開源的性能測試工具,用于模擬服務(wù)器,服務(wù)器組,網(wǎng)絡(luò)或?qū)ο笊系姆敝刎撦d,以測試其強度或分析不同負載類型下的總體性能,支持分布式運行。因為開源免費,使用跟熟悉的人較多,較多公司都會選擇Jmeter。
- LoadRunner: 是一個性能測試工具,但是是閉源收費的軟件,且授權(quán)費用高昂。使用也較為復雜,而且該工具體積比較大。
- Locust : 易于使用的分布式用戶負載測試工具。它旨在對網(wǎng)站進行負載測試,并確定系統(tǒng)可以處理多少個并發(fā)用戶。非常易用。很方便地基于Python進行腳本擴展和業(yè)務(wù)請求實現(xiàn)。完全基于事件驅(qū)動,所以不受進程和線程的限制,可以支持發(fā)起更高的并發(fā)數(shù)請求。可以分布式發(fā)起并發(fā)請求。
- nGrinder: 是一個用于在多臺機器上運行用 jython(在 JVM 上運行的 python)編寫的測試腳本的應(yīng)用程序。它的內(nèi)部引擎是基于 Grinder。nGrinder 分別用 controler 和 agent 將 Grinder 的 controler 和 agent 包裝起來,并擴展了支持多個并發(fā)測試的特性。nGrinder是一個壓力測試的平臺,使您可以同時執(zhí)行腳本創(chuàng)建,測試執(zhí)行,監(jiān)視和結(jié)果報告生成器。提供了進行壓力測試的簡便方法。本人之前所在的公司就選擇了nGrinder作為壓測功能。
具體選擇哪個作為壓測的工具可以結(jié)合具體業(yè)務(wù)需求跟壓測人員掌握的工具程度進行評估。
8. 性能測試流程
關(guān)鍵步驟:
- 性能需求分析:性能測試需要跟運營、產(chǎn)品、開發(fā)、運維等相關(guān)人員進行溝通,進行項目分析,確認業(yè)務(wù)需求對應(yīng)的測試目標,如是進行容量測試,還是穩(wěn)定測試,還是尖峰測試,然后建立性能測試數(shù)據(jù)模型,并將其轉(zhuǎn)化為可衡量的具體性能指標。
- 性能測試case設(shè)計:根據(jù)業(yè)務(wù)場景確定流量模型(流量模型要盡可能的接近生產(chǎn),如我之前所在的電商公司,在大促的時候商品相關(guān)的系統(tǒng)各個域的流量占比,各個域的各個接口流量分布等均需要參考歷史數(shù)據(jù),結(jié)合運營規(guī)劃等來決定),編寫腳本,準備測試環(huán)境,監(jiān)控工具,構(gòu)造測試數(shù)據(jù),環(huán)境調(diào)試等。
- 執(zhí)行性能測試:包括執(zhí)行測試用例模型,以及監(jiān)控測試過程。
- 結(jié)果分析與調(diào)優(yōu): 對性能測試結(jié)果的各個性能指標進行分析并完成性能測試報告,測試報告一般都有一些模板這個可以參考網(wǎng)上的例子。
9. 小結(jié)
性能測試是一項工程,從中涉及到性能的需求分析,性能測試的理論基礎(chǔ),工具的使用,系統(tǒng)網(wǎng)絡(luò)設(shè)備軟硬件的分析,涉及的技術(shù)面寬廣以及需要多方溝通協(xié)助,路漫漫其修遠兮。
參考文章:
https://blog.csdn.net/zhanglong_4444/article/details/105613843
http://www.lxweimin.com/p/8ba22102381d
https://zhuanlan.zhihu.com/p/94064601