单元测试覆盖率

什么是单元测试覆盖率?
在一些大型且繁琐的项目中, 难免会将一些方法的单元测试遗漏, 而遗漏的后果则是后来者修改bug还得自己重写单元测试
所以某些公司, 会将单元测试覆盖率, 作为工作考核要求, 例如必须达到60%/70%/80%等, 也被用来衡量单元测试环境的完整与充分度

集成jacoco

在项目中使用两种配置方式
第一种:

  1. 在父pom文件中新增jacoco插件及依赖,同时配置jacoco
<dependency>
        <groupId>org.jacoco</groupId>
        <artifactId>jacoco-maven-plugin</artifactId>
        <version>0.8.2</version>
</dependency>
<plugin>
                <groupId>org.jacoco</groupId>
                <artifactId>jacoco-maven-plugin</artifactId>
                <version>0.8.2</version>
                <configuration>
                    <!--这里指定单元测试覆盖率扫描的包-->
                    <includes>
                        <include>**/service/**</include>
                        <include>**/remote/**</include>
                    </includes>
          <!--这里指定单元测试覆盖率排除的包-->
          <excludes>
                        <exclude>**/domain/**</exclude>
                        <exclude>**/dto/**</exclude>
                        <exclude>**/po/**</exclude>
          </excludes>
           <!-- 指定报告率生成路经,与父pom同级别,且必须生成在这路经下 -->
          <outputDirectory>${basedir}/../target/site/jacoco</outputDirectory>
                </configuration>
                <executions>
                    <execution>
                        <id>jacoco-initialize</id>
                        <goals>
                            <goal>prepare-agent</goal>
                        </goals>
                    </execution>
                    <execution>
                        <id>jacoco-site</id>
                        <phase>package</phase>
                        <goals>
                            <goal>report</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>

更多了解看jacoco官方文档
单测覆盖率统计中心(cover-center)暂时只支持jacoco
2. 父pom文件引入单测覆盖率统计插件并做配置

<plugin>
                <groupId>com.souche</groupId>
                <artifactId>cover-maven-plugin</artifactId>
                <version>1.2.2-SNAPSHOT</version>
                <configuration>
                    <skip>false</skip>
                </configuration>
                <executions>
                    <execution>
                        <phase>package</phase>
                        <goals>
                            <goal>cover-report</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
  1. 子module不需要做任何事。
    其实到这里为止就可以使用jacoco生成报告并上传到覆盖率中心了,在父pom下使用如下命令:
    注意在多module的情况下命令必须分开执行
    mvn test jacoco:report
    mvn cover:cover-report
    第二种:
  2. 父pom文件中新增jacoco插件及依赖,不需做多余的处理
<dependency>
        <groupId>org.jacoco</groupId>
        <artifactId>jacoco-maven-plugin</artifactId>
        <version>0.8.2</version>
</dependency>
<plugin>
                <groupId>org.jacoco</groupId>
                <artifactId>jacoco-maven-plugin</artifactId>
                <version>0.8.2</version>
 </plugin>
  1. 父pom文件引入单测覆盖率统计插件
<plugin>
                <groupId>com.souche</groupId>
                <artifactId>cover-maven-plugin</artifactId>
                <version>1.2.2-SNAPSHOT</version>
</plugin>
  1. 每个子pom文件中新增jacoco插件及依赖,同时配置jacoco
<dependency>
        <groupId>org.jacoco</groupId>
        <artifactId>jacoco-maven-plugin</artifactId>
</dependency>
<plugin>
                <groupId>org.jacoco</groupId>
                <artifactId>jacoco-maven-plugin</artifactId>
                <configuration>
                    <!--这里指定单元测试覆盖率扫描的包-->
                    <includes>
                        <include>**/service/**</include>
                        <include>**/remote/**</include>
                    </includes>
          <!--这里指定单元测试覆盖率排除的包-->
          <excludes>
                        <exclude>**/domain/**</exclude>
                        <exclude>**/dto/**</exclude>
                        <exclude>**/po/**</exclude>
          </excludes>
           <!-- 指定报告率生成路经,与父pom同级别,且必须生成在这路经下 -->
          <outputDirectory>${basedir}/../target/site/jacoco</outputDirectory>
                </configuration>
                <executions>
                    <execution>
                        <id>jacoco-initialize</id>
                        <goals>
                            <goal>prepare-agent</goal>
                        </goals>
                    </execution>
                    <execution>
                        <id>jacoco-site</id>
                        <phase>package</phase>
                        <goals>
                            <goal>report</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
  1. 子pom文件引入单测覆盖率统计插件并做配置
 <plugin>
            <groupId>com.souche</groupId>
            <artifactId>cover-maven-plugin</artifactId>
            <version>1.2.2-SNAPSHOT</version>
            <configuration>
                <skip>false</skip>
            </configuration>
            <executions>
                <execution>
                    <phase>package</phase>
                    <goals>
                        <goal>cover-report</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>

在父pom下使用如下命令:

mvn test jacoco:report 
mvn cover:cover-report

如果项目只有一个包,以上步骤无需区分父子pom。

从事电源行业的朋友们都知道,所谓EMC其实就是设备或系统在其电磁环境中能正常工作,并且不对该环境中任何事物构成不能承受的电磁骚扰的能力。通常其测试包括对其向外界发送的电磁骚扰强度进行测试,以及对其在规定电磁骚扰强度的电磁环境条件下进行敏感度测试,前者是以便确认是否符合有关标准规定的限制值要求;而后者是确认是否符合有关标准规定的抗扰度要求。掌握一定的EMC测试技术是十分必要的,本文就将分享那些EMC的测试要点以及其故障排除方案。   单片机系统EMC测试   1. 测试环境   为了保证测试结果的准确和可靠性,电磁兼容性测量对测试环境有较高的要求,测量场地有室外开阔场地、屏蔽室或电波暗室等 引入Lombok后就会发现,覆盖率通常会低得让人匪夷所思。例如某个项目,通过Jacoco获取到的代码行数以及覆盖率为: 可见,这个覆盖率是非常低的,会被质量门禁判违规(常见会要求>50%甚至>80%) 下载地址 https://www.eclemma.org/jacoco/官方文档 https://www.jacoco.org/jacoco/trunk/doc/agent.html。 为了提供一个更好的 JaCoCo 单测报告,我们可以将一些无业务逻辑的代码(PO,DTO等)从单测报告中移除。 如下面配置,通过在 configuration -> excludes -> exclude 排除相关包路径即可。 <plugin> <groupId>org.jacoco</groupId> <artifactId>jacoco-maven-plugin</artifactId> <version>0 在我司对核心业务基于Spock落地单元测试过程中, 使用jacoco插件生成单元测试报告,遇到了覆盖率异常的问题. 经过排查, 最终发现在使用powermock的 @PrepareForTest([HttpUtils.class, XXXHandler.class]) 注解时, 数组里的类是会被Jacoco忽略的. powermock和jacoco存在冲突,以下是抄来的解释: JaCoCo和PowerMock都是通过在加载类的时候修改字节码文件来实现统计覆盖率和mock静态类的功能。 看完上面的就知道什么时候或者为什么要编写单元测试了。其他的我们不多说了,直接进入实战操作,这次使用的是springboot+Mockito框架,在最后会指出一些小技巧和bug。 Jacoco增量覆盖率说明 能找到这里,说明对jacoco的原理和使用有了一定的了解,而我写这边文章主要是网络上基本没有完整文档加代码的jaocco增量覆盖说明,所以我想分享些东西让需要这方面的人快速去实现自己想要的功能,那么如果想实现增量代码覆盖率需要做到哪些工作呢?(格式难看到这里看http://note.youdao.com/s/6gM8ONX3) 大家在网络上找到的实现方式无外乎三种 获取到增量代码,在jacoco进行插桩时判断是否是增量代码后再进行插桩,这样需要两个步骤,一是获取增量代码,二 编写java代码后,通过单元测试可以了解代码覆盖率等指标 maven可以配置jacoco对项目进行扫描,生成报告文件jacoco.xml sonar可以识别jacoco.xml文件,对报告进行更好的UI展示,跟踪质量晋升曲线等。 使用jacoco插件来生成mvn test报告,需要在每个项目代码中增加配置。 其中的配置是有共性的,不需要每个项目的开发者都掌握配置方法,这个重复工作可以交给项目管理来做,Jenkins单任务,流水线之类都可以。 我们主要通过jenkins的Sh 我检查了Jacoco github ans浏览了一些Stack Overflow问题。通过注释不支持最高版本0.7.9的jacoco过滤方法,仅支持整个类。现在0.8.0和0.8.1已经发布。这些版本中是否添加了此功能?我检查了jacoco的变化历史。但是在最新版本中看不到与过滤相关的任何内容。但是仍然想确认某人是否实现了这一目标以及如何实现?答案我找到了如何从覆盖率报告中排除静态方法的解决方案。...