文章結構
- 基本介紹
- 使用流程
- 實現方案
- 總結
基本介紹
背景
目前公司正在進行php java化遷移工作。
Java化測試本質上是一次回歸工作。在測試過程中,我們發現某些后端字段類型的變更,app OK,m站卻出了問題。人工的測試難免有疏漏和不足。為了讓java化后的接口返回和線上一致,避免對前端的影響,所以流量回放工具誕生了!
流量回放工具有以下幾個優點:
- 可以抓取app、m站、小程序流量
- 支持流量的反復回放
- 可自設參數去抓精准流量
- 對比快且精准,基本上不會有紕漏
- 支持json respone和db的精准對比
目前遺憾的是無法抓取java流量進行對比
技術選型
發現bug示例
- 缺失返回類 – 全球購訂單報關失敗沒有出來報關失敗相關提示,商品上未出現雙12佣金卡立減icon
- 額外返回類 – h5多返回了 發布心得的文案
- 返回不一致類 – 貝店oid返回不一致,后端處理oid丟失精度
- 服務器報500可以快速發現
- 網關層接收參數變更,導致網關層報錯快速發現
使用流程
目前流量回放工具支持3種流量的回放,兩種對比方式。
首先,我們先介紹下線上流量的抓取和回放。
一、線上流量抓取和回放
1.抓取線上流量
首先需配置bconf(該配置作用為設置抓取線上流量的百分比,如設置5則為抓取5%流量)
配置之后,會時時抓取對應接口流量,並存儲在流量回放平台。
2.創建回放任務
Ps:僅支持GET接口,隨機抓取線上流量在線上環境和預發環境上回放對比
二.自設流量
支持POST和GET接口,可設置指定賬號,指定傳參,自定義請求回放對比
流量抓取回放之后,就可以查看回放結果了。
線上和自設流量目前支持的是JSON對比。
JSON對比,可切換展示變化值和完整值,支持對比白名單和排序規則,詳情中支持二次編輯並重復回放。
1.任務結果詳情
2.JSON結果對比
紅色為預發對比於線上缺少的內容,綠色為預發對比於線上新增的內容
3.其他BONUS功能
1.線上方式回放前預覽測試流量在線上的返回結果
2.對比時設置白名單字段,不對比無需對比字段(如字段類型不一致無需對比)
3.設置排序規則解決數組亂序導致對比結果不直觀問題
流量回放工具還支持以場景方式去錄制回放,該錄制方式支持入庫數據結果比對。
實現方案
- 整體架構圖
- 流量抓取核心邏輯
- php流量
在Rest_base_controller里設置抓取流量邏輯,並發送給rocketmq - java流量
因為java是多應用模式,並且如果流量抓取做在網關層,可能會影響到網關性能,所以決定使用dubbo 自定義filter機制,抓取流量,接入應用需要導入相關jar包(實現網關層調用各應用dubbo服務的流量抓取),目前還未支持。
- 流量錄制回放核心邏輯
- 錄制流程
線上流量 – 直接消費mq消息獲取php抓取的流量
自設流量 – 根據前端獲取的入參,構造請求在線上直接請求,並回傳流量信息 - 回放流程
相關抽象方法如下:
createTask – db插入回放記錄訪問記錄id
doTask – 根據獲取的流量選擇環境執行回放,catch異常回滾db
getSuspectObject – 進行對比相關操作,獲取對比返回值更新記錄db
finishTask – 所有相關數據更新db
- response對比核心邏輯
當初設計是后端進行對比,前端根據對比結果展示,但是前端對比的三方框架更加完善,支持排序、白名單等操作,所以后面采用后端返回json前端進行對比展示操作。
前端框架 github地址:https://github.com/benjamine/jsondiffpatch
總結
- 流量回放平台解決了大量切換環境、並且手動對比的重復冗余工作,並且實現了精確對比的目標,幫助開發測試人員發現一些靠肉眼手動無法發現的問題,讓大量開發測試人員紛紛發出了“流量回放平台”真香的感嘆,后期甚至可以針對java化測試工作完全脫離於APP,直接利用平台進行測試,減少大量人力(當然一些字段的定義還是去依賴APP去確定)
- 線上流量隨機回放的應用可以幫助測試人員實現提前灰度的效果,自設流量可以幫助測試人員精准覆蓋各種特殊場景的case,db的對比更能直接深入到db層定義插庫代碼的正常性。