谷歌如何實(shí)現(xiàn)10億行代碼的測(cè)試覆蓋率?
谷歌研究人員進(jìn)行了一項(xiàng)分析,這項(xiàng)分析揭示了該公司的工程師如何管理 10 億行代碼的代碼測(cè)試覆蓋率。
該圖片來自于谷歌,其中彩色標(biāo)識(shí)的行號(hào)(用紅色矩形框突出顯示)用來可視化地查看代碼覆蓋情況。行號(hào)如果被測(cè)試覆蓋,則為綠色;如果沒有被覆蓋,則為橙色;如果沒有檢測(cè)該行,則為白色。
在軟件開發(fā)中,一個(gè)稱為代碼覆蓋率的常用度量標(biāo)準(zhǔn),用于度量部署代碼之前,所執(zhí)行的測(cè)試覆蓋到的系統(tǒng)代碼的百分比。代碼覆蓋率通常由單獨(dú)的軟件程序自動(dòng)測(cè)量,或者可以從命令行手動(dòng)啟動(dòng)某些代碼覆蓋率工具。測(cè)試結(jié)果準(zhǔn)確地顯示了在運(yùn)行測(cè)試套件時(shí)執(zhí)行了哪些代碼行,并且可以揭示哪些代碼行可能需要進(jìn)一步的測(cè)試。
理想情況下,軟件開發(fā)團(tuán)隊(duì)的目標(biāo)是 100% 的代碼覆蓋率。但在現(xiàn)實(shí)中,這種情況很少發(fā)生,因?yàn)橛行┐a塊會(huì)走到很多不同的執(zhí)行路徑,也因?yàn)楦鞣N邊緣情況,基于系統(tǒng)的需求,應(yīng)該(或不應(yīng)該)考慮這些邊緣情況。
近年來,越來越多的谷歌項(xiàng)目已經(jīng)很積極地引入了自動(dòng)化代碼覆蓋率測(cè)試工具。
度量代碼覆蓋率已經(jīng)成為軟件開發(fā)和測(cè)試團(tuán)隊(duì)的常見實(shí)踐,但是這種實(shí)踐是否真的提高了代碼質(zhì)量,這個(gè)問題仍然存在爭(zhēng)議。
一些人認(rèn)為,開發(fā)人員可能把焦點(diǎn)放在了數(shù)量上,而非質(zhì)量上,創(chuàng)建測(cè)試只是為了滿足代碼覆蓋率,而不是足夠健壯地識(shí)別高風(fēng)險(xiǎn)或關(guān)鍵的代碼區(qū)域。其他人則對(duì)它的成本效益提出了擔(dān)憂——它需要寶貴的開發(fā)人員時(shí)間來評(píng)審結(jié)果,而且不一定能提高測(cè)試質(zhì)量。
對(duì)于像谷歌這樣的大型組織(擁有 10 億行代碼,每天接收數(shù)萬次提交并支持七種編程語言)來說,度量代碼覆蓋率尤其困難。
谷歌的 AI 研究人員 Marko Ivanković and Goran Petrović最近的一項(xiàng)研究,提供了這家科技巨頭代碼覆蓋率基礎(chǔ)設(shè)施的幕后情況,它由四個(gè)核心層組成。底層組合了針對(duì)每種編程語言設(shè)計(jì)的代碼覆蓋率庫,中間層將代碼覆蓋自動(dòng)化流程集成到了公司的開發(fā)和構(gòu)建工作流中。頂層使用代碼編輯器和其他的定制工具,將代碼覆蓋信息可視化顯示出來。
作為這項(xiàng)研究的一部分,Ivanković和 Petrović分析代碼覆蓋率在 5 年期間的采用率。他們發(fā)現(xiàn),盡管谷歌沒有強(qiáng)制規(guī)定代碼覆蓋率,但自 2014 年以來,采用率卻一直在穩(wěn)步增長。2018 年第一季度,超過 90% 的項(xiàng)目使用了自動(dòng)的代碼覆蓋工具。
研究人員還從 3000 名隨機(jī)選擇的谷歌開發(fā)人員和其他非工程人員中,收集了 512 份關(guān)于代碼覆蓋率有用性的調(diào)查問卷。在受訪者中,只有 45% 的人在代碼修改時(shí)頻繁使用代碼覆蓋率測(cè)試,而 40% 的人在進(jìn)行代碼評(píng)審時(shí)定期地使用代碼覆蓋率。
圖表示例:來自谷歌谷歌的調(diào)查參與者在代碼修改(紅色)、檢查代碼更改(藍(lán)色)和瀏覽代碼更改(綠色)時(shí),對(duì)代碼覆蓋率的有用性進(jìn)行了評(píng)分。
Ivanković向 IEEE Spectrum 談到了他們的這項(xiàng)研究,和代碼覆蓋在軟件開發(fā)和測(cè)試中的作用。(為了清晰起見,以下采訪記錄經(jīng)過了編輯和濃縮。)
IEEE Spectrum:為什么你認(rèn)為代碼覆蓋率很重要?
Marko Ivanković:很多人可能期望我們說,“好的覆蓋率減少 bugs 的數(shù)量。“這當(dāng)然是其中的一個(gè)原因,但(我們發(fā)現(xiàn)的)更令人驚訝的是,即使覆蓋率不能直接作為一種質(zhì)量信號(hào),它仍然值得計(jì)算。”
覆蓋率可能對(duì)查看代碼的人沒有直接的幫助,但是對(duì)工具仍然有幫助——例如,分析依賴關(guān)系的工具。例如,如果代碼 A 聲明它依賴于代碼 B,但是對(duì)代碼 A 的測(cè)試永遠(yuǎn)無法觸及代碼 B,那么這種依賴可能不是真實(shí)的,自動(dòng)化工具可以嘗試刪除它來簡(jiǎn)化代碼庫。
當(dāng)然,實(shí)際實(shí)現(xiàn)要復(fù)雜得多。我們已經(jīng)發(fā)現(xiàn)了許多這樣的工具,它們可以使用我們的基礎(chǔ)設(shè)施提供的覆蓋率信息,來改進(jìn)它們自己的功能。對(duì)于許多這些用例,代碼覆蓋率和代碼質(zhì)量之間的相關(guān)性根本不重要。
IEEE Spectrum:是什么激發(fā)了你研究谷歌的代碼覆蓋率?
Ivanković:因?yàn)槲覀兠媾R著一個(gè)問題。在代碼評(píng)審期間,我們花費(fèi)了大量的時(shí)間試圖弄清楚,測(cè)試是否真的測(cè)試到了這些評(píng)審的代碼。那時(shí),代碼構(gòu)建系統(tǒng)支持覆蓋率計(jì)算,但是您必須手動(dòng)激活它,并手動(dòng)將覆蓋率結(jié)果和您正在審閱的代碼疊加來查看。有一天,我們對(duì)自己說,“必須找到一種自動(dòng)化的方法。“一個(gè)星期后,我們有了第一個(gè)可運(yùn)行的原型。其他工程師看到后,問是否他們也能擁有這樣的原型。我們想確保我們?yōu)樗麄兲峁┝俗詈玫捏w驗(yàn),所以我們開始研究這個(gè)問題。
IEEE Spectrum:你的調(diào)研結(jié)果里,你最驚訝的是什么?
Ivanković:我們感到驚訝的是,最初懷疑代碼覆蓋率方法,但卻最終發(fā)現(xiàn)它很有用的人數(shù)非常多。我們調(diào)查的一些人基本上是反對(duì)覆蓋率的,但他們?nèi)匀怀姓J(rèn)他們有時(shí)使用覆蓋率方法,并且發(fā)現(xiàn)它很有用。
IEEE Spectrum:你在調(diào)研中面臨的最大挑戰(zhàn)是什么?你是如何克服的?
Ivanković:從表面上看,代碼覆蓋率似乎是一個(gè)簡(jiǎn)單的概念:即一行代碼是否被測(cè)試覆蓋。但事實(shí)證明,當(dāng)大規(guī)模實(shí)施時(shí),它充滿了各種邊角情況和意外情況。我們花了幾年的時(shí)間,來修復(fù)測(cè)試的基礎(chǔ)設(shè)施中的所有失敗情況。
我們?cè)谶M(jìn)行研究時(shí)遇到了類似的挑戰(zhàn)。我們調(diào)查的大多數(shù)工程師對(duì)覆蓋率的總體概念是一樣的,但當(dāng)被問及細(xì)節(jié)時(shí),他們的回答卻大相徑庭。我們必須對(duì)一小部分人群進(jìn)行幾次調(diào)查,才能得到正確答案。
IEEE Spectrum:您認(rèn)為谷歌的代碼覆蓋基礎(chǔ)設(shè)施有哪些優(yōu)勢(shì)?你認(rèn)為還有什么可以改進(jìn)的?
Ivanković:我們努力確?;A(chǔ)設(shè)施資源是有效利用的,并且可以運(yùn)行在谷歌如此大的代碼規(guī)模上。向人們展示這是可能的,這可能是(我們的研究)最大的貢獻(xiàn)。
我們?cè)O(shè)計(jì)我們的基礎(chǔ)設(shè)施,以更容易地進(jìn)行實(shí)驗(yàn)、做 A /B 測(cè)試和評(píng)估假設(shè)。我們還以可訪問的格式導(dǎo)出所有數(shù)據(jù),這樣覆蓋率信息就可以可視化,這有助于團(tuán)隊(duì)保持健康的代碼,并準(zhǔn)備好修復(fù)事件。
當(dāng)我們?cè)谡{(diào)查工程師的時(shí)候,他們中的一些人給了我們改進(jìn)的建議,其中一些建議值得我們?nèi)ヌ剿?。其中一個(gè)比較有趣的方法是,如果代碼覆蓋率測(cè)試結(jié)果太好,就不要顯示它們,這樣工程師就不會(huì)過于自信。
IEEE Spectrum:對(duì)于希望部署代碼覆蓋率,或改進(jìn)現(xiàn)有代碼覆蓋率的軟件開發(fā)和測(cè)試團(tuán)隊(duì),您有什么建議?
Ivanković:我認(rèn)為可以給到的最重要的建議,是專注于他們的工作流程。不要只是部署覆蓋率測(cè)試,還要確保您將其集成到開發(fā)人員工作流的正確位置,只有在這個(gè)位置上,覆蓋率結(jié)果才是最有用的。在我們的經(jīng)驗(yàn)中,代碼評(píng)審是代碼健康的基石。
IEEE Spectrum:對(duì)于谷歌的代碼覆蓋基礎(chǔ)設(shè)施,未來將會(huì)有什么發(fā)展?
Ivanković:目前,我們?cè)诟M(jìn)一步地研究數(shù)據(jù)使用和開發(fā)人員的意見,以便更好地理解如何使用覆蓋率。例如,我們正在研究,人們理解到的有用性與實(shí)際的有用性之間的差異。我們想要研究的一個(gè)具體問題是,“在代碼評(píng)審期間,顯示覆蓋率實(shí)際上會(huì)加快評(píng)審過程嗎?”這項(xiàng)研究的結(jié)果,將決定我們下一步的基礎(chǔ)設(shè)施如何改進(jìn)。