• Jacoco覆盖率工具使用调研


    JaCoCo Java Code Coverage Library

    Jacoco是一个开源的覆盖率工具。Jacoco可以嵌入到Ant 、Maven中,并提供了EclEmma Eclipse插件,也可以使用Java Agent技术监控Java程序。很多第三方的工具提供了对Jacoco的集成,如sonar、Jenkins、IDEA. 


    官方地址 http://www.eclemma.org/jacoco/

    Java Counters

    Jacoco包含了多种尺度的覆盖率计数器,包含指令级(Instructions,C0 coverage),分支(Branches,C1 coverage)、圈复杂度(Cyclomatic Complexity)、行(Lines)、方法(non-abstract methods)、类(classes)。

    如下所示,标示绿色的为分支覆盖充分,标黄色的为部分分支覆盖,标红色的为未执行该分支。

    Integration

    Jacoco团队提供了如下的一些集成工具的支持

    Java API 
    Command Line
    Apache Ant
    Apache Maven
    Eclipse EclDmma Plugin

    jacoco-maven-plugin

    Jacoco总体上提供了比较完整的文档,但是Maven项目如果需要支持Jacoco,配置起来比较复杂,不如Cobertura方便。为了能够跑通该插件,调研了很多文章,其中‘Creating Code Coverage Reports for Unit And Integration Tests with The JaCoCo Maven Plugin’帮助最大。

    具体的maven配置如下,执行mvn test即可得到。

     <!-- jacoco plugin -->
      <plugin>
        <groupId>org.jacoco</groupId>
        <artifactId>jacoco-maven-plugin</artifactId>
        <version>0.6.4.201312101107</version>
        <executions>
          <execution>
            <!--
            在maven的initialize阶段,将Jacoco的runtime agent作为VM的一个参数
            传给被测程序,用于监控JVM中的调用。
            -->
            <id>default-prepare-agent</id>
            <goals>
              <goal>prepare-agent</goal>
            </goals>
    
            <configuration>
                <destFile>
                    ${project.build.directory}/coverage-reports/jacoco.exec
                </destFile>
                <propertyName>surefireArgLine</propertyName>
            </configuration>
    
          </execution>
    
            <!-- 
            在程序的verify阶段,执行report测试的程序。
            文件的输入为perpare-agent阶段中设置或者默认的jacoco.exec.
            参数 includes和excludes可用来选定report中过滤的类。   
            -->
          <execution>
            <id>default-report</id>
            <phase>test</phase>
            <goals>
              <goal>report</goal>
            </goals>
    
            <configuration>
                <dataFile>${project.build.directory}/coverage-reports/jacoco.exec</dataFile>
                <outputDirectory>${project.reporting.outputDirectory}/jacoco</outputDirectory>
            </configuration>
    
          </execution>
    
         </executions>
      </plugin>
    
    <!--
    使用 maven-surefire-plugin来执行单元测试。
    将surefireArgLine赋值给argLine参数,以保证在测试执行时Jacoco agent处于运行状态。
    -->
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-surefire-plugin</artifactId>
        <version>2.16</version>
        <configuration>
            <argLine>${surefireArgLine}</argLine>
        </configuration>
      </plugin>
    </plugins>

    动态监测Web项目的覆盖率

    Jacoco使用Java Agent 动态插桩,来监控文件执行的覆盖率数据。Jacoco 代理可以收集执行信息,并且当JVM退出时dump,输出数据的方式有3种:

    • 1,文件,当JVM退出时将执行数据写到本地
    • 2,TCP Socket Server,以外部工具的形式连接JVM,通过socket获取执行数据。
    • 3,TCP Sockect Client,程序启动时Agent连接到TCP端点,通过request将执行数据输出。

    Java Agent 可以通过如下的JVM参数来启动:

    -javaagent:[yourpath/]jacocoagent.jar=[opt1]=[val1],[opt2]=[val2]

    shutdown jvm时获取dump数据

    Jacoco插件通过agent获取覆盖率信息文件,为了保证插件可以连接到Jacoco agent,我们必须正确配置Jacoco agent和应用一起首先运行起来。 

    在shutdown时,获取dump数据,在tomcat的catalina.sh中JAVA_OPTS中增加如下参数 

    -javaagent:[yourpath/]jacocoagent.jar=includes=com.xxx.*,output=xxx

    其中,output=file/tcpserver/tcpclient: 
                      覆盖率数据输出的形式,分别为file,tcpserver,tcpclient.

    对应的Jenkins插件见https://wiki.jenkins-ci.org/display/JENKINS/JaCoCo+Plugin

    以客户端形式运行

    在tomcat的catalina.sh中JAVA_OPTS中增加如下参数

    -javaagent:[yourpath/]jacocoagent.jar=includes=com.baidu.*, output=tcpserver,port=6300,address= 220.181.111.148
    

    这样会在220.181.111.148地址的6300端口上提供client访问,并且能dump出此时的覆盖率文件。

    使用这种方式,不需要停止jvm,只需要请求测试环境提供的端口地址即可。

    这种调用方式,在Jacoco的网站上提供了生成报告等的API。

    具体请查看: http://blog.csdn.net/kittyboy0001/article/details/26400091

  • 相关阅读:
    POJ 1182 食物链 +POJ 2492 A Bug's Life 种类并查集
    Codeforces 884C Bertown Subway dfs判环
    HDU 2102 A计划 bfs
    Codeforces Round #442 (Div. 2) 877E
    Codeforces Round #443 (Div. 2) B. Table Tennis
    Codeforces Round #442 (Div. 2) D. Olya and Energy Drinks
    HDU 1495 非常可乐 BFS/数论
    Codeforces Round #442 (Div. 2) B. Nikita and string DP
    51Nod 1102 面积最大的矩形 +1272 最大距离 单调栈
    HDU 1286 找新朋友
  • 原文地址:https://www.cnblogs.com/ceshi2016/p/9073080.html
Copyright © 2020-2023  润新知