非碼用 Zadig 實(shí)現(xiàn)15 萬(wàn)家門店周發(fā)布 7 次
我們需要非常快速的迭代節(jié)奏,客戶爸爸說明天上,通宵熬夜也要完成目標(biāo),一周 7 次迭代也是常有的事:沒有 Zadig, 我們的自動(dòng)化測(cè)試不可能做起來(lái),更不可能滿足客戶的需求。有了 Zadig 的環(huán)境治理能力,自此我們的開發(fā)專心做 coding,環(huán)境構(gòu)建部署交給 Zadig;測(cè)試專心寫用例,環(huán)境資源交給 Zadig;運(yùn)維專心做維護(hù),服務(wù)管理交給 Zadig;不僅大大縮減了我們?cè)谏暇€前的迭代效率,穩(wěn)定的環(huán)境也提供了大家對(duì)上線質(zhì)量信心在使用 Zadig 的 2 年中,我切身感受到這個(gè)產(chǎn)品的前瞻性,是非常具有創(chuàng)新性的產(chǎn)品,可以說給整個(gè)行業(yè)帶來(lái)了新的 軟件交付 3.0 時(shí)代。Zadig 已經(jīng)開源,相信會(huì)有更多企業(yè)感受到其魅力!
非碼科技質(zhì)量部技術(shù)負(fù)責(zé)人:錢娟娟
寫在前面
非碼是為新零售行業(yè)的每一個(gè)商家提供解決方案,面對(duì)的客戶是每一個(gè)開門做生意的門店。
你可能沒聽說過非碼,但你一定聽說過:
對(duì)!從蜜雪冰城到麥當(dāng)勞,從老鄉(xiāng)雞到星巴克,他們都是非碼的客戶!
你也看到了,非碼服務(wù)的客戶大多是一線標(biāo)桿商戶,為了吸引消費(fèi)者,每季更新新品菜單、每個(gè)節(jié)日花樣大促、會(huì)員節(jié)優(yōu)惠狂歡、緊跟熱點(diǎn)的游戲上線等等都是非常經(jīng)典的營(yíng)銷。為了幫助客戶達(dá)成市場(chǎng)營(yíng)銷策略,我們需要非常快速的迭代節(jié)奏,客戶爸爸說明天上,通宵熬夜也要完成目標(biāo),一周 7 次迭代也是常有的事。
同時(shí),因?yàn)槌3S谢鸨幕顒?dòng)引流,高并發(fā)是我們經(jīng)常面臨的真實(shí)場(chǎng)景。所以在上線之前,除了保障功能可用性,系統(tǒng)穩(wěn)定性也是我們非常重要的指標(biāo),在大型的活動(dòng),如為了保障我們其中一個(gè)大客戶的 88 會(huì)員節(jié)活動(dòng),我們甚至?xí)崆叭齻€(gè)月做準(zhǔn)備,包含功能迭代封版、系統(tǒng)調(diào)優(yōu)、高可用測(cè)試、全鏈路性能測(cè)試,使得服務(wù)單接口的性能指標(biāo)要達(dá)到過萬(wàn)的并發(fā)能力。
非碼業(yè)務(wù)架構(gòu)概圖:
要知道非碼面對(duì)的商家,在系統(tǒng)中可能是一串代碼一條數(shù)據(jù),但門店店員直面消費(fèi)者,系統(tǒng)出了任何問題都會(huì)被當(dāng)面質(zhì)問。我們自己在生活中也是一個(gè)個(gè)消費(fèi)者,試問你開開心心去門店消費(fèi),打開手機(jī)下單卻提示你「系統(tǒng)異常」、明明有優(yōu)惠券卻使用不了、付了錢店家卻說沒收到訂單......,想想都覺得美好的心情被破壞。可想而知,門店的壓力非常之大,我們也必須要具備高效故障定位能力、并能迅速測(cè)試后 Hotfix,第一時(shí)間解決客訴。
初遇
我們擁有著復(fù)雜的業(yè)務(wù)系統(tǒng),面臨著新零售行業(yè)高頻迭代、高并發(fā)場(chǎng)景,產(chǎn)品質(zhì)量和穩(wěn)定性是最根本目標(biāo)。為了達(dá)成這個(gè)目標(biāo),我們一步步摸索著,逐漸開始了技術(shù)轉(zhuǎn)型和測(cè)試轉(zhuǎn)型。
首先是技術(shù)轉(zhuǎn)型。 非碼前期服務(wù)為了更快迭代功能,選擇以項(xiàng)目制開發(fā),服務(wù)端有各自的實(shí)踐方式,在系統(tǒng)技術(shù)架構(gòu)上缺少設(shè)計(jì)。隨著業(yè)務(wù)發(fā)展,服務(wù)端選擇不再項(xiàng)目制的重復(fù)造輪子,使用微服務(wù)最佳實(shí)踐作為核心,減輕之前積累的技術(shù)包袱。
接著我重點(diǎn)談下測(cè)試轉(zhuǎn)型。 剛開始和很多創(chuàng)業(yè)公司一樣,測(cè)試的作用集中在黑盒測(cè)試,瀑布式的按部就班作業(yè),等待運(yùn)維維護(hù)環(huán)境、等待開發(fā)提測(cè)(開發(fā)晚提測(cè)也只能催)、手工點(diǎn)點(diǎn)、上線回歸,順便疑惑怎么測(cè)試環(huán)境沒有這個(gè)問題?
隨著非碼的業(yè)務(wù)發(fā)展和技術(shù)轉(zhuǎn)型,從1條業(yè)務(wù)線擴(kuò)展為 2 條、到后面的 5 條業(yè)務(wù)線,業(yè)務(wù)線之間也并不完全獨(dú)立,有定制化有產(chǎn)品化,有基礎(chǔ)服務(wù)也有聚合服務(wù),微服務(wù)數(shù)量呈幾何增長(zhǎng)速度。測(cè)試的工作量和復(fù)雜度有了非常大的挑戰(zhàn),我們開始思考,開始了測(cè)試的轉(zhuǎn)型之路。
首先是拒絕被動(dòng),測(cè)試人員要「走」出去,質(zhì)量保障是一個(gè)過程,不是一個(gè)結(jié)果。走到開發(fā)的前面和產(chǎn)品溝通用戶需求,利用自身的優(yōu)勢(shì)--比產(chǎn)品懂技術(shù)、比開發(fā)懂業(yè)務(wù),需求階段和開發(fā)設(shè)計(jì)階段就可以排雷。另外一點(diǎn)是走到上線的后面,關(guān)注用戶反饋和影響范圍,分析系統(tǒng)穩(wěn)定性和測(cè)試質(zhì)量的薄弱之處。
其次是自動(dòng)化測(cè)試,(一般提到測(cè)試進(jìn)階第一個(gè)想到的就是自動(dòng)化測(cè)試,我們認(rèn)為自動(dòng)化測(cè)試是測(cè)試轉(zhuǎn)型的一種途徑,不是目標(biāo),先擺正思路更重要),在團(tuán)隊(duì)只有業(yè)務(wù)測(cè)試人員的背景下,我們第一選擇是通過開源測(cè)試工具實(shí)現(xiàn)自動(dòng)化,但多數(shù)偏向于個(gè)人不便于團(tuán)隊(duì)協(xié)作。秉承著發(fā)揮自動(dòng)化最大價(jià)值的初心,我們慢慢通過開發(fā)一些提高效率的小工具,最終選擇以接口測(cè)試為切入點(diǎn)自己寫代碼實(shí)現(xiàn)自動(dòng)化(UI 自動(dòng)化試點(diǎn)后,發(fā)現(xiàn)我們業(yè)務(wù)特性不適合)。我們多線業(yè)務(wù),且業(yè)務(wù)靈活度較高,服務(wù)接口變化也很快,通過學(xué)習(xí)和逐步嘗試,針對(duì)我們業(yè)務(wù)特性,設(shè)計(jì)了接口結(jié)構(gòu)靈活變更的自動(dòng)化方式(Python+unittest 后改版為 Python+pytest),結(jié)構(gòu)概要如下:
最后是環(huán)境管理,自動(dòng)化完成后也遇到了諸多落地困難,我們之前的環(huán)境都是虛機(jī),環(huán)境部署無(wú)法自動(dòng)化,也就無(wú)法保障自動(dòng)化測(cè)試的代碼最新版本,想要實(shí)現(xiàn)自動(dòng)化能同步測(cè)試不同版本的、不同分支的代碼更是困難。除此之外,虛機(jī)環(huán)境的成本和管理也很難控制,我們推動(dòng)設(shè)立了「測(cè)試環(huán)境管理員」一職,輪班管理測(cè)試環(huán)境,緩解了一部分混亂現(xiàn)象,但自動(dòng)化測(cè)試的效益仍被限制。并且開發(fā)除去代碼開發(fā)的時(shí)間投入,也花費(fèi)了大量時(shí)間在環(huán)境部署、服務(wù)聯(lián)調(diào)上。
之后我們又迎來(lái)了 Docker K8s 的轉(zhuǎn)型,服務(wù)管理有了新的方式,也逐步學(xué)習(xí) CI/CD 的高效迭代方式,我們開始摸索自動(dòng)化和其產(chǎn)生的火花。也在一次技術(shù)峰會(huì)上,我們 CEO 和 CTO 結(jié)識(shí)了李倩,邀請(qǐng)李倩給我們做了多次技術(shù)分享,李倩對(duì)軟件微服務(wù)快速交付的理念,與當(dāng)下正在尋求快速迭代解決方案的我們,不謀而合。進(jìn)而知道了 KodeRover 的產(chǎn)品 Zadig(開源之后的名字,下文統(tǒng)一用 Zadig 這一名稱),立刻被這個(gè)產(chǎn)品所吸引。
一拍即合
Zadig 最吸引我們的地方便是:
- 快速創(chuàng)建環(huán)境。Zadig 基于 K8s NS 支持一鍵拉起一套新環(huán)境,是當(dāng)下解決我們環(huán)境管理痛點(diǎn)的最優(yōu)解決方案。
- 工作流管理微服務(wù)啟動(dòng)順序。解決了我們技術(shù)轉(zhuǎn)型后,服務(wù)數(shù)量猛增后引發(fā)的依賴管理問題。
- 優(yōu)秀的 k8s 服務(wù)編排機(jī)制。Zadig 的單個(gè)應(yīng)用可維護(hù) N 個(gè)資源控制器,極大降低了維護(hù)、排錯(cuò)成本。
我們迅速在團(tuán)隊(duì)內(nèi)部試點(diǎn) Zadig,選定了我們點(diǎn)餐業(yè)務(wù)線進(jìn)行了服務(wù)遷移。在之前我們的環(huán)境無(wú)法嚴(yán)格控制權(quán)限管理,測(cè)試和運(yùn)維同學(xué)依賴手工構(gòu)建、部署、服務(wù)啟動(dòng)等,有了 Zadig 的快速創(chuàng)建環(huán)境,我們對(duì)環(huán)境進(jìn)行了重新管理,大致如下:
有了 Zadig 的環(huán)境治理能力,自此我們的開發(fā)專心做 coding,環(huán)境構(gòu)建部署交給 Zadig;測(cè)試專心寫用例,環(huán)境資源交給 Zadig;運(yùn)維專心做維護(hù),服務(wù)管理交給Zadig;不僅大大縮減了我們?cè)谏暇€前的迭代效率,穩(wěn)定的環(huán)境也提供了大家對(duì)上線質(zhì)量信心。
如虎添翼
同時(shí),因?yàn)橛辛朔€(wěn)定的環(huán)境,自動(dòng)化測(cè)試終于真正意義的「自動(dòng)化」了。 此前,我們自動(dòng)化測(cè)試雖一直都在執(zhí)行,但其實(shí)收益較低且相對(duì)滯后,因?yàn)闊o(wú)法完全保障測(cè)試環(huán)境和自動(dòng)化環(huán)境的一致性,也難以做到測(cè)試左移。Zadig 便提供了這樣的功能,且對(duì)接方式十分簡(jiǎn)單,除了定時(shí)任務(wù)、測(cè)試執(zhí)行、報(bào)告展示常見功能之外,還具有強(qiáng)大的統(tǒng)計(jì)分析功能,多維度直觀的展示測(cè)試自動(dòng)化的過程、收益。
至此,我們的自動(dòng)化測(cè)試實(shí)現(xiàn)了測(cè)試左移,使得開發(fā)在發(fā)版后,立刻知曉自己本次發(fā)版質(zhì)量,在測(cè)試人員無(wú)需介入的情況下,實(shí)時(shí)跟進(jìn)發(fā)版的質(zhì)量問題,并以此結(jié)果作為自測(cè)的驗(yàn)收標(biāo)準(zhǔn)。
能更早的發(fā)現(xiàn)問題、解決問題,使得測(cè)試收益最大化,自動(dòng)化測(cè)試執(zhí)行結(jié)果成為質(zhì)量驗(yàn)收標(biāo)準(zhǔn)的一項(xiàng)重要指標(biāo)。現(xiàn)在業(yè)務(wù)線仍在增加、生態(tài)也在向支付寶、抖音發(fā)力,對(duì)此我們有信心做的更好。