zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    Linux常用命令-centos
    USACO 2006 Open, Problem. The Country Fair 动态规划
    USACO 2007 March Contest, Silver Problem 1. Cow Traffic
    USACO 2007 December Contest, Silver Problem 2. Building Roads Kruskal最小生成树算法
    USACO 2015 February Contest, Silver Problem 3. Superbull Prim最小生成树算法
    LG-P2804 神秘数字/LG-P1196 火柴排队 归并排序, 逆序对
    数据结构 并查集
    浴谷国庆集训 对拍
    1999 NOIP 回文数
    2010 NOIP 普及组 第3题 导弹拦截
  • 原文地址:https://www.cnblogs.com/ceshi2016/p/9073080.html
Copyright © 2011-2022 走看看