语句覆盖
“语句覆盖”是一个比较弱的测试标准,它的含义是:选择足够的测试用例,使得程序中
每个语句
至少
都能被
执行一次
。
程序中的每个语句指:
- 表达式语句:比如x=y+2;
- 控制语句: if 和switch
- 函数调用语句:比如c语言里面的printf() 或者java 里面的System.out.println()
-
以上三种语句的联合:
如
if(true)
{
x+y=2;
printf("yyds");
}
假设有程序如下。
//两个顺序执行的判断
IF(A>1 && B==0)
{
X=X/A;
}
IF(A==2||X>1)
{
X=X+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) ....;
满足原子谓词覆盖的测试用例:
分支-谓词覆盖(判定条件覆盖或分支条件覆盖)
在原子谓词的基础上, 每个复合谓词也要获得至少一次真和一次假。
它包括了语句覆盖,分支覆盖和原子谓词覆盖。
还是上面的例子
if(i==j&&i==k&&j==k) ..;
else if(i==j||i==k||j==k) ....;
满足分支-谓词覆盖的测试用例:
复合谓词覆盖(条件组合覆盖)
每个谓词中条件的各种可能都至少出现一次。
如果是上面分支-谓词覆盖里面的例子,上述的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
文章部分参考:《软件测试教程 第二版》 宫云战
路径覆盖
包含了分支覆盖,但与谓词覆盖无关。要求走完所有的路径。如下图,设计测试用力时,有四条路径,需要走完这四条路径。
包含关系
分支覆盖包含语句覆盖。
路径覆盖包含分支覆盖,与谓词覆盖无关
分支-谓词覆盖包含语句覆盖,分支覆盖,原子谓词覆盖。
复合谓词覆盖包含语句覆盖,分支覆盖,原子谓词覆盖,分支-谓词覆盖