环境搭建

主要讲述,jacoco针对于jar服务,统计代码覆盖率并生成报告!

  1. 准备项目jar包
  • 自己找一个打包好的jar服务,或者从github上down一个Springboot demo项目,自行打包成jar包。
  • 说明:下载后将项目打包成jar。(此处通过idea打开项目,下载依赖,然后执行maven 的install即可)。

       2. 下载jacoco相关jar包,地址:https://www.jacoco.org/jacoco/index.html

          

springboot中jetty使用 springboot jacoco_jar

  • 此处将demo项目下载后并把jacoco相关jar放到项目目录下:
  • springboot中jetty使用 springboot jacoco_sed_02

       3. 启动demo服务

  • 在项目目录下执行如下命令:

        java -javaagent:jacocoagent.jar=includes=*,output=tcpserver,port=9100,address=127.0.0.1 -jar target/jacoco-test-1.0-SNAPSHOT.jar 

 

           1. -javaagent :
                jdk5之后新增的参数,主要用来在运行jar包的时候,以一种方式介入字节码加载过程,如有兴趣自行百度。注意后面有个冒号: 

           2. includes=*

              这个代表了,启动时需要进行字节码插桩的包过滤,*代表所有的class文件加载都需要进行插桩。假如你们公司内部代码都有相同的包前缀:com.beebank
              你可以写成:   includes=com.beebank.*

           3.output=tcpserver

              这个地方不用改动,代表以tcpserver方式启动应用并进行插桩。

           4.port=9100

              这是jacoco开启的tcpserver的端口,请注意这个端口不能被占用。

           5.address=127.0.0.1

              这是对外开发的tcpserver的访问地址。可以配置127.0.0.1,也可以配置为实际访问ip

              配置为127.0.0.1的时候,dump数据只能在这台服务器上进行dump,就不能通过远程方式dump数据。

              配置为实际的ip地址的时候,就可以在任意一台机器上(前提是ip要通,不通都白瞎),通过ant xml或者api方式dump数据。

 

        

 

如图:没有报错就是启动成功

 

       

springboot中jetty使用 springboot jacoco_sed_03

      

      4. 通过jacococli.jar导出覆盖率记录的exec文件

  •  java -jar jacococli.jar dump --address 127.0.0.1 --port 9100 --destfile ./jacoco.exec --reset
  • 注意⚠️:执行 java -jar jacococli.jar dump --address 127.0.0.1 --port 9100 --destfile ./jacoco.exec --reset  命令需要再重新打开一个终端窗口运行。

         

springboot中jetty使用 springboot jacoco_sed_04

       5. 通过jacococli.jar生成覆盖率报告

  • Java -jar jacococli.jar report ./jacoco.exec --classfiles target/classes --sourcefiles src/main/java --encoding utf-8 --html jacoReport

springboot中jetty使用 springboot jacoco_java_05

 

       6. 到项目的根目录查看是否生成jacoReport目录,点击index.html右键浏览器打开,查看报告是否正确生成

          

springboot中jetty使用 springboot jacoco_java_06

       

      7.index.html报告

        

springboot中jetty使用 springboot jacoco_sed_07

      8. index.html 报告字段详解

  • Element:元素。最外层展示分组名称,依次为包-->类-->方法
  • Missed Instructions Cov:指令覆盖,字节码中指令。
    1.方法里所有的代码行都有覆盖到(都覆盖了不代表100%覆盖,会存在分支没有覆盖 完整的情况)。
    2.类下面所有的方法都有覆盖到。
    3.包下面所有的类都有覆盖到。
  • Missed Branches Cov:分支覆盖率。
     1.对所有的if和switch指令计算了分支覆盖率。
     2.用钻石表示,分支覆盖率不能看行。
     
  • Missed Cxty:圈复杂度。
     1.jacoco 为每个非抽象方法计算圈复杂度,也会计算每个类、包、组的复杂度。根据McCabe 1996的定义,圈复杂度可理解为覆盖所有的可能情况最少使用的测试用例数。
     2.V(G) = 区域数=判定节数点+1,while、if、for 、swifth  每个都是一个判定节点,嵌套的都是加 1。
     
  • Missed Lines:代码行。用背景色标识的都算是行统计的目标,变量定义不算行,else也不算。
     
  • Missed Methods:方法。每个非抽象方法都至少有一条指令,若一个方法至少被执行了一次指令,就认为它被执行过。
     
  • Missed Classes:类。每个类中只要有一个方法被执行过,这个类就认为被执行过,同Missed Methods一样,有些没有在源码声明的方法被执行,也认为该类被执行。
     

      9.覆盖率标识

  • 红钻:表示未覆盖。
  • 黄钻:表示部分覆盖。
  • 绿钻:表示全部覆盖。
  • 注:条件覆盖都是用钻表示。

     10 .Lines覆盖

  • 红色背景:无覆盖,该行的所有指令均无执行。
  • 黄色背景:部分覆盖,该行部分指令被执行。
  • 绿色背景:全覆盖,该行所有指令被执行。