Jacoco的原理(各个覆盖率的解释)
覆蓋率計(jì)數(shù)器
Jacoco使用一系列的不同的計(jì)數(shù)器來做覆蓋率的度量計(jì)算。所有這些計(jì)數(shù)器都是從java的class文件中獲取信息,這些class文件可以(可選)包含調(diào)試的信息在里面。即使在沒有源碼的情況下,這種方法也可以實(shí)時(shí)有效地對應(yīng)用程序進(jìn)行度量和分析。在大部分情況下,收集到的信息可以映射到源碼,可視化到每一行代碼的粒度。但這種方法還是有一些限制。這些class文件必須使用調(diào)試信息來編譯,這樣才可以計(jì)算行的覆蓋率和提供出源碼的高亮。但不是所有的JAVA語言的結(jié)構(gòu)都可以直接編譯成一致的二進(jìn)制代碼。在這種情況下,java 編譯器會創(chuàng)建所謂的“合成”代碼,會導(dǎo)致產(chǎn)生一些不期望得到的覆蓋率結(jié)果。
指令(C0 Coverage)
Jacoco最小的計(jì)數(shù)單元是單個(gè)java二進(jìn)制代碼指令。指令覆蓋率提供了代碼是否被執(zhí)行的信息。這個(gè)度量完全獨(dú)立源碼格式,并且總是可用,即使class文件里面沒有調(diào)試信息。
分支(C1 Coverage)
Jacoco也計(jì)算分支的覆蓋率,包括所有的if和switch語句。這個(gè)度量計(jì)算一個(gè)方法里面的總分支數(shù),確定執(zhí)行和不執(zhí)行的分支數(shù)量。分支覆蓋率總是可用的,即使class文件里面沒有調(diào)試信息。注意異常處理是不在分支度量里面統(tǒng)計(jì)的。
如果class文件使用調(diào)試信息編譯的話,產(chǎn)生的覆蓋率可以映射到源碼行并且高亮提示:
- 沒有覆蓋:在這一行中沒有分支被執(zhí)行(紅色方塊)
- 部分覆蓋:這一行的分支中只有一部分被執(zhí)行(黃色方塊)
- 完全覆蓋:這一行的所有分支都被執(zhí)行(綠色方塊)
圈復(fù)雜度
Jacoco同樣可以為每一個(gè)非抽象方法計(jì)算復(fù)雜度,最終計(jì)算出類、包和組的復(fù)雜度。根據(jù)由McCabe1996圈復(fù)雜度的定義是,在(線性)組合中,計(jì)算在一個(gè)方法里面所有可能路徑的最小數(shù)目。所以復(fù)雜度可以作為度量單元測試是否有完全覆蓋所有場景的一個(gè)依據(jù)。復(fù)雜度即使是在沒有調(diào)試信息的情況下也可以計(jì)算。
圈復(fù)雜度V(G)的正式定義是基于方法的控制流圖的有向圖表示:
v(G) = E – N + 2
E是邊界的數(shù)量,N是節(jié)點(diǎn)的數(shù)量。Jacoco 基于下面的方程來計(jì)算復(fù)雜度,B是分支的數(shù)量,D是決策點(diǎn)的數(shù)量:
v(G) = B – D + 1
基于每個(gè)分支的被覆蓋情況,Jacoco也為每個(gè)方法計(jì)算覆蓋和缺失的復(fù)雜度。缺失的復(fù)雜度同樣表示測試案例沒有完全覆蓋到這個(gè)模塊。注意Jacoco不將異常處理作為分支,try/catch塊也同樣不增加復(fù)雜度。
行
所有的class文件使用debug信息編譯之后,就可以計(jì)算行的覆蓋率信息。一行源代碼是否被執(zhí)行,要看這一行中是否至少有一個(gè)指令被執(zhí)行。
由于實(shí)際上一行代碼一般被編譯成多個(gè)二進(jìn)制代碼指令,這樣源碼在高亮顯示時(shí),會顯示成3種不同的狀態(tài):
- 沒有覆蓋:這一行中沒有指令被執(zhí)行(紅色背景)
- 部分覆蓋:這一行中只有一部分指令被執(zhí)行(黃色背景)
- 完全覆蓋:這一行中所有指令都被覆蓋(綠色背景
方法
每一個(gè)非抽象方法至少包含一個(gè)指令。一個(gè)方法是否執(zhí)行取決于方法中是否有至少一個(gè)指令被執(zhí)行。在Jacoco中,構(gòu)造器和靜態(tài)初始化同樣會像方法一樣統(tǒng)計(jì)。其中一些方法可能沒有可以直接對應(yīng)的源碼,比如默認(rèn)構(gòu)造器或常量的初始化命令。
類
一個(gè)方法是否執(zhí)行取決于類中是否有至少一個(gè)方法被執(zhí)行。注意Jacoco認(rèn)為構(gòu)造器和靜態(tài)初始化都是方法。Java的接口一般包含靜態(tài)初始化,所以接口也同樣被認(rèn)為是可執(zhí)行的類。
超強(qiáng)干貨來襲 云風(fēng)專訪:近40年碼齡,通宵達(dá)旦的技術(shù)人生總結(jié)
以上是生活随笔為你收集整理的Jacoco的原理(各个覆盖率的解释)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 软件工程概论第一章
- 下一篇: simware模拟交换机的方法