白盒测试的几种覆盖方法:语句覆盖、判定覆盖、条件覆盖、判定/条件覆盖、组合覆盖和路径覆盖详解

article/2025/10/7 11:15:40

文章转自:https://blog.csdn.net/LOVEYSUXIN/article/details/82592588?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.nonecase&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.nonecase

白盒测试用例设计的一个很重要的评估标准就是对代码的覆盖度。一说到覆盖,大家都感觉非常熟悉,但是常见的覆盖都有哪些?各自有什么优缺点?在白盒测试的用例设计中我们应该如何自如地运用呢?今天小编就为大家总结了一下几种常见的覆盖以及各自的优缺点。

白盒测试中常见的覆盖有六种:语句覆盖、判定覆盖、条件覆盖、判定/条件覆盖、组合覆盖和路径覆盖。下面我们就分别看看这几种不同的覆盖究竟是什么鬼。

一、语句覆盖(Statement Coverage)

语句覆盖,顾名思义就是针对代码语句的嘛。它的含义是我们设计出来的测试用例要保证程序中的每一个语句至少被执行一次。通常语句覆盖被认为是“最弱的覆盖”,原因是它仅仅考虑对代码中的执行语句进行覆盖而没有考虑各种条件和分支,因此在实际运用中语句覆盖很难发现代码中的问题。举个非常简单的例子:

public int foo(int a,int b)

{

return a/b;

}

这是一个求两数之商的函数。如果我们设计如下的测试用例:

TestCase: a = 2, b = 1

这时候我们会发现,该函数的代码覆盖率达到了100%,并且设计的case可以顺利通过测试。但是显然该函数有一个很明显的bug:当 b=0 时,会抛出异常。

二、判定覆盖(Decision Coverage)

判定覆盖也被成为分支覆盖(Branch Coverage),也就是说设计的测试用例要保证让被测试程序中的每一个分支都至少执行一次。举个例子,有如下流程图:

针对该图我们想要做到判定覆盖,可以设计如下case:

TestCase1: a=1, b=1    (路径:ab)

TestCase2: a=-1, b=-1    (路径:acd)

TestCase3: a=2, b=-1    (路径:ace)

判定覆盖比语句覆盖强一些,能发现一些语句覆盖无法发现的问题。但是往往一些判定条件都是由多个逻辑条件组合而成的,进行分支判断时相当于对整个组合的最终结果进行判断,这样就会忽略每个条件的取值情况,导致遗漏部分测试路径。

三、条件覆盖(Condition Coverage)

条件覆盖于分支覆盖不同,条件覆盖要求所设计的测试用例能使每个判定中的每一个条件都获得可能的取值,即每个条件至少有一次真值、有一次假值。

仍然以上面流程图作为例子来说明。上图中涉及到的条件一共有4个:

a>0, a<0, b>0, b<0

为了达到条件覆盖的目的,我们设计的用例需要在 a 点有:

a>0, a≤0, b>0, b≤0,

这些情况出现,并且在 c 点有:

a<0, a≥0, b<0, b≥0

这些情况出现。现在可以设计如下用例:

TestCase1: a=1, b=1    (路径:ab)

TestCase1: a=-1, b=-1    (路径:acd)

TestCase1: a=-1, b=0    (路径:ace)

TestCase1: a=1, b=-1    (路径:ace)

通常而言条件覆盖比判定覆盖强,因为条件覆盖使得判定中的每一个条件都取到了不同的结果,这一点判定覆盖则无法保证。但条件覆盖也有缺陷,因为它只能保证每个条件都取到了不同结果,但没有考虑到判定结果,因此有时候条件覆盖并不能保证判定覆盖。

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

判定条件覆盖,说白了就是我们设计的测试用例可以使得判断中每个条件所有的可能取值至少执行一次(条件覆盖),同时每个判断本身所有的结果也要至少执行一次(判定覆盖)。不难发现判定条件覆盖同时满足判定覆盖和条件覆盖,弥补了两者各自的不足,但是判定条件覆盖并未考虑条件的组合情况。

五、组合覆盖(Branch Condition Combination Coverage)

组合覆盖也叫做条件组合覆盖。意思是说我们设计的测试用例应该使得每个判定中的各个条件的各种可能组合都至少出现一次。显然,满足条件组合覆盖的测试用例一定是满足判定覆盖、条件覆盖和判定条件覆盖的。

针对前文提到的流程图,做条件组合覆盖时我们可以设计如下用例:

TestCase1: a=1, b=1    (路径:ab)

TestCase1: a=-1, b=-1    (路径:acd)

TestCase1: a=-1, b=0    (路径:ace)

TestCase1: a=1, b=-1    (路径:ace)

条件组合覆盖能够同时满足判定、条件和判定条件覆盖,覆盖度较高,但是组合覆盖的测试用例数量相对来说也是比较多的。

六、路径覆盖

路径覆盖,意思是说我们设计的测试用例可以覆盖程序中所有可能的执行路径。这种覆盖方法可以对程序进行彻底的测试用例覆盖,比前面讲的五种方法覆盖度都要高。那么这种方法是不是就一定最好呢?当然不能讲得这么绝对,它的缺点也是显而易见的:由于需要对所有可能的路径全部进行覆盖,那么我们需要设计数量非常巨大的而且较为复杂的测试用例,用例数量将呈现指数级的增长。所以理论上来讲路径覆盖是最彻底的测试用例覆盖,但实际上很多时候路径覆盖的可操作性不强。

总结

以上简单描述了几种不用的逻辑覆盖方法的原则和优劣。在实际的操作中,要正确使用白盒测试的代码覆盖方法,就要从代码分析和代码调研入手,根据调研的结果,可以选择上述方法中的某一种,或者好几种方法的结合,设计出高效的测试用例,尽可能全面地覆盖到代码中的每一个逻辑路径。


http://chatgpt.dhexx.cn/article/5OWIe6xE.shtml

相关文章

白盒测试用例设计方法(语句覆盖、判定覆盖、条件覆盖)

六种覆盖标准发现错误的能力呈由弱到强的变化 语句覆盖&#xff1a;每条语句至少执行一次。 判定覆盖&#xff1a;每个判定的每个分支至少执行一次。 &#xff08;包含语句覆盖&#xff0c;每个判断T、F各一次&#xff09;条件覆盖&#xff1a;每个判定的每个条件应取到各种可…

语句覆盖(Statement coverage)

一、语句覆盖(Statement coverage) “语句覆盖”是一个比较弱的测试标准&#xff0c;它的含义是&#xff1a;选择足够的测试用例&#xff0c;使得程序中每个语句至少都能被执行一次。 图6.4是一个被测试的程序&#xff0c;它的源程序…

语句覆盖法

语句覆盖法 文章目录 语句覆盖法一、什么是语句覆盖二、要执行的语句代码三、设计测试用例&#xff0c;1.测试用例数据2.执行测试用例 四、 语句覆盖缺点 一、什么是语句覆盖 语句覆盖&#xff1a;就是设计若干个测试用例 &#xff0c;运行被测程序&#xff0c;使得每一可执行…

语句覆盖、条件覆盖、判定覆盖、条件-判定覆盖、路径覆盖

白盒测试的测试用例在大二学习软件工程的时候也是一个重点模块&#xff0c;但是上课没有太多时间做太多的测试用例&#xff0c;然后许久不用会搞乱&#xff0c;所以这里简单复盘一下。 白盒测试是结构测试&#xff0c;主要对代码的逻辑进行验证。 逻辑覆盖率&#xff1a;语句覆…

卷积码和维特比译码

卷积码 基本概念 卷积码常记为(n, k, N)&#xff1a; n n n为模2和相加器的个数 N N N为输入移位寄存器的段数&#xff08;称为约束长度&#xff09; k k k表示每段有 k k k级 编码效率为 R c k n R_c \frac{k}{n} Rc​nk​ 距离特性 纠错能力的度量&#xff1a;最大的最…

如何通俗地理解卷积?

从数学上讲&#xff0c;卷积就是一种运算。 某种运算&#xff0c;能被定义出来&#xff0c;至少有以下特征&#xff1a; 首先是抽象的、符号化的 其次&#xff0c;在生活、科研中&#xff0c;有着广泛的作用 比如加法&#xff1a; &#xff0c;是抽象的&#xff0c;本身只是…

【信道编码/Channel Coding】卷积码和Viterbi译码及其MATLAB实现

简介&#xff1a; 这是本专栏信道编码/Channel Coding的最后一站&#xff0c;想对信道编码有一个系统性的认识可以看本专栏的 信道编码的整体框架 一文。而在本篇文章中&#xff0c;将介绍卷积码的基本原理和Viterbi译码的过程&#xff0c;以及其MATLAB实现。为什么是最后一站呢…

不同卷积方法一览(+部分代码)

关键词 卷积方法&#xff1a;2D / 3D / 1x1 /转置/扩张&#xff08;Atrous&#xff09;/空间可分/深度可分/平展/分组/混洗分组/逐点分组卷积 卷积网络&#xff1a;全卷积FCN&#xff08;Fully Convolutional Network&#xff09;&#xff0c;可变形卷积&#xff08;Deformab…

卷积代码实现

卷积在pytorch中有两种方式&#xff0c;一种是torch.Conv2d(),一种是torch.nn.functional.conv2d&#xff08;&#xff09;&#xff0c;这两种形式本质都是使用一个卷积操作&#xff0c;下面举例来说明一下这两种卷积方式 import numpy as np import torch from torch import …

最通俗的语言讲解卷积码、码树图、状态图以及维特比译码

什么是卷积码&#xff1f; 卷积码是由伊利亚斯发明的一种非分组码&#xff0c;它更加倾向于纠错&#xff0c;对于实际的性能优于分组码&#xff0c;运算较为简单。 将卷积码记为(n,k,N),码率定义为k/n n是n个比特 k是k个信息位 N是N个信息段 卷积码编码器 组成&#xff1a…

卷积,卷积神经网络,图卷积神经网络中的“卷积”如何理解?

[] 1. 对卷积最朴素的理解 首先我们在教材上看到的卷积公式是 ∫ f ( τ ) g ( x − τ ) d τ \int f(\tau)g(x-\tau)d\tau ∫f(τ)g(x−τ)dτ。对于这个公式的理解&#xff0c;网上有很多讲解视频&#xff0c;都是用一些具体的例子来帮助我们理解卷积的过程。推荐b站上的视…

实现卷积的几种代码方式

目录 摘要 卷积&#xff08;convolution&#xff09; 1、pytorch实现 2、对input展开矩阵相乘 3、对kernel展开以及矩阵相乘 转置卷积 1、API实现 2、对kernel矩阵转置矩阵相乘 总结 摘要 卷积的基本元素有着input size、kernel size、stride、padding、group以及dil…

卷积卷积神经网络

文章目录 一、关于卷积&#xff08;convolution&#xff09;的直观感受二、卷积在不同领域的应用三、卷积神经网络&#xff08;CNN&#xff09;的诞生四、卷积神经网络&#xff08;CNN&#xff09;&#xff08;1&#xff09;为什么需要卷积层&#xff08;2&#xff09;池化&…

MATLAB (n,k,m)卷积码原理及仿真代码(你值得拥有)

卷积码原理介绍 1.基本概念 首先卷积码是一种纠错码&#xff0c;让我们先从大格局出发&#xff0c;去认识卷积码。如图1所示我是先从通信原理书上了解了卷积码的概念&#xff0c;再结合网上部分资料&#xff0c;勉强搞懂&#xff0c;感觉主要需要掌握卷积码编码器、状态图、网…

通信原理学习笔记4:信道编码、分组码、卷积码、现代信道编码(Turbo码、LDPC码、Polar码)

信道编码 / 前向纠错码FEC 思想是在数据中增加冗余信息&#xff0c;即校验码元 / 监督码元&#xff0c;从而检错、纠错 信道编码的优劣评判 首先&#xff0c;最基本的是要追求低差错率 实现纠错很简单&#xff0c;只要多添加冗余信息就好&#xff1b;但实际中&#xff0c;我…

韩信点兵算法:

韩信点兵问题&#xff1a;韩信点兵不足百人&#xff0c;3人一行排列多一人&#xff0c;7人一行排列少两人&#xff0c;5人一行正好&#xff0c; 输出韩信究竟点了多少兵。 使用 math 类的DivRem 方法进行运算。 static void Main(string[] args){///韩信点兵不足百人&#xff…

韩信点兵

韩信点兵&#xff1a; 韩信带1500名兵士打仗&#xff0c;战死四五百人&#xff0c;站3人一排&#xff0c;多出2人&#xff1b;站5人一排&#xff0c;多出4人&#xff1b;站7人一排&#xff0c;多出6人。韩信马上说出人数&#xff1a;1049。 代码实现&#xff1a; <span styl…

韩信点兵(python)

韩信点兵 全部士兵按每行8人站立&#xff0c;剩余7人 全部士兵按每行7人站立&#xff0c;剩余6人 问题&#xff1a;已知每一营士兵人数在1000~2000之间&#xff0c;如何利用循环判断表示出代码逻辑 for num in range (1000,2000):if num % 87 and num %76 and num%65\and num%5…

经典算法--韩信点兵

韩信点兵是一道古代的数学题&#xff0c;题意&#xff1a;韩信点兵不足百人&#xff0c;三人一排多1人&#xff0c;七人一排少2人&#xff0c;五人一排正好。问韩信带兵多少&#xff1f; /*** 韩信点兵&#xff1a;* 韩信带兵不足百人&#xff0c;3人一排多1人&#xff0c;7人一…

枚举算法:韩信点兵。

韩信点兵。韩信在点兵的时候&#xff0c;为了知道有多少名士兵&#xff0c;同时又能保住军事机密&#xff0c;便让士兵排队报数。 按从1至5报数&#xff0c;最末一个士兵报的数为1。 再按从1至6报数&#xff0c;最末一个士兵报的数为5。 再按1至7报数&#xff0c;最末一个士兵报…