语句覆盖、分支覆盖、谓词测试和路径覆盖

目录

  • 语句覆盖
  • 分支覆盖(判定覆盖)
  • 谓词测试
    • 原子谓词覆盖(条件覆盖)
    • 分支-谓词覆盖(判定条件覆盖或分支条件覆盖)
    • 复合谓词覆盖(条件组合覆盖)
  • 路径覆盖
  • 包含关系

语句覆盖

“语句覆盖”是一个比较弱的测试标准,它的含义是:选择足够的测试用例,使得程序中每个语句至少都能被执行一次

程序中的每个语句指:

  1. 表达式语句:比如x=y+2;
  2. 控制语句: if 和switch
  3. 函数调用语句:比如c语言里面的printf() 或者java 里面的System.out.println()
  4. 以上三种语句的联合:
	if(true)
	{
		x+y=2;
		printf("yyds");
	}

假设有程序如下。

//两个顺序执行的判断
IF(A>1 && B==0)
{
	X=X/A;
}
IF(A==2||X>1)
{

	X=X+1; 
}

根据上面的知识,它是有四条语句的。画出它的流程图
语句覆盖、分支覆盖、谓词测试和路径覆盖_第1张图片

要想达到语句覆盖,只需要每个语句至少执行一次即可,为了简单,就每条语句执行一次即可。
如果两个IF判断都能执行,最终这四个语句均可执行一次。
否则多设计几个样例,使得全部语句都能执行一次就行。

分支覆盖(判定覆盖)

分支覆盖,又称判定覆盖,是指使得程序中每个判断取真分支和取假分支至少经历一次,即判断的真假均曾被满足。

if(a>0){
	.......
}

设计用例,只需两个即可:比如a=5和a=-1,使得这个判断的真假都能执行一次。


if(a>0){.......}
else if(b>0){.....}

测试用例需要3个:
如a=1(true),b未进入
a=-1(false),b=1(true)
a=-1(false),b=-1(false)

谓词测试

形如 a>0 , a>0&&b<0 这样的为谓词,也就是判定。
而a>0叫做原子谓词。原子谓词通过与或非构成复合谓词,如a<0&&b>0.
分支覆盖对于复合谓词不是有效的。所以提出了谓词测试。

原子谓词覆盖(条件覆盖)

每个复合谓词包含的每个原词谓词至少获得一次真和一次假。

if(i==j&&i==k&&j==k) ..;
else if(i==j||i==k||j==k) ....;

满足原子谓词覆盖的测试用例:

语句覆盖、分支覆盖、谓词测试和路径覆盖_第2张图片

分支-谓词覆盖(判定条件覆盖或分支条件覆盖)

在原子谓词的基础上, 每个复合谓词也要获得至少一次真和一次假。
它包括了语句覆盖,分支覆盖和原子谓词覆盖。
还是上面的例子

if(i==j&&i==k&&j==k) ..;
else if(i==j||i==k||j==k) ....;

满足分支-谓词覆盖的测试用例:
语句覆盖、分支覆盖、谓词测试和路径覆盖_第3张图片

复合谓词覆盖(条件组合覆盖)

每个谓词中条件的各种可能都至少出现一次。
如果是上面分支-谓词覆盖里面的例子,上述的5个测试用例满足。
再看一个。

if ((A > 1)&&( B == 0))
{
   X  = X / A;
}
if ((A == 2) || ( X > 1))
{
   X = X + 1;
}

需要设计8个测试用例,
如第一个if里面,两个原子谓词的排列是4个
(1)A>1, B=0

(2)A>1, B!=0

(3)A≤1, B=0

(4)A≤1, B≠0

文章部分参考:《软件测试教程 第二版》 宫云战

路径覆盖

包含了分支覆盖,但与谓词覆盖无关。要求走完所有的路径。如下图,设计测试用力时,有四条路径,需要走完这四条路径。
语句覆盖、分支覆盖、谓词测试和路径覆盖_第4张图片

包含关系

分支覆盖包含语句覆盖。
路径覆盖包含分支覆盖,与谓词覆盖无关
分支-谓词覆盖包含语句覆盖,分支覆盖,原子谓词覆盖。
复合谓词覆盖包含语句覆盖,分支覆盖,原子谓词覆盖,分支-谓词覆盖

你可能感兴趣的:(随笔,软件测试)