JaCoCo覆蓋率計(jì)數(shù)器介紹

Jacoco.jpg

注意:此文譯自JaCoCo官方介紹文檔启妹,如有出錯(cuò)之處靶擦,煩請(qǐng)指出再膳,不勝感激挺勿。點(diǎn)擊此處,查看原文

覆蓋率計(jì)數(shù)器

JaCoCo使用一組不同的計(jì)數(shù)器來計(jì)算覆蓋率指標(biāo)喂柒。這些計(jì)數(shù)器根據(jù)Java類文件包含的信息(基本上是Java字節(jié)碼指令和調(diào)試信息有選擇地嵌入類文件)被分成不同種類不瓶。因此禾嫉,即使在沒有源碼的情況下,這種方法也允許高效的動(dòng)態(tài)測(cè)量和分析應(yīng)用程序湃番。

在大多數(shù)情況下,收集到的信息可以被映射回源代碼吭露,然后可視化成行級(jí)別的覆蓋率報(bào)告吠撮。然而,這種方法也有局限性讲竿。調(diào)試信息必須被編譯到類文件泥兰,以便計(jì)算行粒度覆蓋率,并提供源代碼高亮顯示题禀。并不是所有的Java語言結(jié)構(gòu)都可以直接編譯成字節(jié)碼鞋诗,在這種情況下,Java編譯器創(chuàng)建所謂的合成代碼有時(shí)會(huì)導(dǎo)致意想不到的代碼覆蓋率結(jié)果。

指令(C0 Coverage)

最小單元JaCoCo計(jì)數(shù)是單個(gè)Java字節(jié)碼指令迈嘹,指令覆蓋提供了被執(zhí)行或未被執(zhí)行的代碼量信息削彬。這個(gè)指標(biāo)是完全獨(dú)立于源格式的, 即使在沒有調(diào)試信息的類文件秀仲,也是可用的,融痛。

分支(C1 Coverage)

JaCoCo也計(jì)算所有if和switch語句的分支覆蓋率。這個(gè)指標(biāo)項(xiàng)計(jì)算在一個(gè)方法中的總分支數(shù),并決定了已執(zhí)行和未執(zhí)行分支的數(shù)量神僵。即使在沒有調(diào)試信息的類文件雁刷,分支覆蓋也總是可用的。注意保礼,在此計(jì)數(shù)器的定義中沛励,異常處理并不屬于分支。

如果類文件被編譯了調(diào)式信息決策點(diǎn)炮障,就能夠被相應(yīng)地映射回源碼行以及高亮顯示:

  • 未覆蓋:所有分支行都未被執(zhí)行(紅色鉆石)
  • 部分覆蓋:只有一部分行分支被執(zhí)行(黃色鉆石)
  • 全覆蓋:所有的行分支都已被執(zhí)行(綠色鉆石)

圈復(fù)雜度

JaCoCo也為每個(gè)非抽象方法計(jì)算圈復(fù)雜度目派,總結(jié)類、包和組的復(fù)雜性胁赢。根據(jù)McCabe1996的定義址貌,圈復(fù)雜度是,在(線性)組合徘键,通過一個(gè)方法來生成所有可能的路徑中的最小數(shù)量路徑练对。因此,復(fù)雜性值可以作為單元測(cè)試用例的數(shù)量完全覆蓋一個(gè)軟件某一塊的指標(biāo)吹害。即使在沒有調(diào)試信息的類文件螟凭,復(fù)雜度也通常都是可計(jì)算的。

圈復(fù)雜度的正式定義v(G)是基于方法的控制流圖表示的有向圖:

v(G) = E - N + 2

E表示邊緣數(shù)它呀,N表示節(jié)點(diǎn)數(shù)螺男。JaCoCo通過以基于分支數(shù)(B)和決策點(diǎn)(D)的等效方程來計(jì)算一個(gè)方法的圈復(fù)雜度:

v(G) = B - D + 1

根據(jù)每個(gè)分支的覆蓋率情況棒厘,JaCoCo還為每個(gè)方法計(jì)算已覆蓋和未覆蓋的復(fù)雜性,未覆蓋復(fù)雜度又為完全覆蓋一個(gè)模塊所缺失的測(cè)試用例數(shù)提供了指標(biāo)下隧。注意,JaCoCo并不考慮異常處理分支奢人,try / catch塊也不會(huì)增加復(fù)雜性。

對(duì)所有已編譯調(diào)試信息的類文件,每一行的覆蓋率信息也可以計(jì)算淆院。當(dāng)至少一條指令被分配到某一源碼行時(shí)何乎,該源碼行被認(rèn)為已經(jīng)執(zhí)行。

由于一行通常 編譯多個(gè)字節(jié)碼指令土辩,每一行包含的源代碼高亮顯示有三種不同的狀態(tài):

  • 未覆蓋:該行沒有指令被執(zhí)行(紅色背景)
  • 部分覆蓋:該行只有部分指令被執(zhí)行(黃色背景)
  • 全覆蓋:該行包含的所有指令都被執(zhí)行(綠色背景)

根據(jù)源格式支救,一行源代碼可能指定了多個(gè)方法或多個(gè)類。因此拷淘,方法的行計(jì)數(shù)各墨,不能簡(jiǎn)單地添加到獲得包含類的總數(shù)。這同樣適用于在一個(gè)源文件的多個(gè)類启涯。JaCoCo基于實(shí)際的源代碼行覆蓋來計(jì)算類和源文件的覆蓋率贬堵。

方法##

每個(gè)非抽象方法至少包含一條指令。當(dāng)方法至少一條指令被執(zhí)行结洼,則被認(rèn)為該方法被執(zhí)行過扁瓢。因?yàn)镴aCoCo是基于字節(jié)碼級(jí)別的,構(gòu)造函數(shù)和靜態(tài)初始化也被當(dāng)作方法計(jì)算补君。 其中有些方法引几,如隱式,從而生成默認(rèn)構(gòu)造函數(shù)或常量初始值設(shè)定,可能沒有直接對(duì)應(yīng)到Java源代碼中挽铁。

當(dāng)一個(gè)類至少有一個(gè)方法被執(zhí)行過伟桅,則認(rèn)為該類被執(zhí)行過。注意叽掘,JaCoCo 將構(gòu)造方法和靜態(tài)初始化方法也當(dāng)作被執(zhí)行過的方法楣铁。包含靜態(tài)初始化方法的Java接口類型,也被當(dāng)作已執(zhí)行的類更扁。

閱讀原文

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末盖腕,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子浓镜,更是在濱河造成了極大的恐慌溃列,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,042評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件膛薛,死亡現(xiàn)場(chǎng)離奇詭異听隐,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)哄啄,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,996評(píng)論 2 384
  • 文/潘曉璐 我一進(jìn)店門雅任,熙熙樓的掌柜王于貴愁眉苦臉地迎上來风范,“玉大人,你說我怎么就攤上這事沪么∨鹦觯” “怎么了?”我有些...
    開封第一講書人閱讀 156,674評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵禽车,是天一觀的道長(zhǎng)寇漫。 經(jīng)常有香客問我,道長(zhǎng)哭当,這世上最難降的妖魔是什么猪腕? 我笑而不...
    開封第一講書人閱讀 56,340評(píng)論 1 283
  • 正文 為了忘掉前任冗澈,我火速辦了婚禮钦勘,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘亚亲。我一直安慰自己彻采,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,404評(píng)論 5 384
  • 文/花漫 我一把揭開白布捌归。 她就那樣靜靜地躺著肛响,像睡著了一般。 火紅的嫁衣襯著肌膚如雪惜索。 梳的紋絲不亂的頭發(fā)上特笋,一...
    開封第一講書人閱讀 49,749評(píng)論 1 289
  • 那天,我揣著相機(jī)與錄音巾兆,去河邊找鬼猎物。 笑死,一個(gè)胖子當(dāng)著我的面吹牛角塑,可吹牛的內(nèi)容都是我干的蔫磨。 我是一名探鬼主播,決...
    沈念sama閱讀 38,902評(píng)論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼圃伶,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼堤如!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起窒朋,我...
    開封第一講書人閱讀 37,662評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤搀罢,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后侥猩,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體魄揉,經(jīng)...
    沈念sama閱讀 44,110評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,451評(píng)論 2 325
  • 正文 我和宋清朗相戀三年拭宁,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了洛退。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片瓣俯。...
    茶點(diǎn)故事閱讀 38,577評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖兵怯,靈堂內(nèi)的尸體忽然破棺而出彩匕,到底是詐尸還是另有隱情,我是刑警寧澤媒区,帶...
    沈念sama閱讀 34,258評(píng)論 4 328
  • 正文 年R本政府宣布驼仪,位于F島的核電站,受9級(jí)特大地震影響袜漩,放射性物質(zhì)發(fā)生泄漏绪爸。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,848評(píng)論 3 312
  • 文/蒙蒙 一宙攻、第九天 我趴在偏房一處隱蔽的房頂上張望奠货。 院中可真熱鬧,春花似錦座掘、人聲如沸递惋。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,726評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)萍虽。三九已至,卻和暖如春形真,著一層夾襖步出監(jiān)牢的瞬間杉编,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,952評(píng)論 1 264
  • 我被黑心中介騙來泰國(guó)打工咆霜, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留邓馒,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,271評(píng)論 2 360
  • 正文 我出身青樓裕便,卻偏偏與公主長(zhǎng)得像绒净,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子偿衰,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,452評(píng)論 2 348

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

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理挂疆,服務(wù)發(fā)現(xiàn),斷路器下翎,智...
    卡卡羅2017閱讀 134,628評(píng)論 18 139
  • 2016年國(guó)慶假期終于把此書過完视事,整理筆記和體會(huì)于此胆萧。 關(guān)于書名 書名源于俄羅斯的演員斯坦尼斯拉夫斯基創(chuàng)作的《演員...
    李劍飛的簡(jiǎn)書閱讀 7,221評(píng)論 2 65
  • 這世間,唯有時(shí)間對(duì)每個(gè)人是最公平的。 此時(shí)不改變跌穗,明天你還是如此模樣订晌。 不想把未來想的太復(fù)雜,因?yàn)槟阌肋h(yuǎn)不知道明天...
    miss_默芝閱讀 198評(píng)論 0 0
  • 在這里有兩種人,他們都要報(bào)考北大的研究生了羹唠,正在準(zhǔn)備階段奕枢。小A逢人聊天便會(huì)提到自己要考北大的研究生,看到別人稱贊的...
    秋羽閱讀 423評(píng)論 0 0
  • 一盞小燈擺在床頭佩微。這樣看來缝彬,冬夜的黑幕頃刻間也顯出幾分溫暖。從手機(jī)里跑出小時(shí)候的旋律哺眯,這樣就很好谷浅。能幫我暫時(shí)離...
    七漁安閱讀 294評(píng)論 0 1