基于 codediff 的差异代码覆盖率统计实现

栏目: 编程工具 · 发布时间: 6年前

内容简介:作者| 洪硕果基本含义:测试后被测目标已执行的代码数 / 被测目标总的代码数触发行为:功能测试、接口测试

作者| 洪硕果

代码覆盖率概述

基本含义:测试后被测目标已执行的代码数 / 被测目标总的代码数

触发行为:功能测试、接口测试

度量维度:函数覆盖、语句覆盖、判断覆盖、条件覆盖、路径覆盖等

代码覆盖率可以作为需求覆盖率的补充,反向衡量测试充分性

  1. 如何衡量测试覆盖率?
    • 基于需求的测试覆盖率:从需求测试点--测试用例的执行情况衡量
    • 基于代码的测试覆盖率:从代码层面--目标对象的代码执行情况衡量
  2. 全量代码覆盖率存在的问题
    • 开发代码冗余量大,重复代码、废弃代码影响覆盖率值
    • 无法精确评估测试覆盖情况
  3. 差异代码覆盖率优点
    • 针对小需求精准评估测试范围覆盖情况
    • 把控RD上线自测情况
    • 设置阈值,作为测试通过的指标

代码覆盖率参考意义

  • 分析未覆盖部分的代码,从而反推在前期测试用例设计是否充分,评估需求理解是否清晰,用例设计是否遗漏。
  • 检测出程序中的废代码,可以逆向反推在代码设计中思维混乱点,提醒开发人员理清代码逻辑关系,提升代码质量。
  • 代码覆盖是一种度量方法,而不是衡量正确性或性能的指标。代码覆盖并不等于测试质量、代码质量,把它作为一种发现未被测试覆盖的代码的手段。

差异代码覆盖率统计方法

  1. 转转的代码覆盖率统计特点
    • 依托Beetle管理平台
    • 利用测试服务器agent服务能力
    • code diff功能
    • 实现一种平台页面化配置和查看全量及差异代码覆盖率的能力
    • 核心:统计被测目标已执行的代码数,收集被测目标的执行轨迹信息
  2. 采用开源项目jacoco( Java Code Coverage )
    • Jcoco实现覆盖率统计的方式:字节码插桩, 有On-The-Fly在线和Offine离线两种方式
    • On-The-Fly:不需要改源代码、实时收集执行信息、需要启动 java 代理
    • Offline: 提前对文件插桩、停机获取执行信息、不需要代理
  3. 采用在线On-the-fly方式
    • JVM中通过-javaagent参数指定jacocoagent.jar文件启动Instrumentation的代理程序
    • 代理程序在Class Loader加载一个class文件前,将统计探针(boolean型数组)插入class文件中
    • 字节码指令触发时探针进行输入设置为true
  4. 转转的差异代码覆盖率实现结构 基于 codediff 的差异代码覆盖率统计实现
  5. 全量覆盖率
    • 当前部署版本执行测试后的代码覆盖情况,不会累加以前版本的覆盖情况;
    • 直接采用jacoco生成的完整覆盖率报告,有多种维度的覆盖率计数;
  6. 差异覆盖率
    • 开发代码改动点的行覆盖情况;
    • 差异覆盖率 = 已覆盖的差异代码行数/总的差异行数;
    • 取改动代码的行号,解析jacoco覆盖率报告
    • 会累加以前版本的测试覆盖情况;
  7. Jacoco覆盖率报告解读 基于 codediff 的差异代码覆盖率统计实现
    • 提供多维度的计数器:指令级(Instructions,C0 coverage)、分支(Branches,C1 coverage) 、圈复杂度(Cyclomatic Complexity)、行(Lines)、方法(Non-abstract Methods)、类(Classes)
      基于 codediff 的差异代码覆盖率统计实现
    • 分支覆盖(分支被执行情况): 红色钻石:无覆盖;黄色钻石:部分覆盖;绿色钻石:全覆盖;
    • 行覆盖(字节码指令被执行情况):红色背景:无覆盖;黄色背景:部分覆盖;绿色背影:全覆盖;
  8. 差异覆盖率统计方法 基于 codediff 的差异代码覆盖率统计实现
    • 差异对比基础:拉分支时的版本
    • 累加上次版本:版本n未覆盖行,查询版本n-1,若存在并已覆盖,判断last diff是否存在,不存在则设置该行已覆盖,其它则未覆盖; 存在两次遍历,计算比较耗时;
  9. 差异覆盖率报告解读 基于 codediff 的差异代码覆盖率统计实现
    • 统计范围:service包中的可执行语句,配置文件、import/注释语句均不计入;
    • 行覆盖统计标准:只要该行被执行过,就认为已覆盖;

覆盖率统计与SCF服务代码冲突解决方法

  1. 插桩方法:向类中插入一个静态变量$jacocoData和静态方法$jacocoInit()
  2. 插桩对代码影响:
    • 影响1:变量$jacocoData缺少缺少get和set方法,数据库实体类进行操作时报错; 基于 codediff 的差异代码覆盖率统计实现
    • 影响2: 使用时遍历成员变量,不识别$jacocoData变量,代码解析报错。 影响对象:实体类;解决方法:过滤掉这些类,不进行插桩 具体实现:更改jacoco源码,加载类时根据匹配规则判断是否进行插桩,匹配规则:类注解匹配( SCFSerializable 、 Table 、Data);类方法匹配(判断是否仅有get、set方法);类名匹配;匹配规则更新方式:配置文件形式存在,有更新时,动态推送到各测试服务器

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

认知与设计

认知与设计

Jeff Johnson / 张一宁 / 人民邮电出版社 / 2011-9-1 / 59.00元

本书语言清晰明了,将设计准则与其核心的认知学和感知科学高度统一起来,使得设计准则更容易地在具体环境中得到应用。涵盖了交互计算机系统设计的方方面面,为交互系统设计提供了支持工程方法。不仅如此,这也是一本人类行为原理的入门书。一起来看看 《认知与设计》 这本书的介绍吧!

Base64 编码/解码
Base64 编码/解码

Base64 编码/解码

SHA 加密
SHA 加密

SHA 加密工具

XML 在线格式化
XML 在线格式化

在线 XML 格式化压缩工具