jacoco不是奶茶,却像奶茶一样美味,不尝一下吗?

简介: 距离上篇文章挺久的了,天天的也不知道在干嘛,时间就溜过去了。今天聊聊前段时间整理的jacoco。Jacoco是一个针对java语言开源的代码覆盖率工具。

距离上篇文章挺久的了,天天的也不知道在干嘛,时间就溜过去了。今天聊聊前段时间整理的jacoco。Jacoco是一个针对java语言开源的代码覆盖率工具。



1、为什么会有jacoco?


Jacoco是代码覆盖率工具,工具解决的问题就是代码覆盖率问题,为什么要查看代码的覆盖率?


或者说有了代码覆盖率能做什么?主要有以下几个方面:


  1. 可以查看代码的分支执行情况,可以查看代码是否存在因为bug 而产生分支不执行的问题。


  1. 可以查看垃圾代码,清理无用代码。


  1. 提升代码质量,覆盖率的代码基本上质量不会好,可能因为设计的原因,造成代码过于松散,可以看下是否有重构的必要性。


2、jacoco配置


市面上 Java常用覆盖率工具的工具有Jacoco、Emma和Cobertura。


今天专门聊下jacoco。感觉像奶茶。哈哈,注意下面这是今天的正题哦。


  • 2.1 jacoco 下载。


有两种方式:直接下载jar包或者通过maven仓库。


通过下面的官方网址:www.jacoco.org/jacoco/

4b92bdce71b14a409e9a8d1328a11a4d~tplv-k3u1fbpfcp-zoom-in-crop-mark_1304_0_0_0.webp.jpg


下载解压后:

53263c02cf6149a0917011e7e4505aca~tplv-k3u1fbpfcp-zoom-in-crop-mark_1304_0_0_0.webp.jpg


  • 2.2 jacoco配置


jacoco可以有两种生效模式:On-The-Fly代理模式  和 Offine模式


这里只说fly模式,这种模式是基于javaagent,使用方便简单。在启动脚本中加入如下代码:


-javaagent:D:\wechat\jacoco-0.8.5\lib\jacocoagent.jar=output=tcpserver,address=*,port=8888
复制代码


  • 然后启动应用就可以进行代码覆盖率统计,这种模式是CS结构,应用是server,监听在8888 端口。


  • 2.3 jacoco的导出。


既然生成了数据,就要导出,怎么导出呐?先切换到lib目录,然后使用下面的命令:


java -jar jacococli.jar dump --address 127.0.0.1 --port 8888 --destfile /dump.exec
复制代码


  • 这样将导出生成exec的统计文件。


  • 2.4 生成我们看的懂的数据——html或者csv。


因为exec文件我们没办法直接查看,因此需要生成report。report的命令我就不演示了,因为不重要,等下我会介绍一个效率更高的方式。命令如下:


java -jar jacococli.jar report [<execfiles> ...] --classfiles <path> [--csv <file>] [--encoding <charset>] [--help] [--html <dir>] [--name <name>] [--quiet] [--sourcefiles <path>] [--tabwith <n>] [--xml <file>]
复制代码


  • 生成的html格式的报告如下:


74419720487f4a818e68978ef53d6bf4~tplv-k3u1fbpfcp-zoom-in-crop-mark_1304_0_0_0.webp.jpg


点开可以看具体的代码执行:

20f93c91745b47899764086526b790dc~tplv-k3u1fbpfcp-zoom-in-crop-mark_1304_0_0_0.webp.jpg


  • 2.5 覆盖率分析进入源代码,就可以看见自动化测试的行覆盖率:


  • 红色:无覆盖,没有分支被执行


  • 黄色:部分覆盖,部分分支被执行。


  • 绿色:全覆盖,所有分支被执行。


3、ide中的配置


  • 3.1 dump 和 report的官方代码。


在内网环境的覆盖率统计,因为经常会拉下来看一下,总是使用命令这种方式比较低下。


官方提供了代码实现 。

cdea41bd3f59445bb3fa8622dee80b30~tplv-k3u1fbpfcp-zoom-in-crop-mark_1304_0_0_0.webp.jpg


ExecDump.java 对应 dump命令,生成exec文件。


ReportGenerator.java 对应 report命令,生成html。


  • 3.2 生成的exec文件使用idea 进行解析。


4931b2654dca406baaa0008d569ae2a3~tplv-k3u1fbpfcp-zoom-in-crop-mark_1304_0_0_0.webp.jpg


show code coverage data  显示覆盖率数据,这个命令可以解析exec文件,并且将解析的覆盖率数据显示在项目的代码上。


如果不想显示可以使用hide coverage,隐藏覆盖率数据。


f7adf3be947d4003bc13dee9e545af18~tplv-k3u1fbpfcp-zoom-in-crop-mark_1304_0_0_0.webp.jpg


generate coverage data 导出数据到html。


4、使用步骤


到这一步讲完了基本的使用步骤。下面讲一下在工作中的使用步骤Jacoco的使用分为三部分:


第一部分是注入并采集。使用javaagent启动。


第二部分是导出。使用批处理命令或者使用官方提供的代码ExecDump.java 导出exec到本地。


第三部分是生成报告,可以用批处理命令或者使用官方的代码ReportGenerator.java,或者使用idea 内置的工具。


如果只是在本地进行代码覆盖率统计,直接可以使用IDE的统计。


9e57e95dd85c4920b3d480e80eb7bcb2~tplv-k3u1fbpfcp-zoom-in-crop-mark_1304_0_0_0.webp.jpg


 

截取了idea 应用启动的时候的参数,可以看出idea同样是注入agent进行采集。


"C:\Program Files\Java\jdk1.8.0_121\bin\java.exe" -javaagent:C:\Users\Administrator\.IntelliJIdea2019.3\system\testAgent\intellij-coverage-agent-1.0.508.jar=C:\Users\Administrator\AppData\Local\Temp\coverage2args
复制代码


停止应用的时候,idea会自动显示代码覆盖率。


5、jacoco原理


覆盖率的粒度从细到粗分为:指令、分支、方法、类级别。采集粒度越细,代码覆盖率结果越准确,有利有弊。同时性能损耗也越大。jacoco的实现原理就是在jvm 加载的时候进行指令注入,在相关采集点注入代码,进行统计。


6、jacoco的坑


我们在使用jacoco对内网服务器进行代码覆盖率的时候,因为内网出了问题,想要热更新代码解决一个小bug,但是却屡次失败,后来想到是因为jacoco对代码进行了注入,在热更新的时候,又要拿新的class 进行更新,注入的代码和编译出来未注入的代码差异过大,因此失败,所以在启动jacoco的时候即使在debug模式,也不能热更新。


7、总结


代码覆盖率只是一种监测工具,并不能简单的用代码覆盖率来说明代码质量的高低。提供一种参考。


目录
相关文章
|
3天前
|
存储 安全 前端开发
基于springboot的流浪动物救助管理系统
基于springboot的流浪动物救助管理系统
|
8月前
|
设计模式
趣解设计模式之《小王的披萨店续集》
趣解设计模式之《小王的披萨店续集》
35 0
|
8月前
|
设计模式
趣解设计模式之《小王的披萨店》
趣解设计模式之《小王的披萨店》
23 1
|
3天前
|
Java
零食商城|基于springboot的零食商城(二)
零食商城|基于springboot的零食商城
|
3天前
|
前端开发 Java 关系型数据库
零食商城|基于springboot的零食商城(一)
零食商城|基于springboot的零食商城
|
3天前
|
Java 人机交互
零食商城|基于springboot的零食商城(三)
零食商城|基于springboot的零食商城
|
3天前
|
前端开发 Java 关系型数据库
零食商城|基于springboot的零食商城
零食商城|基于springboot的零食商城
|
8月前
|
负载均衡 Java 数据库连接
瑞吉外卖项目
瑞吉外卖项目
61 0
|
11月前
|
Java 数据库连接 mybatis
瑞吉外卖项目(超详细)
公共字段自动填充 Mybatis Plus公共字段自动填充,也就是在插入或者更新的时候为指定字段赋予指定的值,使用它的好处就是可以统一对这些字段进行处理,避免了重复代码。 实现步骤: 1、在实体类的属性上加入@TableField注解,指定自动填充的策略 2、按照框架要求编写元数据对象处理器,在此类中统一为公共字段赋值,此类需要实现MetaObjectHandler接口
|
前端开发 JavaScript Java
基于springboot的智能美食点餐配送系统
基于springboot的智能美食点餐配送系统
163 0
基于springboot的智能美食点餐配送系统