單元測試是保證代碼質量的重要一環,而如何衡量單元測試寫得好很差呢?覆蓋率(Coverage)
是一個重要指標。而JaCoCo
則是專門爲Java
提供的用於檢測測試覆蓋率的工具,英文全稱爲Java Code Coverage
。html
本文將講解如何在Maven
項目中整合JaCoCo
,並在SonarQube
中展現。SonarQube
的安裝能夠參考這篇文章:sql
《Docker搭建代碼檢測平臺SonarQube並檢測maven項目》docker
這裏所講的覆蓋率
是指測試代碼的覆蓋率,這個指標有多種計算方式,以下是比較經常使用的有:數據庫
行覆蓋率:執行代碼行數 / 總代碼行數,判斷有多少行代碼被測試執行;瀏覽器
類覆蓋率:執行的類 / 代碼中類總個數;bash
分支覆蓋率:執行的邏輯分支數 / 總的分支數,通常用於檢測是否是lf/else
都有測試覆蓋;微信
方法覆蓋率:執行的方法數 / 代碼總方法數,檢測是否有方法被遺漏,構造方法也看做爲方法。app
圈複雜度:用於判斷代碼結構的複雜程序,JaCoCo
不考慮異常處理的分支;通常認爲圈複雜度大於10,就存在比較大的風險,嚴格要求不可大於15。maven
顏色標識:工具
JaCoCo
會經過顏色來標識代碼覆蓋狀況,使其一目瞭然。紅色表示沒有覆蓋,綠色表示已經覆蓋,黃色表示部分覆蓋。
執行方式:
執行JaCoCo
有多種方式:
(1)直接經過命令執行:https://www.eclemma.org/jacoco/trunk/doc/agent.html
(2)Ant執行:https://www.eclemma.org/jacoco/trunk/doc/ant.html
(3)Maven執行:https://www.eclemma.org/jacoco/trunk/doc/maven.html
(4)集成IDE執行:https://www.eclemma.org/
咱們接下來主要講解maven
的方式。
Maven
整合JaCoCo
也容易,配置以下:
<plugin> <groupId>org.jacoco</groupId> <artifactId>jacoco-maven-plugin</artifactId> <version>${jacoco.version}</version> <configuration> <skip>${maven.test.skip}</skip> <destFile>${basedir}/target/coverage-reports/jacoco-unit.exec</destFile> <dataFile>${basedir}/target/coverage-reports/jacoco-unit.exec</dataFile> <output>file</output> <append>true</append> <excludes> <exclude>com/pkslow/basic/containsperformance/**</exclude> <exclude>com/pkslow/basic/ReadPropertiesFile</exclude> </excludes> </configuration> <executions> <execution> <id>jacoco-initialize</id> <goals> <goal>prepare-agent</goal> </goals> <phase>test-compile</phase> </execution> <execution> <id>jacoco-site</id> <phase>verify</phase> <goals> <goal>report</goal> </goals> </execution> </executions> </plugin>
執行mvn clean test
,則會生成報告target/coverage-reports/jacoco-unit.exec
,但這是人不可讀的,Sonar
可讀的。Intellij Idea
也能夠閱讀,按照Run--Show Code Coverage Data
打開便可。
執行mvn clean verify
,就會生成報告target/site/jacoco/
,有多種格式,用瀏覽器打開index.html
文件能夠方便查看。以下圖所示:
指定某些類不執行檢測:
<excludes> <exclude>com/pkslow/basic/containsperformance/**</exclude> <exclude>com/pkslow/basic/ReadPropertiesFile</exclude> </excludes>
Rules
標籤能夠指定檢查閾值,好比類覆蓋率必須爲100%
。在configuration
裏面配置以下:
<rules> <rule implementation="org.jacoco.maven.RuleConfiguration"> <element>BUNDLE</element> <limits> <limit implementation="org.jacoco.report.check.Limit"> <counter>METHOD</counter> <value>COVEREDRATIO</value> <minimum>0.50</minimum> </limit> <limit implementation="org.jacoco.report.check.Limit"> <counter>BRANCH</counter> <value>COVEREDRATIO</value> <minimum>0.50</minimum> </limit> <limit implementation="org.jacoco.report.check.Limit"> <counter>CLASS</counter> <value>MISSEDCOUNT</value> <maximum>0</maximum> </limit> </limits> </rule> </rules>
這時須要有下面的check
纔會執行這個規則校驗:
<execution> <id>check</id> <goals> <goal>check</goal> </goals> </execution>
若是不知足條件,maven build
就會失敗。不過,若是咱們集成了SonarQube
,咱們則會經過SonarQube
來設置這個規則和閾值。
添加SonarQube
配置信息以下,有三種配置方式:
(1)配置數據庫信息
<profiles> <profile> <id>sonar</id> <activation> <activeByDefault>true</activeByDefault> </activation> <properties> <sonar.jdbc.url>jdbc:postgresql://localhost/sonar</sonar.jdbc.url> <sonar.jdbc.driver>org.postgresql.Driver</sonar.jdbc.driver> <sonar.jdbc.username>user</sonar.jdbc.username> <sonar.jdbc.password>password</sonar.jdbc.password> <sonar.host.url>http://localhost:9000</sonar.host.url> </properties> </profile> </profiles>
(2)配置用戶名密碼
<profiles> <profile> <id>sonar</id> <activation> <activeByDefault>true</activeByDefault> </activation> <properties> <sonar.host.url>http://localhost:9000</sonar.host.url> <sonar.login>admin</sonar.login> <sonar.password>admin</sonar.password> </properties> </profile> </profiles>
(3)配置令牌
<profiles> <profile> <id>sonar</id> <activation> <activeByDefault>true</activeByDefault> </activation> <properties> <sonar.host.url>http://localhost:9000</sonar.host.url> <sonar.login>9656c84090b2481db6ea97b6d14d87d546bff619</sonar.login> </properties> </profile> </profiles>
以上三種均可以,配置完成後,執行命令以下:
mvn clean verify sonar:sonar
若是不想添加配置,能夠直接經過命令來指定,命令以下:
mvn clean verify sonar:sonar -Dsonar.host.url=http://localhost:9000 -Dsonar.login=9656c84090b2481db6ea97b6d14d87d546bff619
JaCoCo
對項目質量管理做用重大,應該加以使用。最終的maven配置文件pom.xml
行數太大,請到( https://www.pkslow.com/archives/maven-jacoco-sonar )參考。
歡迎訪問南瓜慢說 www.pkslow.com獲取更多精彩文章!
歡迎關注微信公衆號<南瓜慢說>,將持續爲你更新...
多讀書,多分享;多寫做,多整理。