架構(gòu)升級(jí)的救星!流量回放自動(dòng)化測(cè)試的必備指南
Hello,大家好呀,我是小米,一個(gè)29歲的技術(shù)宅,今天要跟大家分享的是物聯(lián)網(wǎng)領(lǐng)域里的一個(gè)非常實(shí)用的技能——流量回放自動(dòng)化測(cè)試。
在日常的開(kāi)發(fā)和運(yùn)維過(guò)程中,系統(tǒng)升級(jí)和架構(gòu)改造是不可避免的,尤其是系統(tǒng)級(jí)重構(gòu)。對(duì)于開(kāi)發(fā)團(tuán)隊(duì)來(lái)說(shuō),每一次大的重構(gòu)后,測(cè)試回歸的工作量是相當(dāng)巨大的,動(dòng)輒就是以月為單位的工作量。如果你不小心走入了這個(gè)坑,想想那些龐大的測(cè)試用例、復(fù)雜的場(chǎng)景,光是想想就頭疼吧?!
系統(tǒng)重構(gòu)后的挑戰(zhàn)
我們常常遇到以下幾種場(chǎng)景:
- 場(chǎng)景1:讀服務(wù)基本是無(wú)狀態(tài)的查詢,狀態(tài)不會(huì)改變,簡(jiǎn)單、輕量,數(shù)據(jù)可以輕松地返回。
- 場(chǎng)景2:不管是架構(gòu)升級(jí)還是日常的功能需求,讀服務(wù)的外部接口格式一般不會(huì)變化,即輸入輸出的格式是保持不變的。
這種看似簡(jiǎn)單的場(chǎng)景卻是系統(tǒng)重構(gòu)中的難點(diǎn)之一。你會(huì)發(fā)現(xiàn),雖然數(shù)據(jù)本身沒(méi)有問(wèn)題,但是重構(gòu)后的邏輯往往藏有看不見(jiàn)的 Bug,而這些問(wèn)題通常是在生產(chǎn)環(huán)境下才能暴露。這就產(chǎn)生了一個(gè)問(wèn)題——如何在不影響線上服務(wù)的情況下進(jìn)行全面的自動(dòng)化測(cè)試?
兩種常見(jiàn)但難實(shí)現(xiàn)的應(yīng)對(duì)方案
很多公司在面對(duì)重構(gòu)時(shí),會(huì)提出兩種常見(jiàn)的應(yīng)對(duì)方案:
- 先不改造,等系統(tǒng)頂不住了再想辦法:這是一種“先拖著”的策略,問(wèn)題會(huì)累積到爆發(fā)點(diǎn),但很容易造成系統(tǒng)崩潰,得不償失。
- 暫停需求,全力進(jìn)行改造:雖然這種方法聽(tīng)起來(lái)比較理想,但在實(shí)際的工作場(chǎng)景中,業(yè)務(wù)需求永遠(yuǎn)不會(huì)停止,暫停需求意味著損失市場(chǎng)機(jī)會(huì)、延遲交付等問(wèn)題。
實(shí)際情況是:
無(wú)論哪種策略都很難實(shí)現(xiàn),既不能讓系統(tǒng)崩潰,又不可能完全停止業(yè)務(wù)需求,這就迫使我們需要找到更好的方式來(lái)應(yīng)對(duì)這個(gè)問(wèn)題。
日志收集與流量回放的應(yīng)對(duì)策略
這里,小米要介紹的一個(gè)非常實(shí)用的方案就是——基于流量回放的自動(dòng)化測(cè)試。這個(gè)方法的核心思想就是:日志收集和數(shù)據(jù)回放。
日志收集
首先,我們需要對(duì)用戶的真實(shí)請(qǐng)求進(jìn)行日志收集。日志的作用不僅僅是存儲(chǔ)信息,更重要的是,它可以用作回歸測(cè)試的用例。
如何實(shí)現(xiàn)日志收集呢?在Spring框架里,我們可以通過(guò)Interceptor,在Servlet里我們可以用Filter過(guò)濾器來(lái)實(shí)現(xiàn)。對(duì)于每個(gè)請(qǐng)求的入?yún)⒑统鰠?,我們都需要記錄下?lái),并通過(guò)消息隊(duì)列(MQ)發(fā)送到存儲(chǔ)中。
這里需要注意幾個(gè)問(wèn)題:
- 錯(cuò)峰處理:避免短時(shí)間內(nèi)大規(guī)模數(shù)據(jù)涌入帶來(lái)的性能問(wèn)題。
- 數(shù)據(jù)過(guò)濾與去重:避免冗余數(shù)據(jù)占用存儲(chǔ)空間,并保證數(shù)據(jù)的有效性。
數(shù)據(jù)回放
接下來(lái)就是關(guān)鍵的步驟——數(shù)據(jù)回放。通過(guò)日志收集的歷史請(qǐng)求數(shù)據(jù),我們可以對(duì)重構(gòu)后的系統(tǒng)進(jìn)行數(shù)據(jù)回放,模擬真實(shí)用戶的請(qǐng)求,從而進(jìn)行自動(dòng)化測(cè)試。
數(shù)據(jù)回放可以分為三種模式:
- 離線回放:僅調(diào)用新服務(wù),將新服務(wù)的返回結(jié)果與日志中的原始出參進(jìn)行比較,不直接影響線上系統(tǒng),但由于日志量大,對(duì)存儲(chǔ)的要求較高。
- 實(shí)時(shí)回放:同時(shí)調(diào)用線上系統(tǒng)和新系統(tǒng)進(jìn)行請(qǐng)求,實(shí)時(shí)對(duì)比它們的返回結(jié)果。缺點(diǎn)是對(duì)線上系統(tǒng)有一定的性能影響,適合在系統(tǒng)壓力較小時(shí)進(jìn)行。
- 并行回放:新版本不直接上線,而是以一定概率在調(diào)用老版本接口時(shí)并行回放新版本接口,周期較長(zhǎng),但影響較小,適合在系統(tǒng)穩(wěn)定上線前進(jìn)行。
差異對(duì)比與 Bug 定位
數(shù)據(jù)回放的結(jié)果如何?最終我們關(guān)心的當(dāng)然是能不能找到重構(gòu)后的 Bug!通過(guò)差異對(duì)比,我們可以自動(dòng)發(fā)現(xiàn)那些與預(yù)期不一致的用例。
在這個(gè)過(guò)程中,我們可以通過(guò)文本對(duì)比的方式來(lái)快速發(fā)現(xiàn)問(wèn)題。由于接口的輸入輸出格式保持不變,我們只需要對(duì)比返回的具體數(shù)據(jù)是否存在差異。比如,有些字段的值可能在新舊系統(tǒng)中表現(xiàn)不同,這就可能是潛在的 Bug。我們可以將這些差異標(biāo)記出來(lái),交給開(kāi)發(fā)人員進(jìn)行進(jìn)一步定位與修復(fù)。
實(shí)踐中的技巧
在實(shí)際實(shí)施流量回放的過(guò)程中,小米也積累了一些小技巧,來(lái)幫助大家更好地使用這個(gè)工具。
- 日志壓縮與存儲(chǔ)優(yōu)化:流量回放所產(chǎn)生的日志數(shù)據(jù)量非常龐大,因此需要考慮日志的壓縮與存儲(chǔ)優(yōu)化策略。我們可以對(duì)收集到的日志進(jìn)行壓縮處理,或者定期清理不再需要的舊日志,節(jié)省存儲(chǔ)空間。自動(dòng)化工具鏈的集成:將流量回放與現(xiàn)有的自動(dòng)化工具鏈進(jìn)行集成,可以大幅提升測(cè)試效率。比如結(jié)合 Jenkins 等 CI/CD 工具,自動(dòng)觸發(fā)回放測(cè)試,自動(dòng)記錄差異并生成報(bào)告。灰度發(fā)布與流量回放結(jié)合:在灰度發(fā)布時(shí),可以使用流量回放進(jìn)行新舊系統(tǒng)的并行測(cè)試,從而提前發(fā)現(xiàn)潛在問(wèn)題,確保新版本的穩(wěn)定性。
流量回放的優(yōu)勢(shì)
總的來(lái)說(shuō),流量回放為系統(tǒng)重構(gòu)后的回歸測(cè)試提供了一種自動(dòng)化、高效、低干擾的方案。相比傳統(tǒng)的手動(dòng)測(cè)試,流量回放有幾個(gè)明顯的優(yōu)勢(shì):
- 真實(shí)用戶請(qǐng)求:基于真實(shí)的用戶請(qǐng)求日志,確保測(cè)試場(chǎng)景覆蓋全面。
- 自動(dòng)化回歸測(cè)試:減少人工測(cè)試的工作量,提高效率。
- 快速發(fā)現(xiàn)問(wèn)題:通過(guò)差異對(duì)比,能夠及時(shí)發(fā)現(xiàn)并定位 Bug。
- 低風(fēng)險(xiǎn):新版本并不直接上線,避免了對(duì)線上業(yè)務(wù)的干擾。
END
流量回放自動(dòng)化測(cè)試為我們?cè)趹?yīng)對(duì)系統(tǒng)重構(gòu)時(shí),提供了一種既能滿足業(yè)務(wù)需求,又能保障系統(tǒng)穩(wěn)定的解決方案。通過(guò)日志收集、數(shù)據(jù)回放和差異對(duì)比,開(kāi)發(fā)團(tuán)隊(duì)能夠快速定位問(wèn)題,減少回歸測(cè)試的工作量,大幅提高系統(tǒng)升級(jí)的效率。