开源库

JaCoCo基础

2020-10-29  本文已影响0人  小圆圈Belen

作用:

1.通过UI操作或者API操作就可以获取覆盖率;
2.了解到测试用例之间的冗余度;
3.分析测试用例遗漏的部分。

简介:

1.JaCoCo是一个开源的覆盖率工具(官网地址:http://www.eclemma.org/JaCoCo/),它针对的开发语言是java,其使用方法很灵活,可以嵌入到Ant、Maven中。

2.JaCoCo包含了很多维度的覆盖率计数器


(1)指令覆盖Instructions:
JaCoCo计算的最小单位就是字节码指令。指令覆盖率表明了在所有的指令中,哪些被指令过以及哪些没有被执行。这项指数完全独立于源码格式并且在任何情况下有效,不需要类文件的调试信息。
(2)分支覆盖Branches:
JaCoCo对所有的if和switch指令计算了分支覆盖率。这项指标会统计所有的分支数量,并同时指出哪些分支被执行,哪些分支没有被执行。这项指标也在任何情况都有效。异常处理不考虑在分支范围内。
在有调试信息的情况下,代码分支的左边会有一个带颜色的钻石,
绿色全部分支被执行
红色全部分支未执行
黄色钻石部分分支被执行。
(3)圈复杂度Cyclomatic Complexity(Cxty):
JaCoCo会计算每个非抽象方法的圈复杂度,并且也会计算类,包,组的复杂度。根据McCabe1996的定义,圈复杂度可以理解为覆盖所有的可能情况最少使用的测试用例数。这项参数也在任何情况下有效。
(4)行覆盖Lines:
该项指数在有调试信息的情况下计算。因为每一行代码可能会产生若干条字节码指令
红色背景表示该行指令未被执行
黄色背景表示该行部分指令未被执行
绿色背景则表示该行指令全部执行。
(5)方法覆盖Medhods:
每一个非抽象方法都至少有一条指令。若一个方法至少被执行了一条指令,就认为它被执行过。因为jacoco直接对字节码进行操作,所以有些方法没有在源码显示(比如某些构造方法和由编译器自动生成的方法)也会被计入在内。
(6)类覆盖Classes:
每个类中只要有一个方法被执行,这个类就被认定为被执行。同medhods一样,有些没有在源码声明的方法被执行,也认定该类被执行。

3.插桩方式

(1)On-the-fly插桩
JVM中通过-javaagent参数指定特定的jar文件启动Instrumentation的代理程序,代理程序在通过Class Loader装载一个class前判断是否转换修改class文件,将统计代码插入class,测试覆盖率分析可以在JVM执行测试代码的过程中完成。
(2)Offline模式
在测试前先对文件进行插桩,然后生成插过桩的class或jar包,测试插过桩 的class和jar包后,会生成动态覆盖信息到文件,最后统一对覆盖信息进行处理,并生成报告。

4.相关jar包

(1)jacocoagent:运行时启动tcp服务监控代码覆盖,dump出覆盖率数据。启动应用时主要用来插桩的jar包
(2)jacocoant:jacoco的任务是ant驱动的,所以这个包用来执行jacoco的任务,向tcp服务发送请求。
(3)jacococli:导出覆盖率记录的exec文件,生成覆盖率报告。

5.启动方式
  1. 文件方式:output=file
    • 需要mvn打jar包,或者tomcat打war包
    • 在每次服务结束时统一收集覆盖率dump
    • java -javaagent:/tmp/jacoco/lib/jacocoagent.jar=includes=*,output=file,append=true,destfile=/tmp/jacoco/service/demo/jacoco.exec -jar demo-0.0.1-SNAPSHOT.jar
  2. tcp服务: output=tcpserver
    • 开放一个tcp端口,可以在过程中收集覆盖率dump
    • java -javaagent:/tmp/jacoco/lib/jacocoagent.jar=includes=*,output=tcpserver,port=6300,address=localhost,append=true -jar demo-0.0.1-SNAPSHOT.jar
    • 需要通过jacococli.jar 来获取dump
    • java -jar jacococli.jar dump --address localhost --port 6300 --destfile ./jacoco-demo.exec
上一篇下一篇

猜你喜欢

热点阅读