之前有在自己建的測試群直播分享了一些性能測試的基礎內容,當時有人說希望有個實戰的分享,想了想某些東西屬於公司機密不方便直接直播分享,
這里就拿最近我做的一個性能測試實例來舉例子說說,理解為主。。。
先看看一個完美的性能測試流程是怎樣的,如下圖:
當然,實際工作中能實現這種完美的流程很難,下面挑重點的介紹。。。
一、獲取測試需求
大概上周三接到這樣一個性能測試需求,大概的業務邏輯如下圖:
簡單概括下業務邏輯,就是:發起一個拼團,其他人點擊活動進去,領券,然后領券時要驗證拼團的有效性,在買單用券時,先驗證是否是會員,如果不是,先注冊會員,再將券和會員綁定!
具體的性能指標是:驗證上圖4個場景中的接口,在響應時間為3S和5S時,服務器的TPS值(這屬於系統性能能力驗證的應用領域)。
測試的系統,是公司的微信會員系統,系統架構相對熟悉,這里不過多介紹。
二、測試計划和方案
所謂的測試計划,無非就是某人用多久時間用什么資源什么方法完成什么事情。
由於這次性能測試需求工作量不大,且時間足夠,所以就我一個人完成測試的大部分工作,當然,一部分需要開發協助。
測試方案,就是測試計划的補充和擴展。
比如這次性能測試,我預計用一周時間完成這些測試工作,設計用例、場景建模、准備測試數據、測試腳本開發、環境搭建等各需要多久時間,在哪一天甚至是上午還是下午完成這些工作。
三、執行前的准備工作
環境搭建:測試環境由於之前會員系統也進行過性能測試,測試環境搭建這一步工作量不大,開發很快就配置完成,所以這里不贅述。
場景建模:個人理解,就是考慮哪些場景下可能存在性能瓶頸,相應的設置對應的測試腳本和測試邏輯,以盡可能模擬生產環境(由於對業務蠻熟悉,這里也不贅述,需要提及的一點是:
一定要理解、熟悉系統業務,因為需求的產生,就是用戶+場景)。
測試數據准備:測試數據准備常用的有這兩種方式:將生產數據復制一份過來、開發腳本預埋造數據(但無論哪種,一定要注意數據隔離,防止數據污染)。
測試腳本開發:首先,需要從開發那里獲取開發接口文檔和數據庫表設計文檔。
然后,通過工具或者寫測試腳本調試接口,先保證接口可以成功調用(我用的工具是jmeter+MySQL)。
四、執行測試腳本
在保證接口可以成功調用之后,先進行單接口基准測試,即:對一個接口進行壓力測試,不斷加壓,直到響應時間達到或超過指標,觀察當前其並發數和TPS。
個人經驗是同樣的並發數,多執行幾次,得到一個平均值或穩定值(即TPS和TRT曲線相對穩定的值),並記錄下來。
如下圖:
記錄的目的,可以通過直觀的數據變化,得到單個接口的最大TPS和不同並發情況下的響應時間變化。
PS:記得前幾天從一本書上看到這樣一句話:80%的性能瓶頸可以通過分析TPS和TRT的數值變化得到(雖然有點片面,但也不失為一種方法)。
比如按照上圖記錄的數值變化來看,很明顯領券接口性能極差,這時候就可以告知開發,通過查看log、檢查代碼、SQL語句等方法來查詢原因(當然個人能力足夠的話,這些可以自己來做)。
五、監控調試
jmeter這個性能測試工具本身就用監聽器這個元件提供了一定的監聽數值報告元件,但畢竟開源工具,其本身的組件功能不夠強大,可以通過下載支持jmeter的增強型功能插件來進行監控。
jmeter插件下載地址:https://jmeter-plugins.org/
下載后可以解壓縮,將plugins-manager.jar放入jmeter安裝目錄lib/exe,然后重啟jmeter即可。
可以通過點擊下圖圈出來的按鈕檢驗是否成功安裝:
無論是對服務器資源使用率還是測試數據報表生成,甚至TPS、TRT等的監聽,該插件都提供了組件支持,具體的使用方法請自行尋找。。。
所謂的監控調試,就是一個不斷調整重復的過程,這個需要根據性能測試的目的,應用領域去判斷具體如何執行。。。
六、最終報告
根據上面的幾個步驟,得到測試結果,分析系統存在的瓶頸,然后采用各種方法提出解決方案或優化建議,最后對本次性能測試進行一個完整的總結,這樣,一次性能測試就完成了。
在整個過程中,費時較長一般是在測試數據准備和測試執行、監控調優階段。
最后吐槽一句:性能測試水太深,想潛水的做好准備,別稀里糊塗扎進來,太刺激。。。