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

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

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

作者| 洪硕果

代码覆盖率概述

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

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

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

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

  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方法);类名匹配;匹配规则更新方式:配置文件形式存在,有更新时,动态推送到各测试服务器

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

查看所有标签

猜你喜欢:

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

Rationality for Mortals

Rationality for Mortals

Gerd Gigerenzer / Oxford University Press, USA / 2008-05-02 / USD 65.00

Gerd Gigerenzer's influential work examines the rationality of individuals not from the perspective of logic or probability, but from the point of view of adaptation to the real world of human behavio......一起来看看 《Rationality for Mortals》 这本书的介绍吧!

图片转BASE64编码
图片转BASE64编码

在线图片转Base64编码工具

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

Base64 编码/解码

RGB CMYK 转换工具
RGB CMYK 转换工具

RGB CMYK 互转工具