jacoco的增量覆盖率报告实现的逻辑和一些个人想法。

jacoco报告分析

从jacococli.jar的使用方法可以看到,导出的文件格式有csv,xml,html等多种格式。

进行尝试后,可以看到xml是数据信息较全的一种类型。

下面对xml的报告构成过一个分析:

1、counter标签

记录了行覆盖率、 类覆盖率、 分支覆盖率、 方法覆盖率、指令覆盖、 圈复杂度的具体覆盖和未覆盖数。其中,LINE行覆盖率与jacoco的整体覆盖率波形图中的数据是一致的。

2、package标签

...

包含主要信息:类、行覆盖信息、包内行覆盖率统计数据。

sourcefile中就是源码中某一行的执行情况,与最终jacoco html的页面样式对应关系如下

处理jacoco的xml报告原始数据,生成增量报告

搞清楚xml报告和html报告中的逻辑关系后,就可以着手开始对xml中的数据进行处理定制自己的类型报告了。

由于前端开发能力有限,打算直接修改jacoco的原始报告的展示逻辑,达到展示增量报告的目的。

处理逻辑

处理的基本步骤说明

三个数据采集:代码差异、覆盖率exec文件、代码文件(src目录、class目录)

整体处理步骤:

1、将代码差异与代码源文件进行比对,生成标记出代码新增的java文件

2、通过jacococli的report方法将 exec文件转成xml数据格式

3、分析覆盖率报告xml文件,①计算各类覆盖率;②生成带有覆盖率信息、新增代码标识的仿jacoco html报告的网页

实现说明

1、标记代码差异

在jenkins中增加shell指令执行git diff。

根据研发人员对代码上线的管理方式,挑选合适的比对对象。例如,主干上线,分支开发的,可以每次使用勾选的分支与上一次上线分支进行比对;如果是小项目直接主干开发的,可以选择增加git参数,revision来标识比对的基准历史版本。

git diff "origin/prod" ${branch} ./src/main/java > /gitdifffile/${JOB_NAME}.txt

git diff ${old_version} ${GIT_COMMIT} ./src/main/java > /gitdifffile/${JOB_NAME}.txt

根据获取到的代码差异信息,与src目录下的原始文件比对,标记出代码差异。

细节:

空行、符号的过滤;“import XXX”,“log”等不重要内容差异的过滤;

新增代码、删除代码仍使用git比对结果的方式进行标记,“+”标识新增,“-”标识删减

可根据需要过滤部分文件的差异。

基本上就是python的文本比对,文本读取和写入。

2、覆盖率数据exec文件的保存

由于实际使用的场景,希望获取的信息区间为某次迭代周期内。

增加启停脚本入参isnewstory,

isnewstory=true 属于新迭代的情况下:服务停止前不进行dump操作,且删除保留的历史exec文件。

isnewstory=False 非新迭代,每次项目停止的时候,进行dump保存执行数据。确保是完整的版本测试执行覆盖率数据

3、报告的展示

报告分为覆盖率数据报告和详细代码标识两类,通过python的flask框架,全端仍使用jacoco的前端(前端不好,不想改了)

覆盖率数据报告页面

大概说下流程

刷新brief report页面时,通过os.popen(jacococli.jar的命令),实时获取最新覆盖率数据(dump),并将多个exec合成一个(merge),生成最新的jacoco xml报告(report)

根据gitdiff找到与上线版本不同的代码,查找这部分代码对应的覆盖率数据,过滤掉不需要的。python读写文件,解析xml,并计算

详细代码标识页面

每次在jenkins构建过程中,即调用脚本将gitdiff的数据转为含有代码增删标识的java文件

调用详细代码标识页面时,获取对应的java文件,并实时分析jacoco xml报告的对应内容,添加与jacoco原始页面一样的样式标识。

总结

当前的问题

1、为了提供更全面的代码上下文进行参考,并未细化到具体方法。如果覆盖率数据要提供更高效准确的覆盖率判断标准,则必须再细化和深入,实现难度比较大。

2、实际统计的数据与测试的覆盖仍存在一定的差异。例如完全覆盖也不能说明测试的全面。如果是漏了一种业务场景,那覆盖率100%也没有意义。

未覆盖到怎么办

根据从这套工具开始使用,到现在,几乎每次在上线前都会遇到新增代码标识为红色,或者分支没有覆盖到的情况,除非是那种非常非常小的改动。

未覆盖到有一些情况就比较无奈

1、部分异常捕获的代码段

try {

.......

}catch (Exception e) {

log.error("save to cache error", e.getMessage());

}

异常捕获后并无其它处理逻辑,仅仅只是打印问题。

如果是普通的场景还比较好涉及测试用例,但很简单的功能中,这个部分从接口、前端操作触发的数据流向触发不到的。确认这样的情况,通常就会放弃这条未覆盖。

2、修复bug,例如仅仅判断的边界值进行了修改等,则回归范围并不覆盖完整逻辑的,也不会为了达到100% 的覆盖率而执行完整用例。

3、很多业务渐渐使用频率已经几乎为0 ,历史代码还留着不删(怕出问题)的。这种最坑。

个人想法

覆盖率数据个人觉得更大的意义在于评估提测与实际代码更改的信息是否相符,另外在确认业务场景和处理逻辑后,通过覆盖率结果来进行查漏补缺。在某些简单的场景下,可以当做是一个白盒测试的途径。

python接口测试覆盖率统计_从 jacoco 报告数据分析,python 脚本实现增量覆盖率统计...相关推荐

  1. python技术栈全景图_程序员之数据分析Python技术栈

    程序员之数据分析Python技术栈 Python是一种非常流行的脚本语言,其还提供了一个科学技术栈,可以进行快捷方便的数据分析,本系列文章将聚焦在如何使用基于Python的技术栈来构建数据分析的工具集 ...

  2. python新手入门教程思路-Python新手入门教程_教你怎么用Python做数据分析

    Python新手入门教程_教你怎么用Python做数据分析 跟大家讲了这么多期的Python教程,有小伙伴在学Python新手教程的时候说学Python比较复杂的地方就是资料太多了,比较复杂.很多网上 ...

  3. python打造excel神器_超简单:用Python让Excel飞起来

    前言 如何获取学习资源 章Python快速上手 1.1为什么要学习用Python控制Excel 1.2Python编程环境的搭建 1.2.1安装Python官方的编程环境IDLE 1.2.2安装与配置 ...

  4. python数据科学入门_干货!小白入门Python数据科学全教程

    前言本文讲解了从零开始学习Python数据科学的全过程,涵盖各种工具和方法 你将会学习到如何使用python做基本的数据分析 你还可以了解机器学习算法的原理和使用 说明 先说一段题外话.我是一名数据工 ...

  5. python办公自动化博客_最全总结 | 聊聊 Python 办公自动化之 Word(下)

    1. 前言 关于 Word 文档的读写,前面两篇文章分别进行了一次全面的总结 最全总结 | 聊聊 Python 办公自动化之 Word(上) 最全总结 | 聊聊 Python 办公自动化之 Word( ...

  6. python扩展c教程_使用C/C++扩展Python

    如果你会用C,实现Python嵌入模块很简单.利用扩展模块可做很多Python不方便做的事情,他们可以直接调用C库和系统调用. 为了支持扩展,Python API定义了一系列函数.宏和变量,提供了对P ...

  7. python高分书籍推荐_如果只能推荐一本 Python 书,我一定 Pick 它

    前段时间,我偶然看到了一条推特: <流畅的Python>一书的作者发布了一条激动人心的消息:他正在写作第二版! 如果要票选最佳的 Python 进阶类书目,这本书肯定会是得票率最高的书籍之 ...

  8. python高分书籍推荐_如果只推荐一本 Python 书,我要 Pick 它!

    今年二月初,我偶然看到了一条推特: <流畅的Python>一书的作者发布了一条激动人心的消息:他正在写作第二版! 如果要票选最佳的 Python 进阶类书目,这本书肯定会是得票率最高的书籍 ...

  9. python代码编写工具_编写更好的Python代码的终极指南

    python代码编写工具 Despite its 尽管它 downsides, Python remains the king of today's programming world. Its ve ...

最新文章

  1. java xslt 2,使用xsl:for-each-group进行XSLT 2.0分组
  2. 记录一些比较有趣的网站,来给自己的网站设计积累思想
  3. WPF IP地址输入控件的实现
  4. 不root的情况下 查看App的数据表
  5. 关闭SSMS的事务自动提交,改为手动提交
  6. 计算机网络(韩立刚网课笔记)
  7. python元组是有序还是无序_python-03 元组和字典
  8. tomcat配置项目的接种方式
  9. Python 经典学习资料收集
  10. 51单片机在物联网中的应用实战-熊健-专题视频课程
  11. RMAN-20003错误
  12. 计算机专业职业战队,「团长分享」计算机系Meiko?画家小姜?如果选手没打职业……...
  13. [安卓开发] 总结一些android的云测试平台
  14. 拓嘉辰丰电商:拼多多旗舰店有哪些优势,该怎么开?
  15. LaTeX复选框实现
  16. 脑机接口再突破,让失语者能“说话”
  17. 调试 .dmp 文件
  18. 网格合并案例:实现网页图片不规则排列的两种办法
  19. vcpkg安装msys2
  20. 第29届北京奥运会开幕式

热门文章

  1. WebService入门讲解
  2. 机械硬盘低级格式化软件_低级比高级安全?磁盘格式化要保护秘密
  3. 2.1.5 操作系统之线程概念与多线程模型
  4. ajax项目设置,jQuery_ajax预处理_和后置处理;项目中ajax自动设置_token_请求头,_接口响应code的统一处理...
  5. Linux IPC / 分类
  6. TCPIP / 粘包和拆包的定义以及解决办法
  7. java 抽象工厂工厂_java之抽象工厂
  8. android o preview 3,Android O Preview 之 通知渠道(Notification Channels)
  9. arraylist 后往前遍历_面试官:请说出线程安全的 ArrayList 有哪些,除了Vector
  10. windows文件 linux cr,DOS/Windows和Linux/Unix间的文件格式转换