如何治理測(cè)試穩(wěn)定性問(wèn)題?很多人會(huì)說(shuō):環(huán)境、流程管控、監(jiān)控、工具化、加機(jī)器、專(zhuān)人負(fù)責(zé)、等等。這些都是對(duì)的。不過(guò)這些都是解決方案層面的,而不是方法論和理論體系層面的。今天,阿里研究員鄭子穎來(lái)說(shuō)說(shuō)測(cè)試穩(wěn)定性的三板斧。據(jù)說(shuō),阿里同學(xué)們都非常認(rèn)同這三板斧,看完文章感覺(jué)很多做的事情有了理論基礎(chǔ)。
1. 測(cè)試穩(wěn)定性問(wèn)題
理想情況下,我們希望每一個(gè)失敗的測(cè)試用例[1]都是由真正的缺陷引起的。實(shí)際情況中,用例失敗的原因大多是一些其他的原因:
- 某個(gè)服務(wù)的版本部署的不對(duì)
- 測(cè)試執(zhí)行機(jī)的硬盤(pán)滿(mǎn)了,因?yàn)樯洗芜\(yùn)行時(shí)寫(xiě)的log沒(méi)清掉
- 數(shù)據(jù)庫(kù)里有臟數(shù)據(jù)
- 測(cè)試用例寫(xiě)得有問(wèn)題
- 測(cè)試運(yùn)行時(shí)有人手工執(zhí)行了一次定時(shí)任務(wù),把流水撈走了
- 消息串了
- ...
每次排查都是一堆這種問(wèn)題,時(shí)間久了,開(kāi)發(fā)和測(cè)試同學(xué)也就疲了。有些同學(xué)對(duì)失敗的用例草草看一眼,就說(shuō)這是一個(gè)“環(huán)境問(wèn)題”,不再排查下去了。如此一來(lái),很多真正的缺陷就被漏過(guò)了。
2. 測(cè)試穩(wěn)定性三板斧
如何治理測(cè)試穩(wěn)定性問(wèn)題?很多人會(huì)說(shuō):環(huán)境、流程管控、監(jiān)控、工具化、加機(jī)器、專(zhuān)人負(fù)責(zé)、等等。這些都是對(duì)的。不過(guò)這些都是解決方案層面的,而不是方法論和理論體系層面的。
在方法論和理論體系層面,我們對(duì)安全生產(chǎn)有三板斧:可灰度、可監(jiān)控、可回滾。類(lèi)似的,對(duì)于測(cè)試穩(wěn)定性,我也有三板斧:
- 高頻(Frequency)
- 隔離(Isolation)
- 用完即拋(Disposable)
三板斧之一:高頻
"If it hurts, do it more often"是我說(shuō)的最多的一句話之一。這句話從Martin Fowler那兒來(lái)的,有興趣的可以讀一下他的那篇“Frequency Reduces Difficulty”的原文。
高頻跑測(cè)試的好處是:
- 縮短驗(yàn)證的delay
- 變主動(dòng)驗(yàn)證為“消極等待”
- 識(shí)別intermittent的問(wèn)題
- 暴露各層面的不穩(wěn)定因素
- 倒逼人肉環(huán)節(jié)的自動(dòng)化
- 提供更多的數(shù)據(jù)供分析
- ...
高頻不單單是治理測(cè)試穩(wěn)定性的不二法門(mén),也是治理其他工程問(wèn)題的game changer:
- 持續(xù)打包:以前只是在部署測(cè)試環(huán)境前才打包,經(jīng)常因?yàn)榇虬膯?wèn)題導(dǎo)致部署花了很多時(shí)間,還影響了后面的測(cè)試進(jìn)度。針對(duì)這個(gè)問(wèn)題,我們做了持續(xù)打包,每個(gè)小時(shí)都會(huì)對(duì)master的HEAD打包,一旦遇到問(wèn)題(例如:依賴(lài)的mvn包缺失、配置缺失、等等),馬上修復(fù)。
- 天天上生產(chǎn):現(xiàn)在每周發(fā)一次生產(chǎn)環(huán)境,每次都費(fèi)事費(fèi)力。我提出能不能天天上生產(chǎn)。發(fā)布還是按照原來(lái)的節(jié)奏來(lái),每周發(fā)一次新代碼,一周里的其余日子,就算沒(méi)有新代碼也要走一遍生產(chǎn)發(fā)布??辙D(zhuǎn)。不為別的,就是為了要用高頻來(lái)暴露問(wèn)題、倒逼人肉環(huán)節(jié)的自動(dòng)化、倒逼各種環(huán)節(jié)的優(yōu)化。
- 分支合并很痛苦,那就頻繁合并,一天一次,一天多次。做到極致就變成了主干開(kāi)發(fā),一直在rebase、一直在提交。
螞蟻的SRE團(tuán)隊(duì)也是用的是高頻的思路。為了加強(qiáng)容災(zāi)能力建設(shè)、提高容災(zāi)演練的成功率,SRE團(tuán)隊(duì)的一個(gè)主打思想就是要高頻演練,用高頻演練來(lái)充分暴露問(wèn)題、倒逼能力建設(shè)。
高頻也不是那么容易做到的。
高頻需要基建保障。首先,高頻需要資源。高頻執(zhí)行還會(huì)給基建的各個(gè)方面造成前所未有的壓力。高頻還需要能力水平達(dá)到一定的基準(zhǔn)。就拿SRE的高頻演練來(lái)說(shuō)吧。如果每次演練還有很多問(wèn)題,那是不可能搞高頻的。能高頻做演練的前提是我們的隔離機(jī)制、恢復(fù)能力已經(jīng)到一定的水平了。對(duì)于測(cè)試運(yùn)行來(lái)說(shuō),高頻跑測(cè)試要收到效果,需要把隔離和用完即拋?zhàn)龊谩?/p>
對(duì)于高頻跑測(cè)試,一個(gè)很常見(jiàn)的疑慮是:原來(lái)一天只跑一次,失敗的用例我已經(jīng)沒(méi)有時(shí)間一一排查了,現(xiàn)在高頻跑了,我豈不是更沒(méi)時(shí)間了?我的回答是:實(shí)際上,并不會(huì)這樣,因?yàn)殚_(kāi)始高頻跑了以后,很快問(wèn)題就會(huì)收斂的,所以總的需要排查的量可能是差不多的或者反而小了的。
三板斧之二:隔離
相比起三板斧里的其他兩個(gè)(高頻、用完即拋),隔離的重要性應(yīng)該是比較被廣為接受的。隔離的好處包括:
- 避免測(cè)試運(yùn)行彼此影響,減少噪音。
- 提高效率,執(zhí)行某些破壞性測(cè)試的時(shí)候不再需要相互協(xié)調(diào)
隔離無(wú)非是兩種:硬隔離、軟隔離。至于到底是走硬隔離路線,還是走軟隔離路線,要根據(jù)技術(shù)棧、架構(gòu)、業(yè)務(wù)形態(tài)來(lái)具體分析。不過(guò)兩條道路都是能通往終局:
- 硬隔離(全隔離環(huán)境、物理隔離)要成為終態(tài),關(guān)鍵是成本。要在不增加質(zhì)量盲區(qū)的前提下壓縮成本。例如,如果能把整個(gè)支付系統(tǒng)都?jí)嚎s在一臺(tái)服務(wù)器里面跑[2],而且所有的功能(包括中間件層面的,例如定時(shí)任務(wù)、消息訂閱、分庫(kù)分表規(guī)則等)都能很好的覆蓋,那是一個(gè)理想的終局。每個(gè)人都可以隨時(shí)搞幾套全量環(huán)境,那是很爽的。另外,對(duì)架構(gòu)的拆分解耦(例如,我們做的按域獨(dú)立發(fā)布)是有助于降低硬隔離的成本的,可以把一整套被測(cè)系統(tǒng)部署的scope大大縮小。
- 軟隔離(半共享環(huán)境,邏輯隔離,鏈路級(jí)別隔離)要成為終局,關(guān)鍵是隔離的效果。如果隔離做到完美了,就能把今天的聯(lián)調(diào)環(huán)境部署到生產(chǎn)環(huán)境里去跑。這樣,就不存在stable環(huán)境穩(wěn)定性的問(wèn)題了。這樣,做到了真正的testing in production,也是個(gè)很理想的終局狀態(tài)。
這兩種終局狀態(tài),我在我以前的工作中都達(dá)到過(guò)。的確都能work的。這兩種隔離要通往終局,都是技術(shù)挑戰(zhàn)。壓縮成本是技術(shù)問(wèn)題。邏輯隔離做徹底做牢靠也是技術(shù)問(wèn)題。
對(duì)于我們今天的支付或電商系統(tǒng)來(lái)說(shuō),我們未來(lái)的終局是硬隔離還是軟隔離呢?現(xiàn)在還很難說(shuō)。從技術(shù)可行性方面判斷,軟隔離更有可能成為我們的終局。硬隔離做到深水區(qū)以后就很難做了,因?yàn)闀?huì)遇到架構(gòu)的物理極限。突破架構(gòu)的物理極限,有可能產(chǎn)生新的質(zhì)量盲區(qū)。但相當(dāng)長(zhǎng)的一段時(shí)間里,硬隔離會(huì)繼續(xù)對(duì)我們幫助很大。例如,我們要做各種非常規(guī)測(cè)試的時(shí)候,就需要硬隔離。軟隔離要做到能夠支持非常規(guī)測(cè)試,技術(shù)復(fù)雜度很高。從上個(gè)財(cái)年開(kāi)始,我在我團(tuán)隊(duì)搞一鍵拉全量測(cè)試環(huán)境(硬隔離)的原因就是:一鍵拉全量環(huán)境相對(duì)比較容易做,主要就是自動(dòng)化,而基于路由的軟隔離方案一下子還不太ready,短期內(nèi)達(dá)到我們需要的隔離水平還很難。
硬隔離和軟隔離也不是對(duì)立的,是可以一起用的。例如,我們?cè)诶鸹诼酚傻母綦x環(huán)境的時(shí)候,拉會(huì)新的數(shù)據(jù)庫(kù)。在數(shù)據(jù)庫(kù)層面是一種硬隔離,是對(duì)數(shù)據(jù)庫(kù)層面軟隔離能力欠缺的一種補(bǔ)充。
總之,隔離是必須的。采取何種隔離方案,要階段性的基于復(fù)雜度、成本、效果等因素的綜合考量。
三板斧之三:用完即拋
我最喜歡的另一句話是:Test environment is ephemeral。這句話是我原創(chuàng)的。Ephemeral的意思就是short-living,短暫的,短命的。我對(duì)我的QA團(tuán)隊(duì)反復(fù)講這句話,希望同學(xué)們能在日常工作中時(shí)刻記得這個(gè)原則。
"Test environment is ephemeral"就意味著:
有了這些能力,能夠以零人力成本、非??焖偾曳浅epeatable的從無(wú)到有建一套“開(kāi)箱即用”的測(cè)試環(huán)境,能夠造出來(lái)測(cè)試需要的所有數(shù)據(jù),我們就能做到測(cè)試環(huán)境的用完即拋:要跑測(cè)試了就新建一個(gè)環(huán)境,測(cè)試跑完了就把環(huán)境銷(xiāo)毀掉。下次要用再建一個(gè)新的。而且,不單單是測(cè)試環(huán)境,測(cè)試執(zhí)行機(jī)也要用完即拋。
對(duì)于用完還需要保留一定時(shí)間的環(huán)境,也要設(shè)一個(gè)比較短的上限。例如,我以前采用過(guò)這樣的做法:
- 聯(lián)調(diào)測(cè)試環(huán)境默認(rèn)生命周期是7天。
- 如果到時(shí)間還需要保留,可以延展有效期(expiration date)。每次展期最多可以展7天(相當(dāng)于是 newExpDate = now + 7,而不是newExpDate = currentExpDate + 7)。
- 最多可以展期到30天(從createDate開(kāi)始算),需要30天以上的,需要特批(比如,事業(yè)群CTO)。
- 這樣的好處就是倒逼。必須一刀切的倒逼,一開(kāi)始會(huì)有點(diǎn)痛苦,但很快大家就會(huì)習(xí)慣的,自動(dòng)化什么的很快就跟上了。不這么逼一逼,很多改進(jìn)是不會(huì)發(fā)生的。
用完即拋的好處是:
- 解決環(huán)境腐化問(wèn)題,減少臟數(shù)據(jù)
- 提高repeatability,確保每次測(cè)試運(yùn)行的環(huán)境都是一致的
- 倒逼各種優(yōu)化和自動(dòng)化能力的建設(shè)(測(cè)試環(huán)境的準(zhǔn)備、造數(shù)據(jù)、等等)
- 提高資源使用的流動(dòng)性。實(shí)際的物理資源不變的前提下,增加流動(dòng)性就能增加實(shí)際容量。
測(cè)試環(huán)境用完即拋的確會(huì)引入一些新的質(zhì)量風(fēng)險(xiǎn)。如果有一套長(zhǎng)期維護(hù)的環(huán)境,里面的數(shù)據(jù)是之前老版本的代碼生成的,部署了新版本代碼后,這些老數(shù)據(jù)是可以幫我們發(fā)現(xiàn)新代碼里面的數(shù)據(jù)兼容性問(wèn)題的?,F(xiàn)在用完即拋,沒(méi)有老數(shù)據(jù)了,這些數(shù)據(jù)兼容性問(wèn)題就可能無(wú)法發(fā)現(xiàn)。
這個(gè)風(fēng)險(xiǎn)的確是存在的。解決這個(gè)風(fēng)向的思路是往前看,而不是往回退。我們要探索數(shù)據(jù)兼容性問(wèn)題是否有其他的解法。有沒(méi)有其他的測(cè)試或者質(zhì)量保障手段。甚至要想一想,怎么做到“從測(cè)到不測(cè)”,把數(shù)據(jù)兼容性問(wèn)題通過(guò)架構(gòu)設(shè)計(jì)來(lái)消除掉,讓它不成為一個(gè)問(wèn)題。
3. 落地
上面講的三板斧,高頻、隔離、用完即拋,的確是有點(diǎn)理想主義的。我們今天的基建、架構(gòu)、自動(dòng)化建設(shè),離理想狀態(tài)還有不少差距的。
但我們就是要有那么一點(diǎn)的理想主義的。把這三板斧做好,技術(shù)上的挑戰(zhàn)是非常非常大的,但我們有樂(lè)觀主義,相信我們能夠達(dá)到目標(biāo)。我們有現(xiàn)實(shí)主義,我們可以分解目標(biāo),結(jié)合實(shí)際情況,一步步的去做。
Note:[1] 這里的用例主要指的是功能性的測(cè)試用例,包括:unit test、單系統(tǒng)的接口測(cè)試、全鏈路/端到端的測(cè)試,等等。
[2] 這樣子做,實(shí)操層面的一個(gè)可能的負(fù)面影響是它可能會(huì)discourage微服務(wù)化治理(包括,域自治性,獨(dú)立測(cè)試、獨(dú)立發(fā)布能力等)。
【責(zé)任編輯:武曉燕 TEL:(010)68476606】