Loading... <h1>1 简介</h1> <p>单元测试是保证代码质量的重要一环,而如何衡量单元测试写得好不好呢?<code>覆盖率(Coverage)</code>是一个重要指标。而<code>JaCoCo</code>则是专门为<code>Java</code>提供的用于检测测试覆盖率的工具,英文全称为<code>Java Code Coverage</code>。</p> <p>本文将讲解如何在<code>Maven</code>项目中整合<code>JaCoCo</code>,并在<code>SonarQube</code>中展示。<code>SonarQube</code>的安装可以参考这篇文章:</p> <p>《<a href="https://www.pkslow.com/archives/docker-sonarqube" target="_blank">Docker搭建代码检测平台SonarQube并检测maven项目</a>》</p> <h1>2 基本概念</h1> <p>这里所讲的<code>覆盖率</code>是指测试代码的覆盖率,这个指标有多种计算方式,如下是比较常用的有:</p> <ul> <li> <p>行覆盖率:执行代码行数 / 总代码行数,判断有多少行代码被测试执行;</p> </li> <li> <p>类覆盖率:执行的类 / 代码中类总个数;</p> </li> <li> <p>分支覆盖率:执行的逻辑分支数 / 总的分支数,一般用于检测是不是<code>lf/else</code>都有测试覆盖;</p> </li> <li> <p>方法覆盖率:执行的方法数 / 代码总方法数,检测是否有方法被遗漏,构造方法也看作为方法。</p> </li> <li> <p>圈复杂度:用于判断代码结构的复杂程序,<code>JaCoCo</code>不考虑异常处理的分支;一般认为圈复杂度大于10,就存在比较大的风险,严格要求不可大于15。</p> </li> </ul> <p>颜色标识:</p> <p><code>JaCoCo</code>会通过颜色来标识代码覆盖情况,使其一目了然。红色表示没有覆盖,绿色表示已经覆盖,黄色表示部分覆盖。</p> <p>执行方式:</p> <p>执行<code>JaCoCo</code>有多种方式:</p> <p>(1)直接通过命令执行:<a href="https://www.eclemma.org/jacoco/trunk/doc/agent.html" target="_blank">https://www.eclemma.org/jacoco/trunk/doc/agent.html</a></p> <p>(2)Ant执行:<a href="https://www.eclemma.org/jacoco/trunk/doc/ant.html" target="_blank">https://www.eclemma.org/jacoco/trunk/doc/ant.html</a></p> <p>(3)Maven执行:<a href="https://www.eclemma.org/jacoco/trunk/doc/maven.html" target="_blank">https://www.eclemma.org/jacoco/trunk/doc/maven.html</a></p> <p>(4)集成IDE执行:<a href="https://www.eclemma.org/" target="_blank">https://www.eclemma.org/</a></p> <p>我们接下来主要讲解<code>maven</code>的方式。</p> <h1>3 maven整合</h1> <h2>3.1 基础整合</h2> <p><code>Maven</code>整合<code>JaCoCo</code>也容易,配置如下:</p> <pre><code><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> </code></pre> <p>执行<code>mvn clean test</code>,则会生成报告<code>target/coverage-reports/jacoco-unit.exec</code>,但这是人不可读的,<code>Sonar</code>可读的。<code>Intellij Idea</code>也可以阅读,按照<code>Run--Show Code Coverage Data</code>打开即可。</p> <p>执行<code>mvn clean verify</code>,就会生成报告<code>target/site/jacoco/</code>,有多种格式,用浏览器打开<code>index.html</code>文件可以方便查看。如下图所示:</p> <p><img src="https://img2020.cnblogs.com/other/946674/202005/946674-20200521000525426-697562546.png" class="aligncenter"></p> <h2>3.2 选择范围</h2> <p>指定某些类不执行检测:</p> <pre><code><excludes> <exclude>com/pkslow/basic/containsperformance/**</exclude> <exclude>com/pkslow/basic/ReadPropertiesFile</exclude> </excludes> </code></pre> <h2>3.3 规则与阈值</h2> <p><code>Rules</code>标签可以指定检查阈值,比如类覆盖率必须为<code>100%</code>。在<code>configuration</code>里面配置如下:</p> <pre><code><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> </code></pre> <p>这时需要有下面的<code>check</code>才会执行这个规则校验:</p> <pre><code><execution> <id>check</id> <goals> <goal>check</goal> </goals> </execution> </code></pre> <p>如果不满足条件,<code>maven build</code>就会失败。不过,如果我们集成了<code>SonarQube</code>,我们则会通过<code>SonarQube</code>来设置这个规则和阈值。</p> <h1>4 提交到Sonar</h1> <p>添加<code>SonarQube</code>配置信息如下,有三种配置方式:</p> <p>(1)配置数据库信息</p> <pre><code><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> </code></pre> <p>(2)配置用户名密码</p> <pre><code><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> </code></pre> <p>(3)配置令牌</p> <pre><code><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> </code></pre> <p>以上三种都可以,配置完成后,执行命令如下:</p> <pre><code>mvn clean verify sonar:sonar </code></pre> <p>如果不想添加配置,可以直接通过命令来指定,命令如下:</p> <pre><code>mvn clean verify sonar:sonar -Dsonar.host.url=http://localhost:9000 -Dsonar.login=9656c84090b2481db6ea97b6d14d87d546bff619 </code></pre> <h1>5 总结</h1> <p><code>JaCoCo</code>对项目质量管理作用重大,应该加以使用。最终的maven配置文件<code>pom.xml</code>行数太大,请到( <a href="https://www.pkslow.com/archives/maven-jacoco-sonar" target="_blank">https://www.pkslow.com/archives/maven-jacoco-sonar</a> )参考。</p> <p>欢迎访问<a href="https://www.pkslow.com/" target="_blank">南瓜慢说 www.pkslow.com</a>获取更多精彩文章!</p> <p>欢迎关注微信公众号<<strong>南瓜慢说</strong>>,将持续为你更新...</p> <p><img src="https://img2020.cnblogs.com/other/946674/202005/946674-20200521000525997-1976560565.jpg" class="aligncenter"></p> <p><strong>多读书,多分享;多写作,多整理。</strong></p><hr class="content-copyright" style="margin-top:50px" /><blockquote class="content-copyright" style="font-style:normal"><p class="content-copyright">版权属于:撩人的无眠兔</p><p class="content-copyright">本文链接:<a class="content-copyright" href="https://www.wumiantu.com/technology/AOwKzi.html">https://www.wumiantu.com/technology/AOwKzi.html</a></p><p class="content-copyright">转载时须注明出处及本声明</p></blockquote> © 允许规范转载 赞赏 看了文章不打款? ×Close 赞赏作者 扫一扫支付 支付宝支付 微信支付