两个list怎么对比数据_基于日志的回放对比系统设计
??
??點(diǎn)擊關(guān)注“有贊coder”
獲取更多技術(shù)干貨哦~
作者:馬力部門:新零售測(cè)試一、背景
上半年公司的網(wǎng)關(guān)系統(tǒng)進(jìn)行了重構(gòu),需要把零售業(yè)務(wù)已有的網(wǎng)關(guān)接口遷移到新網(wǎng)關(guān)上。這些接口每天都有成千上萬次請(qǐng)求,為商家提供各種服務(wù),稍有不慎就容易出現(xiàn)較大故障,所以如何遷移是個(gè)比較慎重的問題。這個(gè)遷移項(xiàng)目主要的驗(yàn)證重點(diǎn)是:確保新網(wǎng)關(guān)對(duì)于接口的請(qǐng)求和返回的處理和老網(wǎng)關(guān)一致;而主要的驗(yàn)證難點(diǎn)在于,僅從功能層面進(jìn)行手工驗(yàn)證很難覆蓋各種場(chǎng)景,尤其是如何構(gòu)造各種請(qǐng)求參數(shù)以及檢查各種返回的內(nèi)容。若要人肉進(jìn)行細(xì)致的接口級(jí)別的驗(yàn)證,那么花費(fèi)的時(shí)間就會(huì)很長、效率很低。經(jīng)過統(tǒng)計(jì)和梳理,涉及的接口超過了 1000 個(gè),在這個(gè)數(shù)量級(jí)上,總花費(fèi)的時(shí)間成本很高,研發(fā)團(tuán)隊(duì)難以承受。這不得不讓我們停下來思考一下,是否有另一種高效的方式來解決這個(gè)問題。這時(shí)就想到了采用錄制回放對(duì)比的方式。隨著業(yè)務(wù)的快速發(fā)展,回歸時(shí)需要考慮的場(chǎng)景越來越多,測(cè)試的耗時(shí)越來越長,越來越多的公司提出并采用錄制回放的方式來提高效率,比如阿里開源的 jvm-sandbox-repeater,基于已有的流量進(jìn)行錄制,無需人肉準(zhǔn)備腳本和數(shù)據(jù),通過將錄制的流量進(jìn)行回放,還原真實(shí)的場(chǎng)景,最后提供回放結(jié)果判斷是否符合預(yù)期,提高業(yè)務(wù)回歸效率。從場(chǎng)景上來說,網(wǎng)關(guān)遷移驗(yàn)證做的也是回歸測(cè)試,這個(gè)思路也是通用的,所以設(shè)計(jì)了一個(gè)類似的系統(tǒng)進(jìn)行回放對(duì)比驗(yàn)證。二、系統(tǒng)設(shè)計(jì)
如果需要采用錄制回放對(duì)比的方式,首先第一步就是錄制,在錄制前需要確認(rèn)下數(shù)據(jù)和流量的來源。數(shù)據(jù)越豐富、多樣性越強(qiáng),回放能夠發(fā)現(xiàn)的問題越多,一些實(shí)時(shí)的流量采集方式通過攔截轉(zhuǎn)發(fā)的方式獲取數(shù)據(jù),所以需要一定的配置和改造成本。幸運(yùn)的是網(wǎng)關(guān)的日志對(duì)于接口的請(qǐng)求參數(shù)會(huì)進(jìn)行記錄,實(shí)際上已經(jīng)完成了錄制這個(gè)過程,可以采用成本最小的方式:通過拉取測(cè)試環(huán)境老網(wǎng)關(guān)的日志來獲取請(qǐng)求數(shù)據(jù),然后進(jìn)行解析再進(jìn)行回放和對(duì)比。基本流程如下,下面會(huì)對(duì)各步驟的邏輯進(jìn)行說明2.1 日志拉取和清洗
作為整個(gè)流程的第一步:通過拉取日志獲得需要回放的流量。回放對(duì)實(shí)時(shí)性要求不高,但是當(dāng)初請(qǐng)求的時(shí)刻和回放的時(shí)刻之間的時(shí)間差也不能太長:比如早上創(chuàng)建一個(gè)商品并進(jìn)行了查詢操作,下午可能進(jìn)行了刪除,如果選擇晚上再進(jìn)行回放的話,查詢結(jié)果就會(huì)為空,數(shù)據(jù)的質(zhì)量就會(huì)下降,造成數(shù)據(jù)損耗。需要考慮設(shè)置一個(gè)較短的時(shí)間間隔進(jìn)行回放,目前通過定時(shí)任務(wù)每隔一小時(shí)啟動(dòng)一次進(jìn)行拉取和回放,根據(jù)當(dāng)前啟動(dòng)時(shí)間自動(dòng)生成對(duì)應(yīng)的時(shí)間范圍,去日志平臺(tái)獲取日志:比如任務(wù)啟動(dòng)時(shí)間是 11:10 分,那么自動(dòng)轉(zhuǎn)換成 10:00-11:00 的時(shí)間范圍去拉取日志進(jìn)行回放。獲得日志后,第二步就是日志清洗。日志清洗的作用有兩個(gè):過濾。有一些接口是不需要遷移到新網(wǎng)關(guān)的,進(jìn)行過濾,減少對(duì)最后統(tǒng)計(jì)結(jié)果的干擾。另外,錄制回放運(yùn)行時(shí)也會(huì)請(qǐng)求網(wǎng)關(guān),需要過濾掉這部分人工流量。
采樣。雖然是測(cè)試環(huán)境,一天的數(shù)據(jù)量也有 10W+ ,全部處理時(shí)耗較長;同時(shí),初期會(huì)有大量重復(fù)問題爆出,增大排查成本。根據(jù)二八定律以及實(shí)際的觀察,小部分接口貢獻(xiàn)了大部分流量,考慮每個(gè)接口雨露均沾和數(shù)據(jù)的多樣性,選擇接口+場(chǎng)景作為采樣緯度,返回結(jié)果中的不同 code 認(rèn)為是不同的場(chǎng)景,這樣除了正常請(qǐng)求,也考慮到異常請(qǐng)求的回放。?
2.2 進(jìn)行回放
考慮到數(shù)據(jù)是不斷變化的,同時(shí)對(duì)于登陸態(tài)生命周期是否正常也需要進(jìn)行觀察,所以回放并不是拿新網(wǎng)關(guān)請(qǐng)求的返回和日志中記錄的老網(wǎng)關(guān)進(jìn)行對(duì)比,而是同時(shí)請(qǐng)求兩個(gè)網(wǎng)關(guān),再對(duì)各自的返回進(jìn)行比較。在請(qǐng)求過程中,可能遇到接口超時(shí)等情況,遵循盡可能成功的原則,做對(duì)應(yīng)的處理,比如超時(shí)進(jìn)行重試等。另一個(gè)影響比對(duì)效率的因素就是性能,每一個(gè)請(qǐng)求都可以獨(dú)立處理,就意味著可以并發(fā)執(zhí)行,如 python 的 multiprocessing 多進(jìn)程的方法: p = multiprocessing.Pool(8) while line: p.apply_async(process_line, args=(...)) line = file.readline() p.close() p.join()在 6C 的機(jī)器上對(duì) 2000 條日志進(jìn)行回放,通過不同的并發(fā)數(shù)觀察結(jié)果如下:pool(1) 耗時(shí):1292spool(6) 耗時(shí):212spool(8) 耗時(shí):155spool(12) :耗時(shí):102s發(fā)現(xiàn)性能提升還是很明顯的,根據(jù)實(shí)際運(yùn)行機(jī)器的CPU性能配置適合的并發(fā)數(shù)即可。2.3 結(jié)果比較
整個(gè)系統(tǒng)中最核心的邏輯就是結(jié)果對(duì)比邏輯了。從新網(wǎng)關(guān)獲取到的返回 response1 和老網(wǎng)關(guān)獲取到的返回 response2 ,理論上是要一致的。初步的比較邏輯就是采用遞歸比較,將返回對(duì)象中的每個(gè)元素進(jìn)行比較,判斷內(nèi)容是否一致。實(shí)際的運(yùn)行過程中,往往會(huì)出現(xiàn)各種正常情況下返回結(jié)果不一致的情況:接口請(qǐng)求返回含有時(shí)間字段,而時(shí)間字段是根據(jù)當(dāng)前處理時(shí)間生成的。
一些寫接口返回的是新生成的對(duì)象 id ,每次請(qǐng)求返回都不同。比如創(chuàng)建一個(gè)商品,下了一筆訂單,返回的都是新生成的商品 id 或者訂單號(hào)。
返回?cái)?shù)據(jù)列表時(shí),有些場(chǎng)景返回的數(shù)據(jù)是不保證順序的,導(dǎo)致偶爾的比對(duì)失敗。
對(duì)于?response?字段,只檢查字段長度和類型,不檢查內(nèi)容是否一致,主要針對(duì)返回序列號(hào)、訂單號(hào)的場(chǎng)景
對(duì)于?list?字段,對(duì)于其中的list類型做無序比較處理
2.4 處理失敗
每次執(zhí)行任務(wù)會(huì)生成一個(gè)批次號(hào),每個(gè)接口請(qǐng)求回放對(duì)比完成后,保存結(jié)果時(shí)也會(huì)帶上批次號(hào)寫入數(shù)據(jù)庫。當(dāng)任務(wù)執(zhí)行完成后,會(huì)根據(jù)批次號(hào)將失敗的結(jié)果再拉取出來進(jìn)行重試。失敗重試時(shí),回放的邏輯和正常運(yùn)行時(shí)略有不同,兩次回放間隔了 30s 依次進(jìn)行,這是避免當(dāng)多次請(qǐng)求操作同一個(gè)對(duì)象時(shí),因?yàn)榈谝淮握?qǐng)求執(zhí)行比較慢導(dǎo)致第二次請(qǐng)求命中唯一性校驗(yàn)而失敗。當(dāng)重試結(jié)果仍然失敗,那么需要人工介入進(jìn)行排查,判斷是否是新網(wǎng)關(guān)邏輯的問題還是有字段需要特殊兼容的問題,進(jìn)行處理。2.5 結(jié)果判斷和遷移策略
對(duì)于回放成功的接口,會(huì)記錄當(dāng)時(shí)回放成功返回的code等信息到結(jié)果表,同時(shí)記錄對(duì)應(yīng)code的次數(shù)加1,多次回放后會(huì)形成如下的統(tǒng)計(jì)結(jié)果:{'200': 94, '234000001': 16, '234000002': 1}當(dāng)統(tǒng)計(jì)結(jié)果中存在正常的code和異常的code,同時(shí)沒有回放失敗記錄的情況,就可以認(rèn)為新網(wǎng)關(guān)對(duì)該接口的返回和老網(wǎng)關(guān)是一致的。回放通過的次數(shù)越多,可信性就越強(qiáng)。在這種情況下再將接口的流量切換到新網(wǎng)關(guān),觀察日常業(yè)務(wù)調(diào)用的情況,通過拉取新網(wǎng)關(guān)日志,記錄返回的code和數(shù)目,當(dāng)新網(wǎng)關(guān)返回的結(jié)果中也包含正常和異常的code時(shí),認(rèn)為在新網(wǎng)關(guān)也能正常請(qǐng)求,可以準(zhǔn)備線上遷移了。通過QA環(huán)境的對(duì)比回放,同時(shí)在預(yù)發(fā)環(huán)境全量遷移后觀察業(yè)務(wù)功能是否正常,最后線上逐步灰度流量和監(jiān)控,最后確保接口遷移到新網(wǎng)關(guān)是正常的。三、面向普通測(cè)試場(chǎng)景的解決方案
因?yàn)閷儆诨貧w類的工具,這套系統(tǒng)除了可以解決驗(yàn)證新老網(wǎng)關(guān)返回對(duì)比是否一致的問題外,還能夠幫助驗(yàn)證分支環(huán)境和基礎(chǔ)環(huán)境之間請(qǐng)求對(duì)比是否一致的問題(尤其是系統(tǒng)重構(gòu)的情況),對(duì)業(yè)務(wù)場(chǎng)景進(jìn)行回歸。為支持普通回歸場(chǎng)景,只要在原來的系統(tǒng)上進(jìn)行少量的改動(dòng):主要的改動(dòng)就是配置需要回放的接口和需要回放到的環(huán)境。在回放階段,之前是回放到新網(wǎng)關(guān)和老網(wǎng)關(guān),現(xiàn)在都回放到同一網(wǎng)關(guān),通過不同的 X-Service-Chain 請(qǐng)求頭,控制請(qǐng)求到達(dá)不同的后端環(huán)境,然后獲得返回值進(jìn)行對(duì)比。四、最后
本文提供了一種通過采集日志進(jìn)行回放對(duì)比來解決接口對(duì)比一致性的思路,運(yùn)用到了新老網(wǎng)關(guān)重構(gòu)驗(yàn)證等回歸場(chǎng)景。在新老網(wǎng)關(guān)遷移驗(yàn)證過程中,該系統(tǒng)起到了非常大的作用。通過該系統(tǒng)校驗(yàn)了接口 1200+,產(chǎn)生回放記錄數(shù)目 30w 條,發(fā)現(xiàn)問題 30+ ,最終保障了線上切換工作的平穩(wěn)進(jìn)行。由于能夠獲取了接口和參數(shù),可以進(jìn)一步做一些權(quán)限、后端參數(shù)校驗(yàn)這樣的檢查,減少測(cè)試人員在這方面投入的測(cè)試時(shí)間,這套系統(tǒng)已經(jīng)投入實(shí)際使用,后面有機(jī)會(huì)可以再介紹其實(shí)現(xiàn)原理和使用效果。期待未來能夠挖掘出更多的使用場(chǎng)景,解決更多的驗(yàn)證問題,提高測(cè)試的效率和準(zhǔn)確性。擴(kuò)展閱讀:Vol.335
最后打個(gè)小廣告:
有贊新零售測(cè)試團(tuán)隊(duì)長期招人,期待你的加入~,
如果你也是聰明、皮實(shí)、有要性的小伙伴
如果你對(duì)零售、SaaS有更多想法
歡迎投遞簡(jiǎn)歷:mali@youzan.com
加入我們,一起enjoy
?????
?總結(jié)
以上是生活随笔為你收集整理的两个list怎么对比数据_基于日志的回放对比系统设计的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 妇科千金片的作用和功效
- 下一篇: 单片机c语言位运算写法,单片机与嵌入式系