訂單流量錄制與回放探索實(shí)踐
1、背景介紹
1.1 得物pandora介紹
什么是流量錄制回放?流量錄制回放是應(yīng)用端通過(guò)掛載注入錄制器探針自動(dòng)注冊(cè)到服務(wù)端形成錄制流量回流,將所有外部調(diào)用依賴的響應(yīng)內(nèi)容(如數(shù)據(jù)庫(kù)、分布式緩存、外部服務(wù)響應(yīng)等)進(jìn)行完整記錄。由平臺(tái)向回放器分發(fā)流量回放指令。其核心價(jià)值是通過(guò)直接錄制生產(chǎn)的真實(shí)數(shù)據(jù),將生產(chǎn)真實(shí)數(shù)據(jù)轉(zhuǎn)化成可復(fù)用、可執(zhí)行的流量,快速地在測(cè)試環(huán)境中進(jìn)行回放比對(duì)接口返回值和中間鏈路的驗(yàn)證。
得物版本的流量錄制回放平臺(tái)pandora在官方開(kāi)源版本上進(jìn)行了很大的拓展,支持了很多官方版本不支持的子調(diào)用和入口調(diào)用。此外,平臺(tái)還對(duì)得物的中間件進(jìn)行了諸多適配工作,避免了大量的回放失敗噪音。
1.2 市場(chǎng)工具對(duì)比
目前市場(chǎng)上已知的流量錄制回放平臺(tái)大部分都是在Jvm-Sandbox-Repeater基礎(chǔ)上進(jìn)行二次開(kāi)發(fā)和改造,并且多數(shù)都是只支持Java語(yǔ)言。核心原理也都是通過(guò)錄制線上真實(shí)流量然后在測(cè)試環(huán)境進(jìn)行回放,驗(yàn)證代碼邏輯正確性。
2、實(shí)踐落地
2.1 協(xié)作模式
在具體的實(shí)施層面,目前采用的是業(yè)務(wù)測(cè)試,平臺(tái)研發(fā),業(yè)務(wù)研發(fā)三方協(xié)同的模式。任務(wù)分拆如下圖所示。
得物流量回放實(shí)施模式
2.2 階段應(yīng)用
流量回放在各階段的理想實(shí)施應(yīng)用:
- 提測(cè)階段卡點(diǎn):聚焦核心場(chǎng)景,低成本驗(yàn)證每次提測(cè)對(duì)于核心場(chǎng)景的影響;
- 測(cè)試回歸階段卡點(diǎn):全量場(chǎng)景,重點(diǎn)追求覆蓋場(chǎng)景全面性,驗(yàn)證新功能對(duì)歷史功能的影響;
- 預(yù)發(fā)環(huán)境回歸:目前預(yù)發(fā)跟生產(chǎn)同庫(kù),未來(lái)會(huì)推動(dòng)落地基于預(yù)發(fā)&生產(chǎn)環(huán)境的流量回放,盡可能拉近錄制時(shí)環(huán)境和回放時(shí)環(huán)境的仿真差異,從而降低回放階段的噪音影響;
在得物的整體QA體系中,流量回放短期聚焦在回歸兜底保障上。
得物迭代&項(xiàng)目時(shí)間軸
2.3 實(shí)踐落地
流量回放的開(kāi)展自發(fā)起后,在本域由探索嘗試階段逐漸過(guò)渡到應(yīng)用場(chǎng)景拓展階段。
訂單流量回放模式
在經(jīng)過(guò)一段時(shí)間的探索,摸索出了一套適用于本域迭代的模式。
Part1、嘗試接入
團(tuán)隊(duì)開(kāi)始開(kāi)展流量回放的專項(xiàng)之后,通過(guò)調(diào)研,選取了40%的服務(wù)優(yōu)先接入。
1. 階段目標(biāo)
- 完成30%P0應(yīng)用top10 接口100%場(chǎng)景覆蓋,形成迭代落地質(zhì)量卡點(diǎn),完成適用性和提效分析;
- 增加訂單域流量回放人員投入,落地質(zhì)量卡點(diǎn),覆蓋5%回歸場(chǎng)景;
2. 實(shí)施方案
- 調(diào)研應(yīng)用的特性,嘗試接入流量錄制回放;
- 梳理服務(wù)的P0接口及用例,配置對(duì)應(yīng)的接口及用例標(biāo)簽;
- 用例自動(dòng)沉淀到用例集后,在回歸階段嘗試進(jìn)行流量回放。
3. 收益成果
- 完成30%應(yīng)用形成落地質(zhì)量卡點(diǎn),落地15%用例回歸場(chǎng)景,驗(yàn)證方案可行性和易用性,摸索研發(fā)測(cè)試協(xié)同機(jī)制。
Part2、探索升級(jí)
上一階段花費(fèi)大量的時(shí)間梳理接口配置標(biāo)簽,用例沉淀速度緩慢,并且收益與投入不成正比,因此調(diào)整了策略,應(yīng)用智能化分析進(jìn)行提效,快速沉淀用例,擴(kuò)大用例量及覆蓋的接口量。45%業(yè)務(wù)應(yīng)用接入并均實(shí)現(xiàn)強(qiáng)卡點(diǎn)落地,配合平臺(tái)側(cè)優(yōu)化,解決大部分組件適配和使用問(wèn)題,迭代應(yīng)用流程以及應(yīng)用指標(biāo)分析機(jī)制基本跑順。
1. 階段目標(biāo)
- 應(yīng)用:接入的應(yīng)用交由對(duì)應(yīng)的服務(wù)負(fù)責(zé)人,負(fù)責(zé)對(duì)應(yīng)服務(wù)的接口維護(hù)運(yùn)營(yíng)及沉淀、排錯(cuò)分析;
- 用例:嘗試探索新的用例沉淀方式,進(jìn)一步擴(kuò)大用例量,增加覆蓋的接口量;
- 排錯(cuò):根據(jù)服務(wù)的用例量以及接入的時(shí)間,提升測(cè)試排錯(cuò)能力,階段2結(jié)束測(cè)開(kāi)排錯(cuò)達(dá)到五五開(kāi);
2.收益成果
- 從開(kāi)始試點(diǎn)到應(yīng)用卡點(diǎn),沉淀的用例量也在應(yīng)用熱點(diǎn)流量方案之后開(kāi)始了升級(jí)之路。接入的應(yīng)用數(shù)也超過(guò)原定目標(biāo)達(dá)到50%且均實(shí)現(xiàn)強(qiáng)卡點(diǎn)落地。
- 應(yīng)用智能化分析策略提效效果明顯,沉淀的用例數(shù)成指數(shù)型增長(zhǎng),接入應(yīng)用的P0接口覆蓋率達(dá)到100%。
- 測(cè)試排錯(cuò)能力提升,每迭代流量回放發(fā)現(xiàn)的bug數(shù)也在增加,新方案的可實(shí)施性和可推廣性基本符合預(yù)期。
Part3、專項(xiàng)提速
在沉淀的用例case大量的增加、用例沉淀速度提效明顯的前提下,流量回放在迭代的應(yīng)用中發(fā)現(xiàn)更多的缺陷,規(guī)劃擴(kuò)大接入的應(yīng)用以及覆蓋的接口范圍。
1. 階段目標(biāo)
- 應(yīng)用接入:新增40%應(yīng)用接入,接入應(yīng)用占比合計(jì)90%;
- 排錯(cuò):提升測(cè)試的排錯(cuò)能力,新版本排錯(cuò)由平臺(tái)研發(fā)轉(zhuǎn)交業(yè)務(wù)研發(fā),測(cè)試開(kāi)發(fā)排錯(cuò)占比五五開(kāi);
- 用例量:加速沉淀用例量,擴(kuò)大覆蓋的范圍,至少65%的應(yīng)用完成全量用例沉淀;
- 卡點(diǎn):接入應(yīng)用達(dá)到100%卡點(diǎn),提升排錯(cuò)速度,部分應(yīng)用由生產(chǎn)卡點(diǎn)轉(zhuǎn)為預(yù)發(fā)卡點(diǎn);
- 全域接入應(yīng)用接口維度覆蓋率98%以上,接口配置完善度98%以上,全量用例路徑覆蓋率60%以上。
2. 收益成果
隨著應(yīng)用的接入,沉淀的用例量也在擴(kuò)大,發(fā)現(xiàn)的問(wèn)題數(shù)也在增多。同時(shí)也增加覆蓋率的指標(biāo)來(lái)衡量流量回放用例覆蓋的代碼占總代碼行的比值。隨著對(duì)覆蓋率的關(guān)注,平臺(tái)采樣策略也進(jìn)行了一個(gè)調(diào)整,刪除所有歷史沉淀用例,僅沉淀新策略實(shí)施之后錄制的流量。
- 流量回放接入90%應(yīng)用,擴(kuò)大應(yīng)用接入和case沉淀,超預(yù)期達(dá)成目標(biāo),沉淀應(yīng)用Case量是原計(jì)劃的3倍,此階段累計(jì)發(fā)現(xiàn)缺陷數(shù)占全域流量回放發(fā)現(xiàn)的bug數(shù)的45%,充分驗(yàn)證了落地策略的有效性;
- 從階段3本域發(fā)現(xiàn)的缺陷統(tǒng)計(jì)來(lái)看,其中回歸類BUG占比38%,發(fā)現(xiàn)線上自有/隱藏問(wèn)題占比8%,迭代過(guò)程中代碼問(wèn)題(日志報(bào)錯(cuò))和代碼規(guī)范類問(wèn)題占比46%,性能問(wèn)題占比8%;
- 接口配置完善度100%;接口維度覆蓋率96.49%;全量用例路徑覆蓋率79.32%,全量代碼覆蓋率平均39.8%;
3、總結(jié)分析
3.1 問(wèn)題歸類分析
3.1.1 累計(jì)發(fā)現(xiàn)的缺陷分類:
3.1.2 累計(jì)發(fā)現(xiàn)的缺陷來(lái)源分類:
3.1.3 典型案例:
- 回放時(shí)系統(tǒng)異常,排查之后定位為NPE類問(wèn)題,如:
- response返回的業(yè)務(wù)字段diff對(duì)比不一致,如:
通過(guò)對(duì)缺陷以及缺陷來(lái)源的歸類不難看出:
- 流量回放發(fā)現(xiàn)攔截的問(wèn)題近一半都是會(huì)引起生產(chǎn)業(yè)務(wù)報(bào)錯(cuò)的,其中包括像金額不對(duì)涉及資損的問(wèn)題以及字段傳值不對(duì)、枚舉類型取錯(cuò)等缺陷;作為生產(chǎn)發(fā)布前的最后階段的防線之一,充分展現(xiàn)了流量錄制回放作為對(duì)測(cè)試回歸的兜底能力的補(bǔ)充手段的重要性。
- 45%左右的問(wèn)題是手工測(cè)試過(guò)程中難以發(fā)現(xiàn)隱藏比較深的代碼層面問(wèn)題,例如NPE報(bào)錯(cuò)、入?yún)⒊鰠⒆侄挝葱蛄谢龋@些問(wèn)題如果僅僅通過(guò)前端測(cè)試或接口測(cè)試不看日志不一一對(duì)比所有字段勢(shì)必會(huì)將問(wèn)題帶到生產(chǎn)環(huán)境,最終影響生產(chǎn)環(huán)境的穩(wěn)定性。
- 6%左右的性能問(wèn)題,例如存在重復(fù)子調(diào)用,影響接口RT,如果不在生產(chǎn)發(fā)布前發(fā)現(xiàn)解決,勢(shì)必給用戶體驗(yàn)帶來(lái)一定的挑戰(zhàn)。
- 從缺陷的來(lái)源上看,發(fā)現(xiàn)的缺陷來(lái)源還是集中在項(xiàng)目迭代需求和技術(shù)優(yōu)化上,充分驗(yàn)證了流量回放整體提速后的有效性以及對(duì)測(cè)試覆蓋兜底能力的補(bǔ)充。
- 通過(guò)對(duì)失敗用例的排錯(cuò)分析經(jīng)驗(yàn)的累積和分享培訓(xùn),參與專項(xiàng)的測(cè)試團(tuán)隊(duì)的整體技術(shù)水平通過(guò)流量回放專項(xiàng)提速在技術(shù)氛圍上有明顯提升,培養(yǎng)了多位同學(xué)對(duì)自身負(fù)責(zé)模塊的實(shí)現(xiàn)的代碼走讀能力,以及深挖缺陷的code diff能力。
3.2 適用性分析
- 適用場(chǎng)景
適用于返回?cái)?shù)據(jù)量大、業(yè)務(wù)流量也很大,以及讀取業(yè)務(wù)占比大的場(chǎng)景,如ToC產(chǎn)品。
- 不適用場(chǎng)景
- 掛載沙箱后開(kāi)啟錄制會(huì)導(dǎo)致RT瞬間飆高,影響生產(chǎn)服務(wù)的穩(wěn)定性。
- 異步場(chǎng)景目前流量回放平臺(tái)不支持。
- 需要驗(yàn)證數(shù)據(jù)庫(kù)的落地,節(jié)點(diǎn)的流轉(zhuǎn)的鏈路測(cè)試,需要自動(dòng)化。
先投入能迅速形成能卡點(diǎn)有收益的應(yīng)用(迭代代碼變更相對(duì)少,分層結(jié)構(gòu)比較好,異步少,寫操作少),把看得到的使用效果做出來(lái)。
流量回放能否完全替代手工回歸以及自動(dòng)化?
目前來(lái)看,答案是否定的。首先,從沙箱掛載到接口配置再到流量錄制這一套流程下來(lái),也需要較長(zhǎng)的時(shí)間才能達(dá)到較高的用例覆蓋,對(duì)于一些邊界極端場(chǎng)景還是需要手工設(shè)計(jì);其次,流量錄制回放是后置的回歸兜底,更側(cè)重于對(duì)歷史邏輯的回歸驗(yàn)證。
1、接口覆蓋不全。迭代需求新接口,未配置關(guān)聯(lián)錄制,不在流量回放的錄制范圍。
2、全量代碼覆蓋率不高。接口已經(jīng)配置覆蓋了,但是由于采樣比例小場(chǎng)景極端等原因,接口的分支場(chǎng)景并沒(méi)有錄制到未被覆蓋。
3、排錯(cuò)能力的高低影響。接口覆蓋了,排錯(cuò)的時(shí)候由于新加了子調(diào)用,導(dǎo)致失敗的用例在排錯(cuò)的時(shí)候容易被簡(jiǎn)單定義為代碼變更。
4、平臺(tái)問(wèn)題。diff比對(duì)異常,顯示回放成功,異步線程的回放是一個(gè)待攻克的難點(diǎn)。
3.3 面臨的挑戰(zhàn)
3.3.1 排錯(cuò)的效率
錄制流量后對(duì)流量進(jìn)行回放,發(fā)現(xiàn)回放結(jié)果比對(duì)失敗的很多。經(jīng)過(guò)對(duì)失敗原因的排查與分析,有些是代碼bug導(dǎo)致的失敗,但更多的失敗不一定是代碼bug,常見(jiàn)噪音主要包含:
- 代碼修改,新增或刪除了子調(diào)用,導(dǎo)致mock失敗
- 平臺(tái)不支持的子調(diào)用,導(dǎo)致失敗
- 時(shí)間戳相關(guān)的子調(diào)用,diff不一致
- 子調(diào)用中使用隨機(jī)參數(shù)相關(guān),導(dǎo)致mock匹配不上
- repeater代碼自身缺陷
- 業(yè)務(wù)自增數(shù)據(jù)差異
- 配置中心數(shù)據(jù)不一致
- 返回?zé)o序元素集合,造成結(jié)果對(duì)比誤差
失敗原因很多,真正有效的失敗數(shù)很少。如此一來(lái),每次回放失敗的排查成本就非常高。給業(yè)務(wù)的推進(jìn)造成了巨大的阻礙。
原版repeater上報(bào)的信息不夠豐富,很多情況需要看日志才能排查。目前也沒(méi)有公開(kāi)成熟的參考的方案。平臺(tái)也進(jìn)行了一些初步的探索,對(duì)回放失敗的場(chǎng)景自動(dòng)進(jìn)行歸類,上報(bào)更豐富的數(shù)據(jù)信息提供排查指引,幫助排查人員聚焦定位問(wèn)題。同時(shí)平臺(tái)也針對(duì)一些噪音進(jìn)行自動(dòng)識(shí)別并在回放時(shí)自動(dòng)過(guò)濾降噪。
回放失敗分類 | 界面提示 | 界面展示信息 |
子調(diào)用多調(diào)用 | 錯(cuò)誤 | 得物鏈路traceId, 多調(diào)用的參數(shù),調(diào)用堆棧,是否參數(shù)不匹配,是否完全多出來(lái)一次調(diào)用,等等 |
子調(diào)用少調(diào)用+回放時(shí)捕獲到異常 | 錯(cuò)誤 | 得物鏈路traceId, 回放軌跡,異常堆棧,參數(shù) |
子調(diào)用少調(diào)用 | 錯(cuò)誤 | 得物鏈路traceId, 回放軌跡 |
入口返回diff有差異 | 錯(cuò)誤 | 得物鏈路traceId, 返回?cái)?shù)據(jù)的diff比對(duì) |
僅回放時(shí)捕獲到異常 | 告警 | 得物鏈路traceId, 異常堆棧,參數(shù) |
3.3.2 異步線程錄制回放問(wèn)題
入口主線程不等子線程執(zhí)行完就返回的異步場(chǎng)景,當(dāng)前的策略是用戶可配置對(duì)異步子線程的多調(diào)用忽略,只關(guān)注主線程的執(zhí)行情況。這一方式雖然可以提升這種異步線程場(chǎng)景的回放成功率,但是損失了異步子線程業(yè)務(wù)邏輯的回歸能力。
上面的案例就是由于應(yīng)用開(kāi)啟了排查提效優(yōu)先的開(kāi)關(guān),忽略了異步子線程的調(diào)用,導(dǎo)致diff比對(duì)異常,顯示回放成功。該接口在生產(chǎn)發(fā)布時(shí)報(bào)了異常,String類型長(zhǎng)度超長(zhǎng)被try catch,埋點(diǎn)丟失。
4、展望&未來(lái)規(guī)劃
流量錄制回放作為測(cè)試領(lǐng)域的一個(gè)新興事物,在誕生初期就吸引了廣大測(cè)試同仁的關(guān)注,市場(chǎng)上也有些公司也對(duì)此進(jìn)行了一些實(shí)踐。我們對(duì)流量錄制回放的實(shí)踐還處于起步的階段,一些問(wèn)題的解法也在探索中 。
預(yù)發(fā)只讀接口非mock回放
在得物預(yù)發(fā)環(huán)境是聯(lián)通生產(chǎn)環(huán)境的數(shù)據(jù)庫(kù)和下游應(yīng)用,因此對(duì)于預(yù)發(fā)進(jìn)行不mock的回放,特別是對(duì)只讀接口進(jìn)行不mock的回放能夠在上線前的最后階段進(jìn)行一次兜底的回歸校驗(yàn)。最難解決的問(wèn)題是,當(dāng)前是只讀的接口難以保證后續(xù)的變更不會(huì)引入寫操作。在當(dāng)前階段開(kāi)放這一功能會(huì)引入額外的資損類風(fēng)險(xiǎn)敞口。
對(duì)此問(wèn)題,每次回放前都進(jìn)行人工校驗(yàn)可能可以解決,但是又引入了極大的效率問(wèn)題。如何高效地保證在預(yù)發(fā)/灰度環(huán)境進(jìn)行不mock流量回放不會(huì)產(chǎn)生資損風(fēng)險(xiǎn),是一個(gè)值得探索的問(wèn)題,需要研發(fā)跟測(cè)試的共同努力。
方案1-單回放(準(zhǔn)實(shí)時(shí)回放)
方案1落地遇到的問(wèn)題:
1.配置中心的數(shù)據(jù)不一致,噪音比較大
2.時(shí)效問(wèn)題,有10S的時(shí)差,一些業(yè)務(wù)對(duì)時(shí)效要求比較高
方案2-雙回放(實(shí)時(shí)回放)
方案2不僅避免了上面方案1的問(wèn)題,另外后續(xù)規(guī)劃還可以根據(jù)覆蓋率沉淀有效用例集,手工添加異常用例。
通過(guò)一段時(shí)間的運(yùn)行,目前已經(jīng)看到了一些流量錄制回放在業(yè)務(wù)迭代中產(chǎn)生了價(jià)值,發(fā)現(xiàn)了一些隱藏bug。接入流量回放明顯的變化是能夠?qū)y(cè)試從繁重的回歸測(cè)試、用例梳理維護(hù)等重復(fù)性高的勞動(dòng)中解放出來(lái),將重心放在測(cè)試計(jì)劃的設(shè)定、思考測(cè)試策略以及自我提升的實(shí)踐上,比如做些輔助排錯(cuò)提效的coding能力提升和加強(qiáng)對(duì)業(yè)務(wù)的熟悉的寬度和深度上,從而最大程度的保障業(yè)務(wù)系統(tǒng)的質(zhì)量和穩(wěn)定性。
未來(lái)期望能在不斷的實(shí)踐中把得物的流量錄制回放體系建設(shè)得越來(lái)越完善,解放更多的生產(chǎn)力,產(chǎn)出更多的價(jià)值。