Jacoco--测试覆盖率工具

12,052 阅读5分钟

介绍

JaCoCo(Java Code Coverage)是一种分析单元测试覆盖率的工具,使用它运行单元测试后,可以给出代码中哪些部分被单元测试测到,哪些部分没有没测到,并且给出整个项目的单元测试覆盖情况百分比,看上去一目了然。

JaCoCo会生成以下指标的度量:

Instructions (C0 Coverage)

  • 主要是计算字节码文件的覆盖率。

Branches (C1 Coverage)

  • JaCoCo也计算分支覆盖所有if和 switch语句。主要是计算分支的。
  • 没有覆盖:在该行没有分支机构已执行(红钻)
  • 部分覆盖:只有在该行分支机构的一部分已经被执行(黄钻)
  • 全覆盖:在该行各分支机构已执行(绿钻)

Cyclomatic Complexity

  • 圈复杂度(Cyclomatic Complexity)是一种代码复杂度的衡量标准。它可以用来衡量一个模块判定结构的复杂程度,数量上表现为独立现行路径条数,也可理解为覆盖所有的可能情况最少使用的测试用例数。圈复杂度大说明程序代码的判断逻辑复杂,可能质量低且难于测试和维护。程序的可能错误和高的圈复杂度有着很大关系。请注意,JaCoCo不考虑异常处理的分支机构try-catch块也不会增加复杂性。总体和分支正相关。实际上,过去几年的各种研究已经确定:一个方法的圈复杂度(或 CC)大于 10 的方法存在很大的出错风险。
  • 关于圈复杂度的理解,可以看以下链接。

Lines

  • 主要计算基于覆盖的实际源代码行类和源文件行覆盖。通常会标识三种状态。
  • 没有覆盖:在该行任何指令执行(红色背景)
  • 部分覆盖:只有在该行的指示的一部分已经被执行(黄色背景)
  • 全覆盖:在该行的所有指令已执行(绿色背景)

Methods

  • 每个非抽象方法包含至少一个指令。构造函数和静态初始化都算作方法。

单元测试

Eclipse 插件 EclEmma

EclEmma的安装

1.启动eclipse,点击Help菜单,Install New Software,在弹出的对话框中,点击Add

2. 输入Name,例如EclEmma。输入Location:update.eclemma.org/

3. 在Work With处选择刚刚输入的Location地址

4. 安装后重新启动eclipse,如果成功安装,工具栏上会出现一个新的按钮

EclEmma的使用

1.编写单元测试用例。现在支持以下测试:

  • Local Java application
  • Eclipse/RCP application
  • Equinox OSGi framework
  • JUnit test
  • TestNG test
  • JUnit plug-in test
  • JUnit RAP test
  • SWTBot test
  • Scala application

        2.以JUnit为例,在测试用例文件上右键,选择 Coverage As -> JUnit Test

        3. 会在测试的文件中显示出运行结果:

        • 绿色:完整执行 
        • 红色:没执行 
        • 黄色:部分执行

        4.通过点击调出Coverage窗口,它是用来统计程序的覆盖测试率

        5. 点击红色矩形框的按钮能将多次测试的覆盖数据综合起来进行查看

        6. 在Coverage视图主区域中点击右键,出现的快捷菜单中选择”Export Report…”

        7.出现Export界面,选项如下:

        • Available sessions:要导出的session 
        • Format:选择报告的类型(HTML/XML/Text/EMMA session) 
        • Destination:导出的session 存放的位置

        IDEA插件

        IDEA自带Jacoco单元测试分析工具,操作步骤如下。
        1.选择编辑配置 “Edit Configurations”。


        2.添加单元测试类型,选择被测文件,此处以TestNG为例,测试所有代码(不包含lib)。


        3.选择工具jacoco。


        4.以覆盖率模式运行测试用例。


        5.运行完成后自动生成测试报告。


        MAVEN

        在pom.xml文件中添加以下插件后,运行 mvn test 即可在target/site/jacoco文件夹下生成报告。

        如果想要跳过失败的测试用例,请使用 mvn test -Dmaven.test.failure.ignore=true

        <plugin>    <groupId>org.jacoco</groupId>    <artifactId>jacoco-maven-plugin</artifactId>    <version>0.8.2-SNAPSHOT</version>    <executions>        <execution>            <id>default-prepare-agent</id>            <goals>                <goal>prepare-agent</goal>            </goals>        </execution>        <execution>            <id>default-report</id>            <phase>test</phase>            <goals>                <goal>report</goal>            </goals>        </execution>        <execution>            <id>default-check</id>            <goals>                <goal>check</goal>            </goals>        </execution>    </executions></plugin>

        运行时测试

        jacoco支持程序运行中监控执行情况。下面介绍直接运行和tomcat服务器运行两种监控方式。

        准备

        在jacoco官方下载jacoco包,下载连接:www.jacoco.org/jacoco/

        下载的包中包括三个jar,此处使用 jacocoagent.jar 和 jacococli.jar

        直接运行

        1.假如直接运行的是test.jar, 运行以下命令:

        java -javaagent:jacoco\jacocoagent.jar=includes=* -jar test.jar

        其中下划线处指明准备中的jar包,后面为参数。

        相关参数请参考:www.jacoco.org/jacoco/trun…

        2.待程序运行结束后,会在test.jar同级目录生成jacoco.exec文件,此文件为jacoco获取的运行情况文件。

        3.获取需要分析的class文件,假设test.jar中的源代码生成的文件位于com文件夹中,将此文件夹放入和jacoco.exec同一文件夹下。

        4.执行命令即可生成报告:

        java -jar jacoco\jacococli.jar report jacoco.exec --classfiles com --html report

        下划线处为准备中的jar包,report表明生成报告, jacoco.exec为运行监控文件,–classfiles为生成报告正对的class文件,–html为报告格式,report为报告文件夹。(此处的class文件应当和运行中相同)

        详细参数请参考:www.jacoco.org/jacoco/trun…

        tomcat运行

        tomcat运行与直至运行的方式基本相同,唯一不同的是指明jacocoagent.jar的方式。

        在Windows下,在$TOMCAT_HOME/bin/catalina.bat,Linux下,在$TOMCAT_HOME/bin/catalina.sh的前面,增加如下设置:

        set "JAVA_OPTS=-javaagent:=jacoco\jacocoagent.jar=includes=*"

        如果在参数中未未指明exec文件的生成路径,那么会在$TOMCAT_HOME/bin文件夹下生成,其余操作与上述相同。