測(cè)試覆蓋率

文章內(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和模擬各種異常情況下的代碼行為

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市臀脏,隨后出現(xiàn)的幾起案子劝堪,更是在濱河造成了極大的恐慌,老刑警劉巖揉稚,帶你破解...
    沈念sama閱讀 216,496評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件秒啦,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡搀玖,警方通過查閱死者的電腦和手機(jī)余境,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,407評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來灌诅,“玉大人芳来,你說我怎么就攤上這事〔率埃” “怎么了即舌?”我有些...
    開封第一講書人閱讀 162,632評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)挎袜。 經(jīng)常有香客問我顽聂,道長(zhǎng)肥惭,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,180評(píng)論 1 292
  • 正文 為了忘掉前任紊搪,我火速辦了婚禮蜜葱,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘耀石。我一直安慰自己牵囤,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,198評(píng)論 6 388
  • 文/花漫 我一把揭開白布娶牌。 她就那樣靜靜地躺著奔浅,像睡著了一般。 火紅的嫁衣襯著肌膚如雪诗良。 梳的紋絲不亂的頭發(fā)上汹桦,一...
    開封第一講書人閱讀 51,165評(píng)論 1 299
  • 那天,我揣著相機(jī)與錄音鉴裹,去河邊找鬼舞骆。 笑死,一個(gè)胖子當(dāng)著我的面吹牛径荔,可吹牛的內(nèi)容都是我干的督禽。 我是一名探鬼主播,決...
    沈念sama閱讀 40,052評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼总处,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼狈惫!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起鹦马,我...
    開封第一講書人閱讀 38,910評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤胧谈,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后荸频,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體菱肖,經(jīng)...
    沈念sama閱讀 45,324評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,542評(píng)論 2 332
  • 正文 我和宋清朗相戀三年旭从,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了稳强。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,711評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡和悦,死狀恐怖退疫,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情鸽素,我是刑警寧澤蹄咖,帶...
    沈念sama閱讀 35,424評(píng)論 5 343
  • 正文 年R本政府宣布,位于F島的核電站付鹿,受9級(jí)特大地震影響澜汤,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜舵匾,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,017評(píng)論 3 326
  • 文/蒙蒙 一俊抵、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧坐梯,春花似錦徽诲、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,668評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至蹋辅,卻和暖如春钱贯,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背侦另。 一陣腳步聲響...
    開封第一講書人閱讀 32,823評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工秩命, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人褒傅。 一個(gè)月前我還...
    沈念sama閱讀 47,722評(píng)論 2 368
  • 正文 我出身青樓弃锐,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親殿托。 傳聞我的和親對(duì)象是個(gè)殘疾皇子霹菊,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,611評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容