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、总结


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


目录
相关文章
|
6月前
|
Java 人机交互
零食商城|基于springboot的零食商城(三)
零食商城|基于springboot的零食商城
|
6月前
|
Java
零食商城|基于springboot的零食商城(二)
零食商城|基于springboot的零食商城
|
6月前
|
前端开发 Java 关系型数据库
零食商城|基于springboot的零食商城(一)
零食商城|基于springboot的零食商城
105 0
|
6月前
|
JSON 算法 Java
效率工具:Hutool 嘎嘎香,被秀到了!
效率工具:Hutool 嘎嘎香,被秀到了!
162 0
|
JavaScript
水果消消乐总结
项目介绍 利用原生js实现,主要分为三个部分。 导入图片 定义层级数 格式 第一部分为格式的生成,定义层数,行数,列数,元素组数以及图片数组,动态生成div,把利用模板字符串图片插入到动态生成的div里,再利用随机数打乱排列。
76 2
|
小程序 Java API
Swagger3.0 天天刷屏,真的香吗?
前言 官方文档如何说? Spring Boot版本说明 添加依赖 springfox-boot-starter做了什么? 撸起袖子就是干? 定制一个基本的文档示例 文档如何分组? 如何添加授权信息? 如何携带公共的请求参数? 粗略是一个BUG 总结
|
C++
201809-2买菜
201809-2买菜
83 0
201809-2买菜
|
前端开发 Java 关系型数据库
喝不起奶茶,咱就为奶茶店开发个会员积分收银系统
本系统基于SSM框架开发实现,前端使用easyui开发实现,功能强大,界面美观,数据库使用mysql数据库,开发工具采用idea。 系统部分功能展示如下: 系统管理员登陆: admin /admin
793 0
喝不起奶茶,咱就为奶茶店开发个会员积分收银系统
程序人生 - 如何不喝到奶茶里面珍珠的方法?
程序人生 - 如何不喝到奶茶里面珍珠的方法?
79 0
程序人生 - 如何不喝到奶茶里面珍珠的方法?
程序人生 - 阿萨姆奶茶 & 元气森林乳茶
程序人生 - 阿萨姆奶茶 & 元气森林乳茶
127 0
程序人生 - 阿萨姆奶茶 & 元气森林乳茶