3.jacoco統(tǒng)計(jì)自動化代碼覆蓋率

簡介

什么是Jacoco

Jacoco是一個(gè)開源的代碼覆蓋率工具,可以嵌入到Ant 、Maven中,并提供了EclEmma Eclipse插件,也可以使用JavaAgent技術(shù)監(jiān)控Java程序。很多第三方的工具提供了對Jacoco的集成,如sonar、Jenkins等。

什么是代碼覆蓋率

代碼覆蓋(Code coverage)是軟件測試中的一種度量,描述程式中源代碼被測試的比例和程度,所得比例稱為代碼覆蓋率。

代碼覆蓋率是衡量測試質(zhì)量的一個(gè)重要指標(biāo)。在對一個(gè)軟件產(chǎn)品進(jìn)行了單元測試、組裝測試、集成測試以及接口測試等繁多的測試之后,我們能不能就此對軟件的質(zhì)量產(chǎn)生一定的信心呢?這就需要我們對測試的質(zhì)量進(jìn)行考察。如果測試僅覆蓋了代碼的一小部分,那么不管我們寫了多少測試用例,我們也不能相信軟件質(zhì)量是有保證的。相反,如果測試覆蓋到了軟件的絕大部分代碼,我們就能對軟件的質(zhì)量有一個(gè)合理的信心。

代碼覆蓋分為下面五種情況:

函數(shù)覆蓋

函數(shù)覆蓋(Function Coverage),執(zhí)行到程序中的每一個(gè)函數(shù)(或副程式)。

語句覆蓋

語句覆蓋(Statement Coverage),又稱行覆蓋(Line Coverage),段覆蓋(Segment Coverage),基本塊覆蓋(Basic Block Coverage),這是最常用也是最常見的一種覆蓋方式,就是度量被測代碼中每個(gè)可執(zhí)行語句是否被執(zhí)行到了。這里說的是“可執(zhí)行語句”,因此就不會包括像C++的頭文件聲明,代碼注釋,空行,等等。非常好理解,只統(tǒng)計(jì)能夠執(zhí)行的代碼被執(zhí)行了多少行。需要注意的是,單獨(dú)一行的花括號{}也常常被統(tǒng)計(jì)進(jìn)去。語句覆蓋常常被人指責(zé)為“最弱的覆蓋”,它只管覆蓋代碼中的執(zhí)行語句,卻不考慮各種分支的組合等等。假如你的上司只要求你達(dá)到語句覆蓋,那么你可以省下很多功夫,但是,換來的確實(shí)測試效果的不明顯,很難更多地發(fā)現(xiàn)代碼中的問題。

判斷覆蓋

判斷覆蓋(Decision Coverage),又稱分支覆蓋(Branch Coverage),所有邊界覆蓋(All-Edges Coverage),基本路徑覆蓋(Basic Path Coverage),判定路徑覆蓋(Decision-Decision-Path)。它度量程序中每一個(gè)判定的分支是否都被測試到了。這句話是需要進(jìn)一步理解的,應(yīng)該非常容易和下面說到的條件覆蓋混淆。因此我們直接介紹第三種覆蓋方式,然后和判定覆蓋一起來對比,就明白兩者是怎么回事了。

條件覆蓋

條件覆蓋(Condition Coverage),它度量判定中的每個(gè)子表達(dá)式結(jié)果true和false是否被測試到了。

路徑覆蓋

路徑覆蓋(Path Coverage),又稱斷言覆蓋(Predicate Coverage)。它度量了是否函數(shù)的每一個(gè)分支都被執(zhí)行了。 這句話也非常好理解,就是所有可能的分支都執(zhí)行一遍,有多個(gè)分支嵌套時(shí),需要對多個(gè)分支進(jìn)行排列組合,可想而知,測試路徑隨著分支的數(shù)量指數(shù)級別增加。

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é)果。

指令覆蓋率

Jacoco最小的計(jì)數(shù)單元是單個(gè)java二進(jìn)制代碼指令。指令覆蓋率提供了代碼是否被執(zhí)行的信息。這個(gè)度量完全獨(dú)立源碼格式,并且總是可用,即使class文件里面沒有調(diào)試信息。

分支覆蓋率

Jacoco也計(jì)算分支的覆蓋率,包括所有的if和switch語句。這個(gè)度量計(jì)算一個(gè)方法里面的總分支數(shù),確定執(zhí)行和不執(zhí)行的分支數(shù)量。分支覆蓋率總是可用的,即使class文件里面沒有調(diào)試信息。注意異常處理是不在分支度量里面統(tǒng)計(jì)的。

Maven集成jacoco案例

pom文件配置

<!--jacoco單元測試覆蓋率>-->

? ? ? ? <dependency>

? ? ? ? ? ? <groupId>org.jacoco</groupId>

? ? ? ? ? ? <artifactId>jacoco-maven-plugin</artifactId>

? ? ? ? ? ? <version>0.8.3</version>

? ? ? ? </dependency>


? ? ? ? ?<plugin>

? ? ? ? ? ? ? ? <groupId>org.jacoco</groupId>

? ? ? ? ? ? ? ? <artifactId>jacoco-maven-plugin</artifactId>

? ? ? ? ? ? ? ? <version>0.8.3</version>

? ? ? ? ? ? ? ? <configuration>

? ? ? ? ? ? ? ? ? ? <includes>

? ? ? ? ? ? ? ? ? ? ? ? <include>com/**/*</include>

? ? ? ? ? ? ? ? ? ? </includes>

? ? ? ? ? ? ? ? </configuration>

? ? ? ? ? ? ? ? <executions>

? ? ? ? ? ? ? ? ? ? <execution>

? ? ? ? ? ? ? ? ? ? ? ? <id>pre-test</id>

? ? ? ? ? ? ? ? ? ? ? ? <goals>

? ? ? ? ? ? ? ? ? ? ? ? ? ? <goal>prepare-agent</goal>

? ? ? ? ? ? ? ? ? ? ? ? </goals>

? ? ? ? ? ? ? ? ? ? </execution>

? ? ? ? ? ? ? ? ? ? <execution>

? ? ? ? ? ? ? ? ? ? <id>post-test</id>

? ? ? ? ? ? ? ? ? ? <phase>test</phase>

? ? ? ? ? ? ? ? ? ? <goals>

? ? ? ? ? ? ? ? ? ? ? ? <goal>report</goal>

? ? ? ? ? ? ? ? ? ? </goals>

? ? ? ? ? ? ? ? ? ? </execution>

? ? ? ? ? ? ? </executions>

? ? ? ? ? ? </plugin>

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容