一文讲清白盒测试中的那些代码覆盖率:语句、判定、条件、MCDC等


前言

白盒测试中的代码覆盖率是用来度量测试完整性的一种指标。它基于程序的内部结构,关注程序内部的逻辑路径和代码执行情况,是评价软件测试质量的重要手段之一。
常用的白盒测试覆盖率主要包括以下几种类型:语句覆盖、判定(分支)覆盖、条件覆盖、判定-条件覆盖、条件组合覆盖、修正条件判定覆盖(MCDC)等。
其中最常用的当属:语句覆盖、判定(分支)覆盖和修正条件判定覆盖(MCDC),如下图:
在这里插入图片描述


示例代码

if (A || (B && C) )
{
	// do something
}

一、语句覆盖(Statement Coverage)

语句覆盖又称行覆盖、段覆盖、基本块覆盖等。
定义:在测试时,运行被测程序后,程序中被执行到的可执行语句的比率。
计算公式:语句覆盖率 =(至少被执行一次的语句数量)/(可执行的语句总数)× 100%。
特点:语句覆盖是最基础的一种覆盖方式,可以检验每个可执行语句,但即使语句覆盖率达到了100%,也不能保证发现所有的逻辑错误。
以上述示例为例,只需要以下1个测试用例即可满足语句覆盖100%的要求:
测试用例1:A=TRUE, B=FLASE, C=FALSE

二、判定覆盖(Decision Coverage)/ 分支覆盖(Branch Coverage)

判定覆盖,又称分支覆盖、决策覆盖。
定义:在测试时,运行被测程序后,程序中所有判断语句的取真分支和取假分支被执行到的比率。
计算公式:判定覆盖率 =(判定结果被评价的次数)/(判定结果的总数)× 100%。
特点:若判定覆盖达到100%,则语句覆盖必为100%,但不能确保每个组合条件都分别覆盖到真/假情况,所以同样可能存在逻辑错误未被发现。
以上述示例为例,只需要以下2个测试用例即可满足判定覆盖100%的要求:
测试用例1:A=TRUE, B=FLASE, C=FALSE
测试用例2:A=FLASE, B=FLASE, C=FALSE
用例说明:可以发现这两个测试用例并没有分别覆盖到A、B、C三个条件的真/假。

三、条件覆盖(Condition Coverage)

定义:在测试时,运行被测程序后,所有判断语句中每个条件的可能取值(真值和假值)出现过的比率。
计算公式:条件覆盖率 =(条件操作数值至少被评价一次的数量)/(条件操作数值的总数)× 100%。
特点:覆盖条件的测试用例不一定覆盖判定,即可能满足条件覆盖但不满足判定覆盖。
以上述示例为例,只需要以下2个测试用例即可满足条件覆盖100%的要求:
测试用例1:A=TRUE, B=FLASE, C=FALSE
测试用例2:A=FLASE, B=TRUE, C=TRUE
用例说明:可以发现这两个测试用例并没有分别覆盖到整体条件判定结果的真/假。

四、判定-条件覆盖(Decision Condition Coverage)

定义:在测试时,运行被测程序后,程序中所有判断语句中每个条件的所有可能值(为真为假)和每个判断本身的判定结果(为真为假)出现的比率。
计算公式:判定-条件覆盖率 =(条件操作数值或判定结果至少被评价一次的数量)/(条件操作数值总数+判定结果总数)× 100%。
特点:判定-条件覆盖率实际上是判定覆盖率和条件覆盖率的组合,但采用判定-条件覆盖,逻辑表达式中的错误不一定能够查得出来。
以上述示例为例,只需要以下2个测试用例即可满足判定-条件覆盖100%的要求:
测试用例1:A=FLASE, B=FLASE, C=FALSE
测试用例2:A=TRUE, B=TRUE, C=TRUE
用例说明:可以发现这两个测试用例并没有覆盖到所有判断条件的组合情况。

五、条件组合覆盖(Condition Combination Coverage)

定义:在测试时,运行被测程序后,所有语句中原子条件所有的可能的取值结果组合出现过的比率。
计算公式:条件组合覆盖率 =(至少被执行一次的条件组合)/(总的可能的条件组合数)× 100%。
特点:若条件组合覆盖率为100%,则语句覆盖率、判定覆盖率、条件覆盖率和判定-条件覆盖率必为100%。
以上述示例为例,需要以下8个测试用例才能满足条件组合覆盖100%的要求:
测试用例1:A=FALSE, B=FALSE, C=FALSE
测试用例2:A=TRUE, B=FALSE, C=FALSE
测试用例3:A=FASLE, B=TRUE, C=FALSE
测试用例4:A=FASLE, B=FASLE, C=TRUE
测试用例5:A=TRUE, B=TRUE, C=FALSE
测试用例6:A=FASLE, B=TRUE, C=TRUE
测试用例7:A=TRUE, B=FALSE, C=TRUE
测试用例8:A=TRUE, B=TRUE, C=TRUE
用例说明:遍历所有的条件组合会使测试用例的数量呈指数级增长,导致测试工作量巨大,这与现实中紧缺的测试资源是相违背的。结合实际的测试需求,加上代码中逻辑组合条件的短路原理,其实有些条件组合的测试用例实际是无意义的。

六、修正条件判定覆盖(Modified Condition Decision Coverage)

MCDC覆盖源于DO-178C等适航认证标准,是民用航空电子软件开发和适航认证过程中的重要测试要求,现已广泛应用于各个行业的关键、重要等级的软件白盒测试中。
定义:MCDC覆盖要求程序中的每个判定中的每个条件都要独立地影响判定结果,并且每个判定和每个条件都要至少取到一次所有可能的结果。
特点:MCDC覆盖强调条件之间的独立性,即每个条件都要能够独立地影响判定结果。这有助于发现那些由于条件间依赖关系导致的错误。相比条件组合覆盖等其他高级覆盖策略,MCDC覆盖能够在保证较高覆盖度的同时减少测试用例的数量。
以上述示例为例,只需要以下4个测试用例即可满足MCDC覆盖100%的要求:
测试用例1:A=FASLE, B=FASLE, C=TRUE
测试用例2:A=TRUE, B=FALSE, C=TRUE
测试用例3:A=FASLE, B=TRUE, C=TRUE
测试用例4:A=FASLE, B=TRUE, C=FALSE
用例说明:对于一个由多个条件组合形成的判定语句,满足其MCDC覆盖100%的最少测试用例个数=各个判断条件的总数+1


总结

代码覆盖率作为白盒测试中的一个关键指标,能够帮助开发人员和测试人员了解测试的覆盖面和测试的质量,并为进一步的测试提供指导。通过代码覆盖率数据,可以检测测试是否充分,分析测试的弱点在哪些方面,从而指导设计能够增加覆盖率的测试用例,有效提高测试质量。
在实际白盒测试中,测试人员通常会根据程序的复杂性和测试需求,选择适当的覆盖率类型进行测试。同时,需要注意的是,即使达到了100%的某种覆盖率,也不能保证程序的完全正确性,因为测试覆盖率只是测试完整性的一个度量手段,而不是保证程序无错误的充分条件。

相关推荐

  1. 测试覆盖率那些

    2024-07-13 14:32:03       38 阅读
  2. CMakeLists.txt语法规则:条件判断表达式说明

    2024-07-13 14:32:03       31 阅读
  3. 软件测试顶级测试覆盖率技术

    2024-07-13 14:32:03       34 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-13 14:32:03       67 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-13 14:32:03       71 阅读
  3. 在Django里面运行非项目文件

    2024-07-13 14:32:03       58 阅读
  4. Python语言-面向对象

    2024-07-13 14:32:03       69 阅读

热门阅读

  1. kotlin 基础

    2024-07-13 14:32:03       15 阅读
  2. Office 办公软件里常见的图表

    2024-07-13 14:32:03       19 阅读
  3. Ubuntu 添加gcc头文件搜索路径

    2024-07-13 14:32:03       21 阅读
  4. mysql修改数据库名称

    2024-07-13 14:32:03       18 阅读
  5. 为何服务器偏爱Linux?

    2024-07-13 14:32:03       23 阅读
  6. Scikit-learn使用和扩展之mlxtend(Stacking...)

    2024-07-13 14:32:03       22 阅读
  7. 京鸿鑫源元宇宙革新探索:开启未来零售新纪元

    2024-07-13 14:32:03       18 阅读
  8. 力扣1249.移除无效的括号

    2024-07-13 14:32:03       21 阅读
  9. 智能化监控与云原生趋势:运维团队的未来展望

    2024-07-13 14:32:03       24 阅读