错误隐藏在角落里、集聚在边界处 ----Boris Beizer
白盒测试是看源代码的,静态分析和动态分析
11.2 控制流测试
程序结构主要有3种 顺序结构、分支结构、循环结构
#include "stdafx.h"
#include <iostream>
using namespace std;
int main(int argc,char* argv[])
{
double a,b,x;
cin>>a>>b>>x;
if((a>1)&&(b==0))
x=x/a;
if((a==2)||(x>1))
x=x+1;
cout<<x;
return 0;
}
11.2.1 语句覆盖
就是将程序的每个分支都走一遍
就比如上面的代码,case1:(A=2,B=0,X=2)就可以做到语句覆盖
判断覆盖
类似于
两个条件,两个都满足,一个满足 就完成了判断覆盖
Case1: (A=2,B=0,X=3)
Case2: (A=1,B=0,X=1)
当然,还有另外的选择
case4:(A=3,B=0,X=3)
Case5: (A=2,B=1,X=1)
条件覆盖
第一个条件a>1 有四种情况,就是a>1为真的,或者a>1为假的,b=0为真的,b=0为假的。
同理,第二个条件,也是有四种情况
自然条件覆盖用例也可以为:
- a>1, b=0, x任意 比如说 a=2, b=0,x=0
- a<=1, b=0, x任意 比如说 a=1,b=0,x=1
- a>1, b!=0, x任意 比如说 a=3,b=1,x=9
- a<=1, b!=0, x任意 等等
- a=2, b任意, x<=1
- a!=2, b任意, x<=1
- a=2, b任意, x>1
- a!=2, b任意, x>1
其中第1、2、3、4个用例覆盖了if语句中的所有条件分支,第5、6、7、8个用例覆盖了第二个if语句中的所有条件分支。
判定-条件覆盖
根据给出的代码,我们可以列出以下判定条件:
- a>1 且 b==0
- a==2 或 x>1
那么我们可以列出以下四个用例:
- a=2, b=0, x=0
- a=0, b=0, x=0
- a=2, b=0, x=2
- a=1, b=1, x=1
对于第一个用例,判定条件1不成立,判定条件2成立,输出x+1=1。 对于第二个用例,判定条件1不成立,判定条件2不成立,不执行任何操作,输出x=0。 对于第三个用例,判定条件1成立,判定条件2成立,执行x=x+1=3操作,输出x=3。 对于第四个用例,判定条件1不成立,判定条件2不成立,不执行任何操作,输出x=1。
因此,四个用例分别覆盖了两个判定条件的所有情况。
路径覆盖
接下来就是设计测试用例:
SABCDE
SACDE
SACE
SABCE
如果我不解释上面的图,你们肯定会认为,我给出的用例是有问题的。
它这个图的解释是,只要到了B,就说明第一个条件是对的,同理只要到了D,第二个条件就是对的,反过来,没有到就是没有B,就是第一个条件是错的。
总之,我个人认为书上这个图是很s “b”的
可以看出四条路径,再按照这四条路径出用例就是了
a=2,b=0,x=2 SABCDE
a=1,b=9,x=3 SACDE
a=3,b=0,x=0 SABCE
a=-1,b=9,x=-1 SACE
程序的控制流图
控制流图就长右边这样
假设程序为这个:
1、if a or b
2、x
3、else
4、y
有时候,过程两个东西会放在一起,只要没有分支就行了,就比如说上上的图的2,3放在一起,等等