文章內(nèi)容來源于《軟件測(cè)試52講》
測(cè)試覆蓋率通常被用來衡量測(cè)試的充分性和完整性
從廣義的角度來講软啼,主要分為兩大類:
- 面向項(xiàng)目的需求覆蓋率
- 更偏向技術(shù)的代碼覆蓋率
1航背、需求覆蓋率
需求覆蓋率是指測(cè)試對(duì)需求的覆蓋程度,通常的做法是將每一條分解后的軟件需求和對(duì)應(yīng)的測(cè)試建立一對(duì)多的映射關(guān)系统捶,最終目標(biāo)是保證測(cè)試可以覆蓋每個(gè)需求榆芦,以保證軟件產(chǎn)品的質(zhì)量。
需求覆蓋率統(tǒng)計(jì)方法屬于傳統(tǒng)瀑布模型下的軟件工程實(shí)踐喘鸟,傳統(tǒng)瀑布模型追求自上而下地制定計(jì)劃、分析需求驻右、設(shè)計(jì)軟件什黑、編寫代碼、測(cè)試和運(yùn)維等堪夭,在流程上是重量級(jí)的愕把,已經(jīng)很難適應(yīng)當(dāng)今互聯(lián)網(wǎng)時(shí)代下的敏捷開發(fā)實(shí)踐。
所以森爽,互聯(lián)網(wǎng)測(cè)試項(xiàng)目中很少直接基于需求來衡量測(cè)試覆蓋率恨豁,而是將軟件需求轉(zhuǎn)換成測(cè)試需求,然后基于測(cè)試需求再來設(shè)計(jì)測(cè)試點(diǎn)爬迟。
因此橘蜜,現(xiàn)在人們口中的測(cè)試覆蓋率,通常默認(rèn)指代碼覆蓋率,而不是需求覆蓋率计福。
2跌捆、代碼覆蓋率
代碼覆蓋率是指,至少被執(zhí)行了一次的條目數(shù)占整個(gè)條目數(shù)的百分比象颖。
如果“條目數(shù)”是語句佩厚,對(duì)應(yīng)的就是代碼行覆蓋率;
如果“條目數(shù)”是函數(shù)说订,對(duì)應(yīng)的就是函數(shù)覆蓋率抄瓦;
如果“條目數(shù)”是路徑,那么對(duì)應(yīng)的就是路徑覆蓋率陶冷。
依此類推钙姊,就可以得到絕大多數(shù)常見的代碼覆蓋率類型的定義。
2..1 常見覆蓋率
行覆蓋率又稱為語句覆蓋率埃叭,指已經(jīng)被執(zhí)行到的語句占總可執(zhí)行語句(不包含類似 C++ 的頭文件聲明摸恍、代碼注釋、空行等等)的百分比赤屋。
這是最常用也是要求最低的覆蓋率指標(biāo)立镶。實(shí)際項(xiàng)目中通常會(huì)結(jié)合判定覆蓋率或者條件覆蓋率一起使用。判定覆蓋又稱分支覆蓋类早,用以度量程序中每一個(gè)判定的分支是否都被測(cè)試到了媚媒,即代碼中每個(gè)判斷的取真分支和取假分支是否各被覆蓋至少各一次。
比如涩僻,對(duì)于 if(a>0 && b>0)缭召,就要求覆蓋“a>0 && b>0”為 TURE 和 FALSE 各一次。條件覆蓋是指判定中的每個(gè)條件的可能取值至少滿足一次逆日,度量判定中的每個(gè)條件的結(jié)果 TRUE 和 FALSE 是否都被測(cè)試到了嵌巷。
比如,對(duì)于 if(a>0 && b>0)室抽,就要求“a>0”取 TRUE 和 FALSE 各一次搪哪,同時(shí)要求“b>0”取 TRUE 和 FALSE 各一次。
2.2 價(jià)值
現(xiàn)在很多項(xiàng)目都在單元測(cè)試以及集成測(cè)試階段統(tǒng)計(jì)代碼覆蓋率坪圾,但是統(tǒng)計(jì)代碼覆蓋率僅僅是手段晓折,必須透過現(xiàn)象看到事物的本質(zhì),才能從根本上保證軟件整體的質(zhì)量兽泄。
統(tǒng)計(jì)代碼覆蓋率的根本目的是找出潛在的遺漏測(cè)試用例漓概,并有針對(duì)性的進(jìn)行補(bǔ)充,同時(shí)還可以識(shí)別出代碼中那些由于需求變更等原因造成的不可達(dá)的廢棄代碼病梢。
通常我們希望代碼覆蓋率越高越好胃珍,代碼覆蓋率越高越能說明你的測(cè)試用例設(shè)計(jì)是充分且完備的,但你也會(huì)發(fā)現(xiàn)測(cè)試的成本會(huì)隨著代碼覆蓋率的提高以類似指數(shù)級(jí)的方式迅速增加。
如果想達(dá)到 70% 的代碼覆蓋率堂鲜,你可能只需要 30 分鐘的時(shí)間成本栈雳。
但如果你想把代碼覆蓋率提高到 90%,那么為了這額外的 20%缔莲,你可能花的時(shí)間就遠(yuǎn)不止 30 分鐘了哥纫。更進(jìn)一步,你如果想達(dá)到 100% 的代碼覆蓋率痴奏,可想而知你花費(fèi)的代價(jià)就會(huì)更大了蛀骇。
那么,為什么代碼覆蓋率的提高读拆,需要付出越來越大的代價(jià)呢擅憔?因?yàn)樵诤笃冢枰罅康臉洞a檐晕、Mock 代碼和全局變量的配合來控制執(zhí)行路徑暑诸。
所以,在軟件企業(yè)中辟灰,只有單元測(cè)試階段對(duì)代碼覆蓋率有較高的要求个榕。因?yàn)閺募夹g(shù)實(shí)現(xiàn)上講,單元測(cè)試可以最大化地利用打樁技術(shù)來提高覆蓋率芥喇。而你如果想在集成測(cè)試或者是 GUI 測(cè)試階段將代碼覆蓋率提高到一定量級(jí)西采,那你所要付出的代價(jià)是巨大的,而且在很多情況下根本就實(shí)現(xiàn)不了继控。
2.3 局限性
我先來問你一個(gè)問題械馆,如果你通過努力,已經(jīng)把某個(gè)函數(shù)的 MC/DC 代碼覆蓋率(MC/DC 覆蓋率是最高標(biāo)準(zhǔn)的代碼覆蓋率指標(biāo)武通,除了直接關(guān)系人生命安全的軟件以外霹崎,很少會(huì)有項(xiàng)目會(huì)有嚴(yán)格的 MC/DC 覆蓋率要求)做到了 100%,軟件質(zhì)量是否就真的高枕無憂冶忱、萬無一失了呢仿畸?
代碼覆蓋率的計(jì)算是基于現(xiàn)有代碼的,并不能發(fā)現(xiàn)那些“未考慮某些輸入”以及“未處理某些情況”形成的缺陷
如果一個(gè)被測(cè)函數(shù)里面只有一行代碼朗和,只要這個(gè)函數(shù)被調(diào)用過了,那么衡量這一行代碼質(zhì)量的所有覆蓋率指標(biāo)都會(huì)是 100%簿晓,但是這個(gè)函數(shù)是否真正實(shí)現(xiàn)了應(yīng)該需要實(shí)現(xiàn)的功能呢眶拉?
顯然,代碼覆蓋率反映的僅僅是已有代碼的哪些邏輯被執(zhí)行過了憔儿,哪些邏輯還沒有被執(zhí)行過忆植。以此為依據(jù),你可以補(bǔ)充測(cè)試用例,可以去測(cè)試那些還沒有覆蓋到的執(zhí)行路徑朝刊。但也是僅此而已耀里,對(duì)于那些壓根還沒有代碼實(shí)現(xiàn)的部分,基于代碼覆蓋率的統(tǒng)計(jì)指標(biāo)就無能為力了拾氓。
總結(jié)來講冯挎,高的代碼覆蓋率不一定能保證軟件的質(zhì)量,但是低的代碼覆蓋率一定不能能保證軟件的質(zhì)量咙鞍。
2.4 工具
- JaCoCo:一款 Java 代碼的主流開源覆蓋率工具房官,可以很方便地嵌入到 Ant、Maven 中续滋,并且和很多主流的持續(xù)集成工具以及代碼靜態(tài)檢查工具翰守,比如 Jekins 和 Sonar 等,都有很好的集成疲酌。
3蜡峰、總結(jié)
實(shí)際項(xiàng)目中,無論覆蓋率多高朗恳,沒有根據(jù)需求正確的寫assert其實(shí)也是無法利用測(cè)試用例發(fā)現(xiàn)bug湿颅,提高代碼質(zhì)量,在實(shí)際的測(cè)試用例中僻肖,正向的case一般比較容易寫肖爵,難得是測(cè)試error handling和模擬各種異常情況下的代碼行為