文章目录

  • 需求覆盖率
  • 代码覆盖率
    • 最常用的三种代码覆盖率指标
    • 代码覆盖率的价值
    • 代码覆盖率的局限性
    • 代码覆盖率工具
    • 代码覆盖率工具的实现原理
  • 小结

从广义角度讲,测试覆盖率主要分为两大类,一类是面像项目于的需求覆盖率,另一类是更偏向技术的代码覆盖率。

需求覆盖率

测试对需求的覆盖程度,通常是将每一条分解后的软件需求和对应的测试建立一对多的映射关系,最终目标是保证测试可以覆盖每个需求,以把证软件产品的质量。

我们通常采用 ALM,Doors 和 TestLink 等需求管理工具来建立需求和测试的对应关系,并以此计算测试覆盖率。

需求覆盖率统计方法属于传统瀑布模型下的软件工程实践,传统瀑布模型追求自上而下地制定计划、分析需求、设计软件、编写代码、测试和运维等,在流程上是重量级的,已经很难适应当今互联网时代下的敏捷开发实践。

所以,互联网测试项目中很少直接基于需求来衡量测试覆盖率,而是将软件需求转换成测试需求,然后基于测试需求再来设计测试点。

因此,现在人们口中的测试覆盖率,通常默认指代码覆盖率,而不是需求覆盖率。

代码覆盖率

代码覆盖率是指,至少被执行了一次的条目数占整个条目数的百分比。

如果“条目数”是语句,对应的就是代码行覆盖率;如果“条目数”是函数,对应的就是函数覆盖率;如果“条目数”是路径,那么对应的就是路径覆盖率。依此类推,你就可以得到绝大多数常见的代码覆盖率类型的定义。

最常用的三种代码覆盖率指标

行覆盖率又称为语句覆盖率,指已经被执行到的语句占总可执行语句(不包含类似 C++ 的头文件声明、代码注释、空行等等)的百分比。这是最常用也是要求最低的覆盖率指标。实际项目中通常会结合判定覆盖率或者条件覆盖率一起使用。

  • 判定覆盖又称分支覆盖,用以度量程序中每一个判定的分支是否都被测试到了,即代码中每个判断的取真分支和取假分支是否各被覆盖至少各一次。比如,对于 if(a>0 && b>0),就要求覆盖“a>0 && b>0”为 TURE 和 FALSE 各一次。
  • 条件覆盖是指,判定中的每个条件的可能取值至少满足一次,度量判定中的每个条件的结果 TRUE 和 FALSE 是否都被测试到了。比如,对于 if(a>0 && b>0),就要求“a>0”取 TRUE 和 FALSE 各一次,同时要求“b>0”取 TRUE 和 FALSE 各一次。
代码覆盖率的价值

统计代码覆盖率的根本目的是找出潜在的遗漏测试用例,并有针对性的进行补充,同时还可以识别出代码中那些由于需求变更等原因造成的不可达的废弃代码。

通常我们希望代码覆盖率越高越好,代码覆盖率越高越能说明你的测试用例设计是充分且完备的,但你也会发现测试的成本会随着代码覆盖率的提高以类似指数级的方式迅速增加。

如果想达到 70% 的代码覆盖率,你可能只需要 30 分钟的时间成本。但如果你想把代码覆盖率提高到 90%,那么为了这额外的 20%,你可能花的时间就远不止 30 分钟了。更进一步,你如果想达到 100% 的代码覆盖率,可想而知你花费的代价就会更大了。

因为在后期,你需要大量的桩代码、Mock 代码和全局变量的配合来控制执行路径。所以,在软件企业中,只有单元测试阶段对代码覆盖率有较高的要求。因为从技术实现上讲,单元测试可以最大化地利用打桩技术来提高覆盖率。而你如果想在集成测试或者是 GUI 测试阶段将代码覆盖率提高到一定量级,那你所要付出的代价是巨大的,而且在很多情况下根本就实现不了。

代码覆盖率的局限性

其实即使设计的测试用例已经达到 100% 的代码覆盖率,软件产品的质量也做不到万无一失。其根本原因在于代码覆盖率的计算是基于现有代码的,并不能发现那些“未考虑某些输入”以及“未处理某些情况”形成的缺陷。

举个极端的例子,如果一个被测函数里面只有一行代码,只要这个函数被调用过了,那么衡量这一行代码质量的所有覆盖率指标都会是 100%,但是这个函数是否真正实现了应该需要实现的功能呢?

显然,代码覆盖率反映的仅仅是已有代码的哪些逻辑被执行过了,哪些逻辑还没有被执行过。以此为依据,你可以补充测试用例,可以去测试那些还没有覆盖到的执行路径。但也是仅此而已,对于那些压根还没有代码实现的部分,基于代码覆盖率的统计指标就无能为力了。

总结来讲,高的代码覆盖率不一定能保证软件的质量,但是低的代码覆盖率一定不能能保证软件的质量。

代码覆盖率工具

JaCoCo 是一款 Java 代码的主流开源覆盖率工具,可以很方便地嵌入到 Ant、Maven 中,并且和很多主流的持续集成工具以及代码静态检查工具,比如 Jekins 和 Sonar 等,都有很好的集成。

如下 所示为 JaCoCo 的整体代码覆盖率统计报告,包括了每个 Java 代码文件的行覆盖率以及分支覆盖率统计,并给出了每个 Java 代码文件的行数、方法数和类数等具体信息。

如下 所示为每个 Java 文件内部详细的代码覆盖率情况,图中绿色的行表示已经被覆盖,红色的行表示尚未被覆盖,黄色的行表示部分覆盖;左侧绿色菱形块表示该分支已经被完全覆盖、黄色菱形块表示该分支仅被部分覆盖。

代码覆盖率工具的实现原理

JaCoCo 的详细报告,让你惊叹于代码覆盖率工具的强大。但这样的统计信息如何被获取到的呢?

统计代码覆盖率的不同注入实现技术

实现代码覆盖率的统计,最基本的方法就是注入(Instrumentation)。简单地说,注入就是在被测代码中自动插入用于覆盖率统计的探针(Probe)代码,并保证插入的探针代码不会给原代码带来任何影响。

对于 Java 代码来讲,根据注入目标的不同,可以分为源代码(Source Code)注入和字节码(Byte Code)注入两大类。基于 JVM 本身特性以及执行效率的原因,目前主流的工具基本都是使用字节码注入,注入的具体实现采用 ASM 技术。

ASM 是一个 Java 字节码操纵框架,能被用来动态生成类或者增强既有类的功能,可以直接产生 class 文件,也可以在类被加载入 JVM 之前动态改变类行为。

根据注入发生的时间点,字节码注入又可以分为两大模式:On-The-Fly 注入模式和 Offline 注入模式。

On-The-Fly 注入模式

On-The-Fly 模式的特点在于无需修改源代码,也无需提前进行字节码插桩。它适用于支持 Java Agent 的运行环境。

这样做的优点是,可以在系统不停机的情况下,实时收集代码覆盖率信息。缺点是运行环境必须允许使用 Java Agent。

实现 On-The-Fly 模式,主要有两种技术方案:

  • 开发自定义的类装载器(Class Loader)实现类装载策略,每次类加载前,需要在 class 文件中插入探针,早期的 Emma 就是使用这种方案实现的探针插入;

  • 借助 Java Agent,利用执行在 main() 方法之前的拦截器方法 premain() 来插入探针,实际使用过程中需要在 JVM 的启动参数中添加“-javaagent”并指定用于实时字节码注入的代理程序,这样代理程序在装载每个 class 文件前,先判断是否已经插入了探针,如果没有则需要将探针插入 class 文件中,目前主流的 JaCoCo 就是使用了这个方式。

Offline 注入模式

Offline 模式也无需修改源代码,但是需要在测试开始之前先对文件进行插桩,并事先生成插过桩的 class 文件。它适用于不支持 Java Agent 的运行环境,以及无法使用自定义类装载器的场景。

这样做的优点是,JVM 启动时不再需要使用 Java Agent 额外开启代理,缺点是无法实时获取代码覆盖率信息,只能在系统停机时下获取。

Offline 模式根据是生成新的 class 文件还是直接修改原 class 文件,又可以分为 Replace 和 Inject 两种不同模式。

和 On-The-Fly 注入模式不同,Replace 和 Inject 的实现是,在测试运行前就已经通过 ASM 将探针插入了 class 文件,而在测试的运行过程中不需要任何额外的处理。Cobertura 就是使用 Offline 模式的典型代表。

小结

测试覆盖率通常被用来衡量测试的充分性和完整性,包括面向项目的需求覆盖率和更偏向技术的代码覆盖率。而需求覆盖率的统计方式不再适用于现在的敏捷开发模式,所以现在谈到测试覆盖率,大多是指代码覆盖率。

但是,高的代码覆盖率不一定能保证软件的质量,因为代码覆盖率是基于现有代码,无法发现那些“未考虑某些输入”以及“未处理某些情况”形成的缺陷。

衡量测试的充分性和完整性-测试覆盖率相关推荐

  1. Node.js 单元测试:我要写测试 - Mocha - Nodejs开源项目里怎么样写测试、CI和代码测试覆盖率

    -------------------------------------- 单元测试Express/NodeJs 个人理解, 1,如果不是测试http请求的单元测试,用Mocha, Chai等基本够 ...

  2. jar完整性测试的Java代码

    /** * jar完整性测试/检测的Java代码(CRC检测)<br> * 一些常见的异常,也就是类似CRC异常 <br> * Unexpected end of ZLIB i ...

  3. 眼图测试(信号完整性测试)-嵌入式多媒体卡eMMC存储芯片

    眼图测试(信号完整性测试)-嵌入式多媒体卡eMMC存储芯片 嵌入式多媒体卡eMMC存储芯片被广泛地应用在手机.平板电脑.GPS终端.电子书和其他应用微处理器的消费电子设备和工业物联网设备中. 在将eM ...

  4. 信号完整性测试,关于SMA装配的细节,很多人都忽视了

    作者 | 萧隐君,仿真秀专栏作者 SMA转接头是射频微波.天线和高速电路测试经常用到的一种连接器,应用非常广泛,种类也很多.在信号完整性的测试夹具中,2.92mm的SMA用的较多,它的带宽可以到40G ...

  5. 让一部分人先学会以太网【信号完整性测试】

    在最近的项目中遇到的需要做信号完整性测试的几个例子,在此记录下软件配置部分. 1. phy芯片---信号一致性测试 1.1 ksz9896信号一致性测试 一般的phy配置成非自协商,强制千兆,配置4种 ...

  6. 精准测试与开源工具Jacoco的覆盖率能力大PK

    导读:本文根据实际使用情况,简要分析了精准测试和类Jacoco等传统白盒工具在设计理念.功能和应用场景的异同点,并阐述了覆盖率技术如何在新型企业开发体系中,发挥应有的重要作用. 覆盖率技术可以说是测试 ...

  7. 高效的敏捷测试第十一课 敏捷测试分析、策略和方法

    第26讲:基于上下文驱动思维的测试分析 从这一讲开始,我们就进入了第 5 部分内容的学习:敏捷测试分析与计划.在这一部分你将学到:测试需求分析.测试风险的识别.测试策略及测试计划的制定.今天先从基于上 ...

  8. 面试测试开发工程师:Java测试基础篇

    目录 1. 什么是软件测试? 2. 测试与调试的区别 3. 软件测试的目的和原则 4. 什么是需求 5. 什么是bug 5.1 如何描述一个bug 5.2 如何定义bug的级别 5.3 bug的生命周 ...

  9. Silverlight测试——利用Ranorex实现数据驱动测试

    最近这段时间一直很忙, 上次关于Jacklin提出WindowsPhone 7访问本地DataBase在XAP包无法操作问题. 我正在WP7上测试利用开源数据库DB4O和SiaqoDB方式来解决这个问 ...

  10. 测试面试题集-1.测试基础理论

    ------·今天距2020年74天·------ 这是ITester软件测试小栈第62次推文 大家好 我是coco小锦鲤 最近很多小可爱在找工作.找实习 因为知识积累不系统 不会总结 经验不足等原因 ...

最新文章

  1. webpack打包转换es6_webpack(二)解析es6并打包
  2. mysql noinstall 布署_mysql-noinstall.zip免安装版的优化配置和精简
  3. .Net高并发解决思路(转)
  4. Android LiveData组件详解以及LiveDataBus
  5. runtime-归档
  6. 斐波那契数列c++代码_轮到你了,斐波那契数列!
  7. java的算术表达式程序,java计算数学表达式
  8. iis7.5配置 html,windows server 2008R2系统 IIS7.5配置伪静态的方法(urlrewrite)
  9. php怎样创建csv文件,如何使用PHP创建CSV文件?(代码示例)
  10. mysql安装了老版本_Windows 环境下 MySQL 5.7 安装配置指南
  11. 电脑常用音频剪辑软件_常用的音频编辑软件
  12. CVPR 2018 paper list(论文列表)
  13. 常用的Regex验证方法
  14. laravel 配置邮件发件人_Jenkins中配置自动化测试项目
  15. TS封装格式介绍及解析
  16. 《现代操作系统(中文第三版)》课后习题——第六章 死锁
  17. 设置ie默认版本为ie7
  18. GraphSAGE NIPS 2017 代码分析(Tensorflow版)
  19. Eclipse 注释乱码
  20. css之overflow

热门文章

  1. 单片机驱动DM9000网卡芯片
  2. 【OpenCV-Python-课程学习(贾)】OpenCV3.3课程学习笔记:图像色彩空间转换(cvtColor),imread()的grayscale和cvtColor()的区别、通道分离与转换
  3. 16行Python代码 批量采集 短视频音乐素材❤
  4. 关于机器学习模型的评估方法
  5. mbedtls交换服务器证书,mbedtls | 07 - DH秘钥协商算法的配置与使用
  6. 关于win10更新的坑,头一次【这台电脑无法运行Windows10,我们无法跟新系统保留的部分】
  7. 土壤湿度计检测模块 土壤湿度传感器 机器人智能小车
  8. 面试官:如何实现单行/多行文本溢出的省略样式?
  9. 如何解决Mac电脑键盘上的大写锁定键灯不亮?
  10. php 自定义模板标签,自定义模板解析list标签