都100%代碼覆蓋了胰舆,還會有什么問題?

很多人看到這個標題時蹬挤,都會想“你都100%代碼覆蓋了缚窿,怎么還會有問題呢?”
讓我們看一下代碼例子:

public class TestCalculator {

       public Double add(Double a, Double b) {

              return a + b;}

}

再看看用junit寫出的測試代碼:

@Test
public void testAdd() {

       Double a = new Double(1);
       
       Double b = new Double(2);
       
       Double c = new Double(3);
       
       assertEquals(c, testCalculator.add(a, b));

}

當我們使用EclEmma或者Jacoco來進行覆蓋測試時焰扳,對于這個類倦零,我們將得到100%測試覆蓋率。

一切看起來都那么的完美吨悍,真是這樣的嗎扫茅?

好吧,讓我們來來看看另一個測試育瓜,當其中一個變量為null時葫隙,返回值將會是什么?

@Test
public void testAddNullPointerException() {

       Double a = new Double(1);

       Double b = null;

       Double c = new Double(3);

       assertEquals(c, testCalculator.add(a, b));

}

好了爆雹,你會發(fā)現(xiàn)盡管覆蓋率為100%停蕉,但程序卻拋出了NullPointerException。

那么肯定有人會問钙态,這樣的話單元測試覆蓋率的高低都不能作為衡量項目代碼質(zhì)量的指標慧起,那么我們要單元測試還有什么用?

首先册倒,我想我們可能搞錯了測試覆蓋的定義蚓挤。

我們先聽聽Martin Fowler對于測試覆蓋的定義

Test coverage is a useful tool for finding untested parts of a codebase. Test coverage is of little use as a numeric statement of how good your tests are.

(圖片來自:https://martinfowler.com/bliki/TestCoverage.html

他認為:把測試覆蓋作為質(zhì)量目標沒有任何意義,我們應(yīng)該把它作為一種發(fā)現(xiàn)未被測試覆蓋的代碼的手段驻子。

所以100%的代碼覆蓋率還值得追求嗎?

當然灿意,這應(yīng)該是每個程序員畢生的追求之一,但是如果從項目角度考慮ROI(投入產(chǎn)出比)崇呵,對于需要快速上線的短期項目缤剧,需要注重的是讓測試覆蓋核心功能代碼。如果你的項目是一個長期項目域慷,那么高覆蓋率是非常有必要的荒辕,它意味著高可維護性,以及更少的bug犹褒。(前提是你的測試采用TDD/BDD方式編寫抵窒,我見過將測試代碼寫的一團糟的人,看著他的代碼叠骑,我寧愿重新寫一遍)

那么對于一個項目來說李皇,覆蓋率應(yīng)該達到多少?

其實沒有適用于所有項目的數(shù)值宙枷,每個項目都應(yīng)有自己的閾值掉房,但共性是,測試必須覆蓋主要業(yè)務(wù)場景慰丛,代碼的邏輯分支也必須盡可能的覆蓋圃阳。

如何改進你的項目代碼覆蓋率?

首先我們要閱讀和理解項目代碼璧帝,找出其中需要測試并且與業(yè)務(wù)強相關(guān)的代碼捍岳,結(jié)合sonar等代碼質(zhì)量管理平臺,從代碼編寫規(guī)范睬隶、復(fù)雜度锣夹、重復(fù)代碼等方面進行代碼重構(gòu),進一步提高項目的可維護性與可讀性苏潜。

這也意味著重構(gòu)银萍,重構(gòu)的同時,你需要更多的測試來保證你重構(gòu)代碼的正確性恤左。

其次要對code coverage進行度量分析贴唇,那么我們應(yīng)該怎么度量code coverage搀绣?

一般來說我們從以下四個維度來度量,如上圖所示:

  1. 行覆蓋率(line coverage):度量被測代碼中每個可執(zhí)行語句是否都被執(zhí)行到戳气,但不包括java import链患,空行,注釋等瓶您。
  2. 函數(shù)覆蓋率(function coverage):度量被測代碼中每個定義的函數(shù)是否都被調(diào)用麻捻。
  3. 分支覆蓋率(branch coverage):度量被測代碼中每一個判定的分支是否都被測試到。
  4. 語句覆蓋率(statement coverage):度量被測代碼是否每個語句都被執(zhí)行呀袱。

所以行覆蓋率的高低不能說明項目的好壞贸毕,我們要從多方面進行思考,一般我們遵循的標準應(yīng)是:**函數(shù)覆蓋率 > 分支覆蓋率 > 語句覆蓋率****夜赵。

代碼覆蓋率最重要的意義在于:

  • 閱讀分析之前項目中未覆蓋部分的代碼明棍,進而反推在前期QA以及相關(guān)測試人員在進行黑盒測試設(shè)計時是否考慮充分,沒有覆蓋到的代碼是否是測試設(shè)計的盲點寇僧,為什么沒有考慮到击蹲?是需求或者UX設(shè)計不夠清晰,還是測試設(shè)計的理解有誤婉宰。

  • 檢測出程序中的廢代碼歌豺,可以逆向反推代碼設(shè)計中不合理的地方,提醒設(shè)計/開發(fā)人員理清代碼邏輯關(guān)系心包,提升代碼質(zhì)量类咧。

  • 代碼覆蓋率高不能說明代碼質(zhì)量高,但是反過來看蟹腾,代碼覆蓋率低痕惋,代碼質(zhì)量絕對不會高到哪里去,可以作為測試自我審視的重要工具之一娃殖。

結(jié)束語

單元測試的覆蓋率并不只是為了取悅客戶或者管理層的數(shù)據(jù)值戳,它能夠?qū)崒嵲谠诜磻?yīng)項目中代碼的健康程度,幫助我們更好的改善了代碼的質(zhì)量炉爆,增加了我們對所編寫代碼的信心堕虹。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市芬首,隨后出現(xiàn)的幾起案子赴捞,更是在濱河造成了極大的恐慌,老刑警劉巖郁稍,帶你破解...
    沈念sama閱讀 218,036評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件赦政,死亡現(xiàn)場離奇詭異,居然都是意外死亡耀怜,警方通過查閱死者的電腦和手機恢着,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,046評論 3 395
  • 文/潘曉璐 我一進店門桐愉,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人掰派,你說我怎么就攤上這事从诲。” “怎么了碗淌?”我有些...
    開封第一講書人閱讀 164,411評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長抖锥。 經(jīng)常有香客問我亿眠,道長,這世上最難降的妖魔是什么磅废? 我笑而不...
    開封第一講書人閱讀 58,622評論 1 293
  • 正文 為了忘掉前任纳像,我火速辦了婚禮,結(jié)果婚禮上拯勉,老公的妹妹穿的比我還像新娘竟趾。我一直安慰自己,他們只是感情好宫峦,可當我...
    茶點故事閱讀 67,661評論 6 392
  • 文/花漫 我一把揭開白布岔帽。 她就那樣靜靜地躺著,像睡著了一般导绷。 火紅的嫁衣襯著肌膚如雪犀勒。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,521評論 1 304
  • 那天妥曲,我揣著相機與錄音贾费,去河邊找鬼。 笑死檐盟,一個胖子當著我的面吹牛褂萧,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播葵萎,決...
    沈念sama閱讀 40,288評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼导犹,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了羡忘?” 一聲冷哼從身側(cè)響起锡足,我...
    開封第一講書人閱讀 39,200評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎壳坪,沒想到半個月后舶得,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,644評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡爽蝴,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,837評論 3 336
  • 正文 我和宋清朗相戀三年沐批,在試婚紗的時候發(fā)現(xiàn)自己被綠了纫骑。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,953評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡九孩,死狀恐怖先馆,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情躺彬,我是刑警寧澤煤墙,帶...
    沈念sama閱讀 35,673評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站宪拥,受9級特大地震影響仿野,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜她君,卻給世界環(huán)境...
    茶點故事閱讀 41,281評論 3 329
  • 文/蒙蒙 一脚作、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧缔刹,春花似錦球涛、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,889評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至鸟廓,卻和暖如春魏烫,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背肝箱。 一陣腳步聲響...
    開封第一講書人閱讀 33,011評論 1 269
  • 我被黑心中介騙來泰國打工哄褒, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人煌张。 一個月前我還...
    沈念sama閱讀 48,119評論 3 370
  • 正文 我出身青樓呐赡,卻偏偏與公主長得像,于是被迫代替她去往敵國和親骏融。 傳聞我的和親對象是個殘疾皇子链嘀,可洞房花燭夜當晚...
    茶點故事閱讀 44,901評論 2 355

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