环境搭建
主要讲述,jacoco针对于jar服务,统计代码覆盖率并生成报告!
- 准备项目jar包
- 自己找一个打包好的jar服务,或者从github上down一个Springboot demo项目,自行打包成jar包。
- 说明:下载后将项目打包成jar。(此处通过idea打开项目,下载依赖,然后执行maven 的install即可)。
2. 下载jacoco相关jar包,地址:https://www.jacoco.org/jacoco/index.html
- 此处将demo项目下载后并把jacoco相关jar放到项目目录下:
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数据。
如图:没有报错就是启动成功
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 命令需要再重新打开一个终端窗口运行。
5. 通过jacococli.jar生成覆盖率报告
- Java -jar jacococli.jar report ./jacoco.exec --classfiles target/classes --sourcefiles src/main/java --encoding utf-8 --html jacoReport
6. 到项目的根目录查看是否生成jacoReport目录,点击index.html右键浏览器打开,查看报告是否正确生成
7.index.html报告
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覆盖
- 红色背景:无覆盖,该行的所有指令均无执行。
- 黄色背景:部分覆盖,该行部分指令被执行。
- 绿色背景:全覆盖,该行所有指令被执行。