在idea中使用JaCoCo插件統(tǒng)計(jì)單元測(cè)試覆蓋率的實(shí)現(xiàn)
在后臺(tái)工程師開(kāi)發(fā)完新代碼交給QA進(jìn)行測(cè)試時(shí),軟件測(cè)試人員一般都會(huì)要求后臺(tái)開(kāi)發(fā)對(duì)單元測(cè)試的覆蓋率達(dá)到一定的標(biāo)準(zhǔn);例如我們的標(biāo)準(zhǔn)是分支覆蓋率達(dá)到50%以上,函數(shù)覆蓋率達(dá)到50%以上。
在idea中查看覆蓋率挺簡(jiǎn)單的,idea中支持三種插件來(lái)查看覆蓋率,每種插件統(tǒng)計(jì)明細(xì)各有千秋,分別是idea自帶插件、JaCoCo、Emma。
在idea中打開(kāi)一個(gè)測(cè)試類,點(diǎn)擊右上角“Edit Configurations”按鈕,如下圖所示:
然后會(huì)彈出一個(gè)框,左側(cè)菜單欄顯示JUnit欄目,右邊我們選擇“Code Coverage"選項(xiàng)卡,下面有一個(gè)”choose coverage runner“下拉菜單,默認(rèn)是idea自帶的,我們可以切換成其他的(只不過(guò)需要在pom中配置一下),如下圖所示:
idea默認(rèn)自帶的插件,統(tǒng)計(jì)出來(lái)的覆蓋率只包含classes、method、line,不太詳細(xì),不能滿足我們的要求;所以一般使用JaCoCo插件來(lái)統(tǒng)計(jì),我們切換成JaCoCo插件以后,緊接著在maven的pom文件中這樣配置:
(1)添加依賴
<dependency> <groupId>org.jacoco</groupId> <artifactId>jacoco-maven-plugin</artifactId> <version>0.8.2</version> </dependency>
(2)配置plugins
<plugin> <groupId>org.jacoco</groupId> <artifactId>jacoco-maven-plugin</artifactId> <version>0.8.2</version> <configuration> <destFile>target/coverage-reports/jacoco-unit.exec</destFile> <dataFile>target/coverage-reports/jacoco-unit.exec</dataFile> <includes> <include>**/service/**</include> <include>**/controller/**</include> <!--<include>**/service/impl/*.class</include>--> </includes> <!-- rules里面指定覆蓋規(guī)則 --> <rules> <rule implementation="org.jacoco.maven.RuleConfiguration"> <element>BUNDLE</element> <limits> <!-- 指定方法覆蓋到50% --> <limit implementation="org.jacoco.report.check.Limit"> <counter>METHOD</counter> <value>COVEREDRATIO</value> <minimum>0.50</minimum> </limit> <!-- 指定分支覆蓋到50% --> <limit implementation="org.jacoco.report.check.Limit"> <counter>BRANCH</counter> <value>COVEREDRATIO</value> <minimum>0.50</minimum> </limit> <!-- 指定類覆蓋到100%,不能遺失任何類 --> <limit implementation="org.jacoco.report.check.Limit"> <counter>CLASS</counter> <value>MISSEDCOUNT</value> <maximum>0</maximum> </limit> </limits> </rule> </rules> </configuration> <executions> <execution> <id>jacoco-initialize</id> <goals> <goal>prepare-agent</goal> </goals> </execution> <!--這個(gè)check:對(duì)代碼進(jìn)行檢測(cè),控制項(xiàng)目構(gòu)建成功還是失敗--> <execution> <id>check</id> <goals> <goal>check</goal> </goals> </execution> <!--這個(gè)report:對(duì)代碼進(jìn)行檢測(cè),然后生成index.html在 target/site/index.html中可以查看檢測(cè)的詳細(xì)結(jié)果--> <execution> <id>jacoco-site</id> <phase>package</phase> <goals> <goal>report</goal> </goals> </execution> </executions> </plugin>
如果你想使用idea自帶的插件,查看簡(jiǎn)單的覆蓋率數(shù)據(jù),可以直接在測(cè)試類上右鍵點(diǎn)擊”Run ‘xxxxxTest' with Coverage",如下圖所示:
當(dāng)JaCoCo插件配置好以后,要獲得 JaCoCo的統(tǒng)計(jì)數(shù)據(jù),就要執(zhí)行mvn install 命令。執(zhí)行完以后,target/site/jacoco/目錄下會(huì)生成一個(gè)index.html文件,這是統(tǒng)計(jì)數(shù)據(jù)總覽頁(yè)面,可以在瀏覽器打開(kāi)查看,如下圖所示:
由于我們?cè)趐om文件的plugin里面配置了rule規(guī)則和check 目標(biāo),所以在覆蓋率不滿足的情況下,mvn install是不會(huì)成功的,并且會(huì)報(bào)錯(cuò):
另一個(gè)需要注意的是我在rule中配置的規(guī)則,有的是 COVEREDRATIO,有的是MISSEDCOUNT,這說(shuō)明有的統(tǒng)計(jì)的是覆蓋率,有的統(tǒng)計(jì)的是丟失率(也即未覆蓋到的),你可別看錯(cuò)了。
配置JaCoCo插件一定注意和JDK版本的對(duì)應(yīng)關(guān)系,如果你用的是jdk1.8,則插件一定要用最新版,要不然會(huì)報(bào)如下錯(cuò)誤:
Caused by: java.lang.RuntimeException: Class java/util/UUID could not be instrumented. at org.jacoco.agent.rt.internal_5d10cad.core.runtime.ModifiedSystemClassRuntime.createFor(ModifiedSystemClassRuntime.java:138) at org.jacoco.agent.rt.internal_5d10cad.core.runtime.ModifiedSystemClassRuntime.createFor(ModifiedSystemClassRuntime.java:99) at org.jacoco.agent.rt.internal_5d10cad.PreMain.createRuntime(PreMain.java:51) at org.jacoco.agent.rt.internal_5d10cad.PreMain.premain(PreMain.java:43) ... 6 more Caused by: java.lang.NoSuchFieldException: $jacocoAccess at java.lang.Class.getField(Class.java:1542) at org.jacoco.agent.rt.internal_5d10cad.core.runtime.ModifiedSystemClassRuntime.createFor(ModifiedSystemClassRuntime.java:136) ... 9 more FATAL ERROR in native method: processing of -javaagent failed Exception in thread "main"
補(bǔ)充:Intellij IDEA run coverage之覆蓋率測(cè)試
一.選擇覆蓋率報(bào)表工具
二.運(yùn)行測(cè)試用例
三.查看覆蓋率報(bào)表
四.下載查看報(bào)表
點(diǎn)擊這個(gè)
勾選open
查看報(bào)表
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教。
相關(guān)文章
關(guān)于Mybatis 中使用Mysql存儲(chǔ)過(guò)程的方法
這篇文章給大家介紹了Mybatis 中使用Mysql存儲(chǔ)過(guò)程的方法,本文通過(guò)實(shí)例代碼相結(jié)合的形式給大家介紹的非常詳細(xì),具有參考借鑒價(jià)值,需要的朋友參考下吧2018-03-03MyBatis-Plus+達(dá)夢(mèng)數(shù)據(jù)庫(kù)實(shí)現(xiàn)高效數(shù)據(jù)持久化的示例
這篇文章主要介紹了MyBatis-Plus和達(dá)夢(mèng)數(shù)據(jù)庫(kù)實(shí)現(xiàn)高效數(shù)據(jù)持久化,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-08-08Springboot與vue實(shí)例講解實(shí)現(xiàn)前后端分離的人事管理系統(tǒng)
這篇文章主要介紹了如何用Java實(shí)現(xiàn)企業(yè)人事管理系統(tǒng),文中采用springboot+vue實(shí)現(xiàn)前后端分離,感興趣的小伙伴可以學(xué)習(xí)一下2022-06-06基于SpringAOP+Caffeine實(shí)現(xiàn)本地緩存的實(shí)例代碼
公司想對(duì)一些不經(jīng)常變動(dòng)的數(shù)據(jù)做一些本地緩存,我們使用AOP+Caffeine來(lái)實(shí)現(xiàn),所以本文給大家介紹了2024-03-03
基于SpringAOP+Caffeine實(shí)現(xiàn)本地緩存的實(shí)例,文中有詳細(xì)的代碼供大家參考,需要的朋友可以參考下Spring中@ConditionalOnProperty注解的作用詳解
這篇文章主要介紹了Spring中@ConditionalOnProperty注解的作用詳解,@ConditionalOnProperty注解主要是用來(lái)判斷配置文件中的內(nèi)容來(lái)決定配置類是否生效用的,如果條件不匹配,則配置類不生效,需要的朋友可以參考下2024-01-01SpringBoot之返回json數(shù)據(jù)的實(shí)現(xiàn)方法
這篇文章主要介紹了SpringBoot之返回json數(shù)據(jù)的實(shí)現(xiàn)方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-12-12springboot中實(shí)現(xiàn)通過(guò)后臺(tái)創(chuàng)建臨時(shí)表
這篇文章主要介紹了springboot中實(shí)現(xiàn)通過(guò)后臺(tái)創(chuàng)建臨時(shí)表操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-07-07