凌晨?jī)牲c(diǎn),一條報(bào)警短信把開發(fā)團(tuán)隊(duì)從床上拽起來(lái)。打開儀表盤一看,代碼覆蓋率穩(wěn)穩(wěn)停在90%,該跑的單測(cè)都跑通了。挖了四十分鐘,罪魁禍?zhǔn)撞卦跊](méi)被踏過(guò)的else分支里——測(cè)試全走了一條路,另一條路連燈都沒(méi)開過(guò)。
代碼覆蓋率這玩意兒,團(tuán)隊(duì)里天天念叨,但真把它用透的沒(méi)幾個(gè)。它量的是測(cè)試期間有多少代碼被真正執(zhí)行過(guò)。如果你的庫(kù)里有一千行可執(zhí)行代碼,跑完測(cè)試觸達(dá)了九百行,那行覆蓋率就是90%。它是一個(gè)運(yùn)行時(shí)指標(biāo),只跟蹤實(shí)際運(yùn)行的路徑,跟代碼本身長(zhǎng)得有多危險(xiǎn)毫無(wú)關(guān)系。跟它搭班子的靜態(tài)代碼分析,擅長(zhǎng)在不執(zhí)行的情況下挑出復(fù)雜度、風(fēng)格、安全氣味這些毛病。一個(gè)告訴你哪里可能埋著雷,另一個(gè)告訴你測(cè)試到底有沒(méi)有踩到那片區(qū)域。
![]()
這里容易混淆的是“代碼覆蓋率”和“測(cè)試覆蓋率”。很多人口中的測(cè)試覆蓋率,更像是在問(wèn):我把要驗(yàn)證的行為都測(cè)到了沒(méi)有。而代碼覆蓋率只管一個(gè)冰冷的數(shù)字百分之多少的語(yǔ)句被執(zhí)行過(guò)。一個(gè)支付模塊,用五個(gè)正常流程的用例可能把行覆蓋率推到95%,但如果沒(méi)測(cè)余額為負(fù)時(shí)怎么優(yōu)雅報(bào)錯(cuò),那行為層面的測(cè)試覆蓋就是漏的。
光盯著行覆蓋率會(huì)騙人。絕大多數(shù)工具把行覆蓋率和語(yǔ)句覆蓋率捏成一個(gè)百分比,看起來(lái)清爽,卻藏住了分支、路徑這些更細(xì)的盲區(qū)。假設(shè)有個(gè)判斷 if (a > 0 && b > 0),你只用一個(gè) foo(1,1) 的用例跑過(guò)去,每一行都亮了——但 else 分支上的邏輯根本沒(méi)被碰過(guò)。行覆蓋率滿分,分支覆蓋卻開了天窗。所以真正有意義的做法不是追著所有指標(biāo)跑,而是挑幾個(gè)核心指標(biāo)死磕,比如行覆蓋打個(gè)底,分支覆蓋查缺口,再結(jié)合函數(shù)覆蓋看哪些模塊壓根沒(méi)被測(cè)試掛上。
那怎么把力氣花在值得測(cè)的地方?可以先從認(rèn)證模塊、數(shù)據(jù)訪問(wèn)層、錯(cuò)誤處理這些命門入手。代碼覆蓋率最常見(jiàn)的價(jià)值就是揪出那些從來(lái)沒(méi)跑過(guò)的路徑和邊緣條件,這些地方恰恰是回歸缺陷和安全漏洞最愛(ài)的藏身處。與其湊一個(gè)漂亮的全量數(shù)字,不如讓關(guān)鍵鏈路做到“每個(gè)分支都有你測(cè)過(guò)的痕跡”。
下次再看覆蓋率面板,別只盯著那個(gè)百分?jǐn)?shù)點(diǎn)頭。問(wèn)一句:剩下那一點(diǎn)點(diǎn)沒(méi)覆蓋的,到底長(zhǎng)在哪些 if 的后半段?那才可能是下一次凌晨報(bào)警的起點(diǎn)。
特別聲明:以上內(nèi)容(如有圖片或視頻亦包括在內(nèi))為自媒體平臺(tái)“網(wǎng)易號(hào)”用戶上傳并發(fā)布,本平臺(tái)僅提供信息存儲(chǔ)服務(wù)。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.