1、容器化技術在OPPO測試環境治理中的應用主講人:鄭偉領域驅動設計啟發下的AI視覺分析引擎構建主講人:戴 昊演講嘉賓介紹鄭偉 OPPO高級后端工程師14年開發與架構經驗,在OPPO從事業務架構設計、服務治理、工具和平臺建設在框架開發,平臺開發,應用架構設計上有豐富的實踐經驗。目錄CONTENTS測試實施痛點1234尋找合適的測試方法方案落地細節目前成果測試實施痛點1測試實施痛點單元單元測試測試所依賴中間件復雜多樣被測試應用往往依賴非常多的中間件,在測試過程中mock掉全部中間件依賴成本極高,需要對每種中間件進行內存化運行或者個性化mock。外部系統依賴多,協議繁雜外部系統依賴較多,接入協議包含h
2、ttp、dubbo、mq等,目前各個業務使用mock框架的選型、mock過程各式各樣,新人接手需要研究各種不同的mock框架,學習成本高,工作量大。數據準備和清理花費時間多由于共用環境,對于測試數據的準備、清理所花費的開發時間非常多用例編寫難度依賴系統的可測性不具備高可擴展的系統往往難以mock測試實施痛點所依賴服務無法真正隔離被測試應用往往依賴非常多的三方或者二方應用,這些應用都是公用的環境,同時提供給多套自動化環境甚至普通測試環境使用,多個環境產生的數據相互影響。中心化配置數據無法隔離現在很多系統都使用了配置中心,雖然一些配置中心提供了多環境能力,但是無法很好地與測試用例執行的生命周期相匹
3、配,譬如測試用例執行完后,對配置環境的銷毀就難以處理。自動化測試自動化測試尋找合適的測試方法2分層測試與貫穿測試 測試粒度足夠小,方便定位問題 執行速度快 mock成本高 關注主要業務路徑,開發效率高 mock一次,層層可用ControllerServiceDaoUnitTestUnitTestUnitTestControllerServiceDaoUnitTest分層隔離測試,每層都mock貫穿測試,只從入口開始分層測試與貫穿測試針對不同的業務場景采用不同的測試策略 算法、框架類型產品采用分層隔離測試 業務型系統采用貫穿測試 算法、框架類型產品 業務型系統ControllerServiceD
4、aoUnitTestUnitTestUnitTestControllerServiceDaoUnitTest分層隔離測試,每層都mock貫穿測試,只從入口開始兼容不可測系統老系統、不可測、毫無老系統、不可測、毫無擴展性、擺爛擴展性、擺爛我想做單測兼容不可測系統老系統、不可測、毫無老系統、不可測、毫無擴展性、擺爛擴展性、擺爛我想做單測兼容不可測系統-對PUA行為say no方案收斂 貫穿性的測試方式 兼容不可測系統 屏蔽復雜依賴環境 數據環境隔離 盡量不需要mock 容器化解決環境依賴問題聲明式解決數據構造問題方案落地細節3整體方案拉起應用進行貫穿測試Before Spring startBef
5、ore AllBefore EachAfter EachAfter AllSpring Shutdown解析配置觸發啟動器拉起配置的容器、初始化數據host、port注入環境變量加載springmysql解析類注解讀取數據定義xmldb unit數據準備解析方法注解讀取數據定義xmldb unit數據準備db unitdb unit關閉啟動器創建容器初始化suit級別數據初始化case級別數據初始化全局數據清理數據清理數據銷毀容器應用生命周期Docker Hostcontainer MYSQLcontainer MYSQLcontainer MYSQLcontainer MYSQLcontai
6、ner MYSQLdocker host liststartup加載配置文件和doker host1、startup配置文件2.1、選擇dockerhost2.2、加載配置文件3、啟動依賴中間件4、初始化數據Envs5、host&portspring application context6、拉起應用7、替換占位符8、執行測試用例test casescase init datarun casecase clear datanext case加載配置文件和doker hostall case done10、銷毀所有容器落地細節1:rocketMq All in One問題域:在容器化rocket
7、MQ的過程中,為了提升啟動速度,我們需要將nameserver與broker放在同一個容器中啟動但實際上我們發現由于client需要通過nameServer獲取broker地址,這時nameServer獲取到的broker地址實際為容器內部地址,故我們提出了修改rocketMQ源碼,hook nameServer接口的方式達到rocketMq 單容器啟動的效果鏡像startup1、create containers2、拉取鏡像并啟動容器內部處理startup.shnameServerbroker2.1、啟動nameserver2.3、啟動broker3、返回broker ip和port4、ip
8、和port寫入配置文件broker外部ip與port測試用例5、啟動測試用例6、通過nameserver外部ip&port獲取broker地址7、外部地址8、broker外部地址9、通過外部地址訪問broker落地細節2:redis cluster 優化問題域:與rocketMQ單容器化類似,redis cluster部署模式需要通過任一節點獲取所有節點拓撲,由于單容器啟動,在獲取過程中,會獲取到內部ip,與rocketmq不同的是,redis cluster為去中心化管理,故須另外加上一層proxy進行中心化轉發,以達到hook 獲取拓撲接口的目的1、利用netty實現了一個Redis Pr
9、oxy2、借助外部啟動器注入容器監聽的外部端口3、cluster指令返回mock的響應,其他指令透傳到集群startup測試用例with redisClient5、啟動測試用例Docker HostRedis cluster容器Master1Slaver1Master2Slaver2Redis proxy容器Proxyproxy外部ip與port1、啟動redis cluster2、啟動redis proxy 并link到 cluster3、proxy的外部ip與port4、proxy ip&port 寫入文件6、發送集群查詢指令7、返回本身ip作為集群ip8、發送普通指令透傳普通指令9、返回
10、cluster應答落地細節3:CDC 架構模式支持 目前業務上大量使用了CDC架構模式,我司有類似Canal的框架,進行數據同步,但是如果其進行容器化改造成本太高,且測試場景下無需做到那么高的可靠性,故我們模擬了cdc的中間件mysql容器CDC容器startupmysql-binlog-connector1.1、啟動mysqltable schemas2、load table schemas3、load all table schemas4、load table 與 MQ topic對應關系table to topic5、啟動CDC容器,將需要監聽的table事件配置,以及mq傳入偽裝mys
11、ql salver 監聽binlogmq lisenter6、業務應用啟動mqlistener監聽topic7、mysql事件變動通知落地細節4:支持多種數據源的聲明工具注解已支持中間件說明UsingDataSetMySQLRedisMongoDB支持數據集的自動加載和清理ShouldMatchDataSetMySQLRedisMongoDB支持數據集自動斷言IgnorePropertyValueMySQLMongoDB配合斷言使用,設置忽略的字段演進1:自動化測試領域的延伸端對端沙箱環境被測服務二方依賴服務二方依賴服務HTTPDUBBO 中間件依賴KafkaMySQLRedis中間件協議HT
12、TP測試工程Goblin三方依賴服務(統一Mocker Server)HTTP配置中心沙箱環境真實配置中心首次啟動拉取真實配置實現簡單服務編排比如有中間件A、B、C,C依賴B,那我們可以定義如下services:A:image:AB:image:BC:image:Cdepends_on:-B偽代碼final CountDownLatch cdl=new CountDownLatch(3);new Thread()-startConatiner(A);cdl.coutDown();).start();new Thread()-startConatiner(B);cdl.coutDown();startConatiner(C);cdl.coutDown();).start();cdl.wait();目前成果4支持中間件列表CDC業務覆蓋單元測試能力100+應用,幾乎覆蓋OPPO互聯網全業務部門自動化測試能力進行了ROI,相較于老的自動化測試方案,隔離性更強,試點業務自動化測試執行耗時從7分鐘降低到2分鐘開源Goblin測試套件:https:/