白盒测试中常见的覆盖有六种,岁月覆盖我们

冰霜覆盖大地

文章转自:

一、覆盖率的概念

谈谈白盒测试中的几种覆盖方法  
白盒测试用例设计的一个很重要的评估标准就是对代码的覆盖度。一说到覆盖,大家都感觉非常熟悉,但是常见的覆盖都有哪些?各自有什么优缺点?在白盒测试的用例设计中我们应该如何自如地运用呢?
白盒测试中常见的覆盖有六种:语句覆盖、判定覆盖、条件覆盖、判定/条件覆盖、组合覆盖和路径覆盖。下面我们就分别看看这几种不同的覆盖究竟是什么鬼。

大家都熟知软件測试的方法分为黑盒測试和白盒測试,当中的黑盒測试是功能測试比較简单这里就不再赘述。以下主要区分白盒測试中的几种比較easy弄混的測试方法。

岁月覆盖我们

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

覆盖率是用来度量测试完整性的一个手段,现在有越来越多的测试工具能够支持覆盖率测试,但是它们本身并不包含测试技术,只是测试技术有效性的一个度量。白盒测试中经常用到的覆盖率是逻辑覆盖率。

一、语句覆盖(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),也就是说设计的测试用例要保证让被测试程序中的每一个分支都至少执行一次。举个例子,有如下流程图:

图片 1

  针对该图我们想要做到判定覆盖,可以设计如下case:  TestCase1: a=1,
b=1 (路径:ab)  TestCase2: a=-1, b=-1 (路径:acd)  TestCase3: a=2,
b=-1
(路径:ace)  判定覆盖比语句覆盖强一些,能发现一些语句覆盖无法发现的问题。但是往往一些判定条件都是由多个逻辑条件组合而成的,进行分支判断时相当于对整个组合的最终结果进行判断,这样就会忽略每个条件的取值情况,导致遗漏部分测试路径。

仅仅要搞清楚本质,事实上这几种的測试方法就没那么难了。

多少难挨

一、语句覆盖(Statement Coverage)

覆盖率对于软件测试有着非常重要的作用,通过覆盖率我们可以知道我们的测试是否充分,我们测试的弱点在哪些方面,进而指导我们设计能够增加覆盖率的测试用例,有效的提高测试质量。

三、条件覆盖(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)

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

图片 2图片 3

如春日柳絮

public int foo(int a,int b)

三、逻辑覆盖率主要有以下六种:

五、组合覆盖(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)  条件组合覆盖能够同时满足判定、条件和判定条件覆盖,覆盖度较高,但是组合覆盖的测试用例数量相对来说也是比较多的。

这张图有两个推断语句分支形成4条路径。分析各种覆盖所能覆盖的路径条数。

夏日蔷薇

{

(1)语句覆盖;

六、路径覆盖

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

语句覆盖:每一条语句
都要运行一遍比如:ace路径运行的语句就可以满足条件。

日复一日

return a/b;

(2)判定覆盖;

总结

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

@晴-2016-11-03 10:53:55

判定覆盖:图片 4图片 5 这个判定的T和F都要运行一遍图片 6图片 7也要真假都运行一遍比如:沿着路径ace和abd两条路径运行则满足条件

年复一年

}

(3)条件覆盖;

条件覆盖:这个要比判定覆盖的粒度更小一些,前者的粒度是判定中各种条件,比如针对这个判定图片 8的全部条件有A>1。A<=1,。B=0、B≠0以下的判定相同有四个条件。

我多么期盼

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

(4)判定条件覆盖;

图片 9图片 10

相关文章