【關鍵導讀】結合jvm-sandbox-repeater+diffy二次開發實系統新老版本回歸對比測試html
一、總體執行方案
針對repeater-console進行了二次開發,使得侵入應用服務錄製請求信息到數據庫存儲,進而經過訪問開放的迴歸測試api,實現將錄製的流量回放到diffy的代理入口,完成diff測試的目的git
二、Jvm-sandbox-repeater
官方地址:https://github.com/alibaba/jvm-sandbox-repeatergithub
repeater的能夠應用到哪些場景?docker
業務快速回歸數據庫
-
基於線上流量的錄製/回放,無需人肉準備自動化測試腳本、準備測試數據api
線上問題排查服務器
-
錄製回放提供"昨日重現"能力,還原線上真實場景到線下作問題排查和Debug架構
-
動態方法入參/返回值錄製,提供線上快速問題定位app
壓測流量準備dom
-
0成本錄製HTTP/Dubbo等入口流量,做爲壓測流量模型進行壓測
實時業務監控
-
動態業務監控,基於核心接口數據錄製迴流到平臺,對接口返回數據正確性進行校驗和監控 目前對repeater的應用主要是業務快速回歸,基於線上流量的錄製存儲
-
業務實施:
step0 安裝sandbox和插件到應用服務器 curl -s http://sandbox-ecological.oss-cn-hangzhou.aliyuncs.com/install-repeater.sh | sh step1 修改repeater.properties,啓用遠程拉取配置
step2 在NDP修改應用啓動參數,指定錄製應用名和環境,-Dapp.name=${錄製應用名} -Dapp.env=${錄製環境} ,這個會在錄製的信息中存儲這兩個字段信息
step3 attach模式字節碼加強到業務應用 attach模式下,錄製應用名和錄製環境這兩個參數都會被默認爲unknown。 # 啓動命令 ~/sandbox/bin/sandbox.sh -p ${被錄製應用進程號} -P ${repeater啓動端口} # 關閉命令 ~/sandbox/bin/sandbox.sh -S ${被錄製應用進程號}
step4 根據本身配置的協議,HTTP/Java/Dubbo進行請求錄製,如錄製成功在repeater.log會打出具體的TraceId,若是是本地模式同時在~/.sandbox-module/repeater-data/record/文件中會寫入TraceId關聯的錄製數據 若是# 是否開啓脫機工做模式repeat.standalone.mode=false,會將錄製信息推送到遠端服務進行存儲
具體的數據庫表信息,存儲以下:
2.1 Jvm-sandbox-repeater架構分析圖
三、repeater-console
基於開源簡單二次開發,變動功能:
-
經過配置中心實現配置動態變動
-
根據錄製信息實現回放diffy對比測試
3.1 動態配置變動
jvm-sandbox-repeater配置能夠經過遠端服務拉取的方式:
# 配置文件拉取地址 repeat.config.url=http://xxxx/facade/api/config/%s/%s
xxxx爲repeater-console服務
3.1.1 錄製回放配置字段說明
這個配置的解讀,主要依賴com.alibaba.jvm.sandbox.repeater.plugin.domain.RepeaterConfig類以及調用到這個類中方法的邏輯的說明。
3.1.2 動態配置實現
基於配置中心提供的註解@ConfigNotify("repeater_config"),添加RepeatConfigListener,實現動態配置
3.2 回放diffy對比測試
提供api可對外訪問執行迴歸diff測試:http://xxxx/facade/api/regress/test,參數名爲appName和env,選擇運行指定應用和環境下的錄製請求
1)動態配置訪問的diffy服務:String proxy = difyDomainConfigListener.getDiffyConfig().getString(appName);根據不一樣應用獲取指定的diffy服務,由於diffy服務在啓動時與應用服務是綁定的,1個應用服務目前只能對應單獨的diffy
2)啓動迴歸執行會當即返回,採用異步後臺運行的方式;
3.3 diffy對比測試
3.3.1 diffy原理及部署
如下爲原理圖,很是清楚的說明了diffy的對比測試的原理,在此不過多闡述
採用rancher實現diffy容器化部署,以下所示:
CMD配置啓動參數:
-candidate=xxx1:8080 -master.primary=xxx2:8080 -master.secondary=xxx3:8080 -service.protocol=http -serviceName=httpDNS-Service -proxy.port=:8880 -admin.port=:8881 -http.port=:8888 -summary.email=xxx
3.3.2 diffy回放測試效果
整體回放對比結果:
單個請求diff結果:
四、總結一下
1)基於diffy的對比實踐中遇到一個問題,若是response data中list是隨機的,那麼就會出如今穩定版本及其副本對比時,也會有差別,若是降噪,會把實際須要對比的response data也給降噪掉,若是不降噪,那麼久有可能每個請求都是有差別的,進而沒有達到diff快速回歸的效果(面對這種服務暫時沒有好的解決辦法)
2)基於diffy的對比接口,爲了保證不對線上業務產生影響以及髒數據,目前實施的都是讀接口以及冪等寫接口
3)JVM-sandbox-repeater在這個方案中只是使用了錄製功能,應該要結合repeater的回放、mock等部分,完成錄製回放及mock應用體系化測試
能夠參考學習的資料:
JVM-sandbox-repeater github開源:https://github.com/alibaba/jvm-sandbox-repeater
JVM-sandbox-repeater:https://testerhome.com/topics/20868
docker diffy:https://hub.docker.com/r/diffy/diffy
diffy github開源:https://github.com/twitter/diffy
【延伸閱讀】