在使用jacoco统计自动化代码覆盖率

jacoco统计自动化代码覆盖率

1. 简介
1.1. 什么是Jacoco
Jacoco是一个开源的代码覆盖率工具,可以嵌入到Ant 、Maven中,并提供了EclEmma Eclipse插件,也可以使用JavaAgent技术监控Java程序。很多第三方的工具提供了对Jacoco的集成,如sonar、Jenkins等。
1.2. 什么是代码覆盖率
代码覆盖(Code coverage)是软件测试中的一种度量,描述程式中源代码被测试的比例和程度,所得比例称为代码覆盖率。
代码覆盖率是衡量测试质量的一个重要指标。在对一个软件产品进行了单元测试、组装测试、集成测试以及接口测试等繁多的测试之后,我们能不能就此对软件的质量产生一定的信心呢?这就需要我们对测试的质量进行考察。如果测试仅覆盖了代码的一小部分,那么不管我们写了多少测试用例,我们也不能相信软件质量是有保证的。相反,如果测试覆盖到了软件的绝大部分代码,我们就能对软件的质量有一个合理的信心。
代码覆盖分为下面五种情况:
1.2.1. 函数覆盖
函数覆盖(Function Coverage),执行到程序中的每一个函数(或副程式)。
1.2.2. 语句覆盖
语句覆盖(Statement Coverage),又称行覆盖(Line Coverage),段覆盖(Segment Coverage),基本块覆盖(Basic Block Coverage),这是最常用也是最常见的一种覆盖方式,就是度量被测代码中每个可执行语句是否被执行到了。这里说的是“可执行语句”,因此就不会包括像C++的头文件声明,代码注释,空行,等等。非常好理解,只统计能够执行的代码被执行了多少行。需要注意的是,单独一行的花括号{}也常常被统计进去。语句覆盖常常被人指责为“最弱的覆盖”,它只管覆盖代码中的执行语句,却不考虑各种分支的组合等等。假如你的上司只要求你达到语句覆盖,那么你可以省下很多功夫,但是,换来的确实测试效果的不明显,很难更多地发现代码中的问题。
1.2.3. 判断覆盖
判断覆盖(Decision Coverage),又称分支覆盖(Branch Coverage),所有边界覆盖(All-Edges Coverage),基本路径覆盖(Basic Path Coverage),判定路径覆盖(Decision-Decision-Path)。它度量程序中每一个判定的分支是否都被测试到了。这句话是需要进一步理解的,应该非常容易和下面说到的条件覆盖混淆。因此我们直接介绍第三种覆盖方式,然后和判定覆盖一起来对比,就明白两者是怎么回事了。
1.2.4. 条件覆盖
条件覆盖(Condition Coverage),它度量判定中的每个子表达式结果true和false是否被测试到了。
1.2.5. 路径覆盖
路径覆盖(Path Coverage),又称断言覆盖(Predicate Coverage)。它度量了是否函数的每一个分支都被执行了。 这句话也非常好理解,就是所有可能的分支都执行一遍,有多个分支嵌套时,需要对多个分支进行排列组合,可想而知,测试路径随着分支的数量指数级别增加。
1.3. Jacoco的功能
1.3.1. 覆盖率计数器
Jacoco使用一系列的不同的计数器来做覆盖率的度量计算。所有这些计数器都是从java的class文件中获取信息,这些class文件可以(可选)包含调试的信息在里面。即使在没有源码的情况下,这种方法也可以实时有效地对应用程序进行度量和分析。在大部分情况下,收集到的信息可以映射到源码,可视化到每一行代码的粒度。但这种方法还是有一些限制。这些class文件必须使用调试信息来编译,这样才可以计算行的覆盖率和提供出源码的高亮。但不是所有的JAVA语言的结构都可以直接编译成一致的二进制代码。在这种情况下,java 编译器会创建所谓的“合成”代码,会导致产生一些不期望得到的覆盖率结果。
1.3.2. 指令覆盖率
Jacoco最小的计数单元是单个java二进制代码指令。指令覆盖率提供了代码是否被执行的信息。这个度量完全独立源码格式,并且总是可用,即使class文件里面没有调试信息。
1.3.3. 分支覆盖率
Jacoco也计算分支的覆盖率,包括所有的if和switch语句。这个度量计算一个方法里面的总分支数,确定执行和不执行的分支数量。分支覆盖率总是可用的,即使class文件里面没有调试信息。注意异常处理是不在分支度量里面统计的。

2、部署

自动化测试接口时,利用jacoco的agent统计覆盖率,部署方法是在jvm启动命令行里增加如下命令:

-Djava.awt.headless=true -javaagent:D:\AutoTest\jacoco\lib\jacocoagent.jar=includes=com.hundsun.*,output=tcpserver,port=8229,address=127.0.0.1 -Xverify:none

问题:

org.springframework.data.mongodb.UncategorizedMongoDbException: Query failed with error code 2 and error message 'unknown top level operator: $jacocoData' 

原因是,封装的mongo的API里利用反射对查询参数的自动化拼接查询语句,在启动了jacoco后,dto里插码了jacocoData属性,被反射组装成查询语句了。

解决办法:

后来问了部署jacoco服务的框架组人员,发现是用了java Agent在修改运行时字节码实现的,拉了dump发现确实在运行时进行字节码修改的,而在jacoco官方的github也曾经有过这个问题的issue:

jacocoData

即使用了是否为复合字段的field方法解决。即在反射的组装位置通过isSynthetic的判断如果为false,说明是插码的属性,不处理即可。

JVM插码之六:jacoco插码及问题“$jacocodata 属性 Method not found: is$jacocoData”相关推荐

  1. 【字节码插桩】AOP 技术 ( “字节码插桩“ 技术简介 | AspectJ 插桩工具 | ASM 插桩工具 )

    文章目录 一." 字节码插桩 " 技术简介 二.AspectJ 插桩工具 三.ASM 插桩工具 一." 字节码插桩 " 技术简介 性能优化 , 插件化 , 热修 ...

  2. sonar覆盖率怎么统计的_实战|Java 测试覆盖率 Jacoco插桩的不同形式总结和踩坑记录(上)...

    本文为霍格沃兹测试学院优秀学员关于 Jacoco 的小结和踩坑记录.测试开发进阶学习,文末加群. 一.概述 测试覆盖率是老生常谈的话题.因为我测试理论基础不是很好,这里就不提需求.覆盖率等内容,直奔主 ...

  3. 【JVM】字节码与ASM字节码增强、Instrument实现类的动态重加载

    目录 字节码与ASM字节码增强 什么是字节码? 字节码结构 操作数栈与字节码 字节码增强 ASM 运行时类加载 Instrument JPDA与JVMTI instrument实现热加载的过程 字节码 ...

  4. 深入理解JVM虚拟机(七):虚拟机字节码执行引擎

    代码编译的结果就是从本地机器码转变为字节码.我们都知道,编译器将Java源代码转换成字节码?那么字节码是如何被执行的呢?这就涉及到了JVM字节码执行引擎,执行引擎负责具体的代码调用及执行过程.就目前而 ...

  5. JVM虚拟机面试典籍30+ | 大别山码将

    JVM面试题总结 介绍java内存区域(运行时数据区) [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-n6UJczTB-1632497218260)(C:\Users\ ...

  6. 阿里巴巴Java 开发手册 码出高效,码出质量 1.4.0

    前言 <阿里巴巴Java 开发手册>是阿里巴巴集团技术团队的集体智慧结晶和经验总结,经历了多次大规模一线实战的检验及不断完善,系统化地整理成册,回馈给广大开发者.现代软件行业的高速发展对开 ...

  7. 【Android 电量优化】JobScheduler 源码分析 ( JobServiceContext 源码分析 | 闭环操作总结 | 用户提交任务 | 广播接收者接受相关广播触发任务执行 )★

    文章目录 一.JobServiceContext 引入 二.JobServiceContext 源码分析 三.用户在应用层如何使用 JobScheduler 四.用户提交任务 五.广播接收者监听广播触 ...

  8. 怎么点亮段码屏_段码液晶屏实现原理及应用

    什么是段码液晶屏 段码液晶或段码液晶屏,只是液晶屏的用户对于某一类液晶显示屏的一种叫法,但是在液晶行业之内,一般都称之为图案型的液晶屏,从而来区别于点阵型的液晶屏,故段码液晶屏并不是一个很严格的表述或 ...

  9. ARM树莓派高级开发——linux内核源码、树莓派源码编译、SD卡挂载

    文章目录 linux内核开发基础(linux内核源码.树莓派源码编译.SD卡挂载) 树莓派等芯片带操作系统的启动过程 linux内核源码树 Linux内核源代码目录树结构: 树莓派Linux源码配置 ...

最新文章

  1. 深入浅出PHP(Exploring PHP)
  2. [转载]什么情况下应该设置 cudnn.benchmark = True?
  3. linux 档案类型s,Linux学习(四)档案与目录管理
  4. 用Scikit-learn和TensorFlow进行机器学习(一)
  5. pythonwin32api拖动图标_Python使用win32api,模拟鼠标移动并复制/粘贴到diskfi中
  6. 【共享单车】—— React后台管理系统开发手记:权限设置和菜单调整(未完)...
  7. Uva572(DFS+联通集)
  8. mean技术栈 linux,“MEAN”技术栈开发web应用
  9. 老年人自学计算机,老年人怎样学电脑?请问从网上能找到学习资吗?
  10. 单目视觉里程计 mono vo
  11. 零束银河全栈技术解决方案之数字化体验平台产品篇
  12. 模电Aus,Uo/Us,童诗白例2.3.3。
  13. 使用融云 SDK 避坑指南之 iOS13 推送失败
  14. gradle切换online/offline mode模式
  15. 狄马:荒谬的苦难哲学
  16. QCTF - re -babyre(Rust逆向)
  17. 快捷下载中国原创音乐基地音乐(包括金豆和无法下载音乐)
  18. PTA1025C语言解析
  19. json tobean
  20. nodemcu c语言开发,nodemcu连接到中移onenet平台

热门文章

  1. strtus2改成springboot_springboot+struts2打成jar包运行
  2. 在linux服务器上安装Jenkins
  3. C/C++数组指针和指针数组
  4. C++学习笔记:(二)函数重载 常量与引用
  5. 数据结构(2) -- 线性表的顺序表示
  6. [leetcode]102.二叉树的层序遍历
  7. Linux wifi连接桌面,【已解决】Arch linux 安装之后在deepin桌面环境下使用networkmanager连接wifi 出现间歇性重连的情况...
  8. controller调用controller的方法_你想过 Controller 这些方法里的参数是如何工作的吗?...
  9. linux文本工具总结,Linux 文本工具
  10. 自动控制matlab实验,自动控制matlab实验.doc