51Testing软件测试论坛

标题: 能帮你生成单元测试覆盖率报告的工具你知道吗? [打印本页]

作者: lsekfe    时间: 2022-9-22 15:19
标题: 能帮你生成单元测试覆盖率报告的工具你知道吗?
 jacoco简介
  jacoco 是一个开源的覆盖率工具,它针对的开发语言是 java。其使用方法很灵活:
  可以嵌入到 ant、maven 中;
  可以作为 Eclipse 插件;
  可以作为 javaAgent 探针监控 java 程序等等。
  很多第三方的工具提供了对 jacoco 的集成,如 sonar、jenkins 等等。
  jacoco 包含了多种尺度的覆盖率计数器,包含指令级覆盖(Instructions,C0coverage)、分支覆盖(Branches,C1coverage)、圈复杂度(CyclomaticComplexity)、行覆盖(Lines)、方法覆盖(non-abstract methods)、类覆盖(classes)。
  其含义如下:
  行覆盖率:度量被测程序的每行代码是否被执行,判断标准行中是否至少有一个指令被执行。
  类覆盖率:度量计算 class 类文件是否被执行。
  分支覆盖率:度量 if 和 switch 语句的分支覆盖情况,计算一个方法里面的总分支数,确定执行和不执行的分支数量。
  方法覆盖率:度量被测程序的方法执行情况,是否执行取决于方法中是否有至少一个指令被执行。
  指令覆盖:计数单元是单个 java 二进制代码指令,指令覆盖率提供了代码是否被执行的信息,度量完全独立源码格式。
  圈复杂度:在(线性)组合中,计算在一个方法里面所有可能路径的最小数目,缺失的复杂度同样表示测试案例没有完全覆盖到这个模块。
  jacoco 和 maven 集成
  mvn 命令增加参数
  在执行 mvn 命令时,加上 "org.jacoco:jacoco-maven-plugin:prepare-agent" 参数即可。示例:
  1. mvn clean test org.jacoco:jacoco-maven-plugin:0.8.5:prepare-agent install -Dmaven.test.failure.ignore=true
复制代码
 其中,jacoco-maven-plugin 后面跟的是jacoco的版本。"-Dmaven.test.failure.ignore=true" 建议加上,否则如果单元测试失败,就会直接中断,不会产生 .exec 文件。
  执行以上命令后,会在当前目录的 target 目录下产生一个jacoco.exec文件,该文件就是覆盖率的文件。
  总体说来,这种方式比较简单,在与 jenkins 集成时也非常方便。
  在 pom 文件中使用 jacoco 插件
  首先,需要添加 jacoco 的依赖:
  1. <properties>
  2.         <jacoco.version>0.8.5</jacoco.version>
  3.     </properties>
复制代码
接着,我们需要配置 jacoco-maven-plugin 和 maven-surefire-plugin 内容:
  1.   <dependency>
  2.         <groupId>org.jacoco</groupId>
  3.         <artifactId>jacoco-maven-plugin</artifactId>
  4.         <version>${jacoco.version}</version>
  5.         <scope>test</scope>
  6.     </dependency>
复制代码
<includes>或<excludes>标签的值应该是相对于目录 /classes/ 的编译类的类路径(而不是包名),用来指定哪些类需要进行单元测试。
  另外 maven 的测试类需要遵循相应的规范命名,否则无法运行测试类,无法生成测试报告以及覆盖率报告。jacoco 使用的是 maven-surefire-plugin 插件,它的默认测试类名规范是:
  Test*.java:以 Test 开头的 Java 类;
  *Test.java:以 Test 结尾的 Java 类;
  *TestCase.java:以 TestCase 结尾的 Java 类;
  或者可以在pom中自定义测试类:
  1.    <plugins>
  2.             <plugin>
  3.                 <artifactId>maven-surefire-plugin</artifactId>
  4.                 <configuration>
  5.                     <argLine>
  6.                         -javaagent:${settings.localRepository}/org/jacoco/org.jacoco.agent/${jacoco.version}/org.jacoco.agent-${jacoco.version}-runtime.jar=destfile=${project.basedir}/target/coverage-reports/jacoco-unit.exec
  7.                     </argLine>
  8.                     <testFailureIgnore>true</testFailureIgnore>
  9.                 </configuration>
  10.             </plugin>
  11.             <!--检查代码覆盖率的插件配置-->
  12.             <plugin>
  13.                 <groupId>org.jacoco</groupId>
  14.                 <artifactId>jacoco-maven-plugin</artifactId>
  15.                 <version>0.8.5</version>
  16.                 <configuration>
  17.                     <!--指定生成.exec文件的存放位置-->
  18.                     <destFile>target/coverage-reports/jacoco-unit.exec</destFile>
  19.                     <!--Jacoco是根据.exec文件生成最终的报告,所以需指定.exec的存放路径-->
  20.                     <dataFile>target/coverage-reports/jacoco-unit.exec</dataFile>
  21.                     <includes>
  22.                         <include>**/service/**</include>
  23.                     </includes>
  24.                     <!-- rules里面指定覆盖规则 -->
  25.                     <rules>
  26.                         <rule implementation="org.jacoco.maven.RuleConfiguration">
  27.                             <element>BUNDLE</element>
  28.                             <limits>  
  29.                                 <!-- 指定方法覆盖到50% -->
  30.                                 <limit implementation="org.jacoco.report.check.Limit">
  31.                                     <counter>METHOD</counter>
  32.                                     <value>COVEREDRATIO</value>
  33.                                     <minimum>0.50</minimum>
  34.                                 </limit>
  35.                                 <!-- 指定分支覆盖到50% -->
  36.                                 <limit implementation="org.jacoco.report.check.Limit">
  37.                                     <counter>BRANCH</counter>
  38.                                     <value>COVEREDRATIO</value>
  39.                                     <minimum>0.50</minimum>
  40.                                 </limit>
  41.                                 <!-- 指定类覆盖到100%,不能遗失任何类 -->
  42.                                 <limit implementation="org.jacoco.report.check.Limit">
  43.                                     <counter>CLASS</counter>
  44.                                     <value>MISSEDCOUNT</value>
  45.                                     <maximum>0</maximum>
  46.                                 </limit>
  47.                             </limits>
  48.                         </rule>
  49.                     </rules>
  50.                 </configuration>
  51.                 <executions>
  52.                     <execution>
  53.                         <id>pre-test</id>
  54.                         <goals>
  55.                             <goal>prepare-agent</goal>
  56.                         </goals>
  57.                     </execution>
  58.                     <execution>
  59.                         <id>post-test</id>
  60.                         <phase>test</phase>
  61.                         <goals>
  62.                             <goal>report</goal>
  63.                         </goals>
  64.                     </execution>
  65.                 </executions>
  66.             </plugin>
  67.         </plugins>
复制代码
<rules> 指定筛选规则。
  接着运行 mvn test 生成 index.html,即覆盖率报告:
[attach]143157[/attach]










欢迎光临 51Testing软件测试论坛 (http://bbs.51testing.com/) Powered by Discuz! X3.2