目录
1.白盒测试
通过分析程序的内部逻辑来设计测试用例。
分类:逻辑覆盖法、基本路径分析法、
1.1逻辑覆盖法
包含:语句覆盖、判定覆盖、条件覆盖、判定/条件覆盖、组合覆盖、路径覆盖。
1.1.1语句覆盖法
设计足够多的测试用例,使程序中的每条语句至少被执行一次。
案例:
Int fun(int x,int y)
{
If((x>=80)&&(y>=80))
Else if ((x+y>=140)&&(x>=80||y>=80))
{x=x+10;}
Else {x=x-10;}
Return x;
}
1)先把代码转换成流程图
2)再设计用例
序号 | 输入数据 | 预期输出 | 覆盖语句 | 路径 |
1 | X=50,Y=50 | X=40 | X=X-10 | OBDE |
2 | X=90,Y=70 | X=100 | X=X+10 | OBCE |
优点:直观的从源代码得到测试用例,无需细分每条判定表达式。
缺点:仅仅针对程序逻辑中显式存在的语句,对隐式逻辑分支无法测试。
1.1.2判定覆盖法
设计足够多的测试用例,每个判定至少有一次为真,有一次为假。
案例同语句覆盖
1)流程图同语句覆盖
2)用例设计
Y1表示第一个判定式为真,N1表示第一个判定式为假。
序号 | 输入数据 | 预期输出 | 覆盖判定 | 路径 |
1 | X=90,Y=90 | X=90 | Y1 | OAE |
2 | X=50,Y=50 | X=40 | N1N2 | OBDE |
3 | X=90,Y=70 | X=100 | N1Y2 | OBCE |
优点:测试的路径近乎是语句覆盖的一倍,拥有比语句覆盖更强的测试能力。
缺点:判定条件由多个逻辑条件组合而成,会导致遗漏。
1.1.3条件覆盖
设计足够多的测试用例,使判定中的每个条件获得各种可能的结果。即每个条件至少一次为真值,有一次为假值。
案例语句覆盖
1)流程图语句覆盖
2)用例设计
T1表示第一个条件表达式取值为真,T2表示第一个条件表达式为假。
序号 | 输入数据 | 预期输出 | 条件取值 | 路径 |
1 | X=90,Y=70 | X=100 | T1F2T3T4 | OAE |
2 | X=40,Y=90 | X=30 | F1T2F3F4 | OBDE |
优点:增加了对符合判定情况的测试,增加了测试路径。
缺点:要达到条件覆盖需要足够多的测试用例,但条件覆盖不能保证判定覆盖。
1.1.4判定/条件覆盖
设计足够多的测试用例,使得判定中每个条件的所有可能结果至少出现一次,每个判定本身所有可能的结果也出现一次。
案例同语句覆盖
1)流程图同语句覆盖
2)用例设计
序号 | 输入数据 | 预期输出 | 判定取值 | 条件取值 | 路径 |
1 | X=90,Y=90 | X=90 | Y1 | T1T2 | OAE |
2 | X=50,Y=50 | X=40 | N1N2 | F1F2F3F4 | OBDE |
3 | X=90,Y=70 | X=100 | N1Y2 | T1F2T3T4 | OBCE |
优点:判定/条件覆盖弥补了单一的不足。
缺点:未考虑条件的组合情况,
1.1.5组合覆盖法
设计足够多的测试用例,使每个判定表中条件结果的所有可能组合至少出现一次。
案例同语句覆盖
1)流程图同语句覆盖
2)用例设计
序号 | 输入数据 | 预期输出 | 条件取值 | 路径 |
1 | X=90,Y=90 | X=90 | T1T2T3T4 | OAE |
2 | X=85,Y=85 | X=85 | T1T2T3F4 | OAE |
3 | X=?,Y=? | ? | T1T2F3T4 | OAE |
4 | X=?,Y=? | ? | T1T2F3F4 | OAE |
5 | X=90,Y=70 | X=100 | T1F2T3T4 | OBCE |
6 | X=80,Y=70 | X=70 | T1F2T3F4 | OBDE |
7 | X=90,Y=30 | X=80 | T1F2F3T4 | OBDE |
8 | X=85,Y=20 | X=75 | T1F2F3F4 | OBDE |
9 | X=70,Y=90 | X=80 | F1T2T3T4 | OBCE |
10 | X=60,Y=85 | X=50 | F1T2T3F4 | OBDE |
11 | X=30,Y=90 | X=20 | F1T2F3T4 | OBDE |
12 | X=20,Y=85 | X=10 | F1T2F3F4 | OBDE |
13 | X=?,Y=? | ? | F1F2T3T4 | OBCE |
14 | X=70,Y=70 | X=60 | F1F2T3F4 | OBDE |
15 | X=?,Y=? | ? | F1F2F3T4 | OBDE |
16 | X=50,Y=50 | X=40 | F1F2F3F4 | OBDE |
优点:满足了判定覆盖,条件覆盖,判定/条件覆盖的准则。
缺点:线性增加了测试用例的数量。
1.1.6路径覆盖
设计足够多的测试用例,覆盖程序中所有可能的路径。
案例同语句覆盖
1)流程图同语句覆盖
2)用例设计
序号 | 输入数据 | 预期输出 | 路径 |
1 | X=90,Y=90 | X=90 | OAE |
2 | X=50,Y=50 | X=40 | OBDE |
3 | X=90,Y=70 | X=100 | OBCE |
优点:比语句覆盖法、判定覆盖法、条件覆盖法、判定/条件覆盖法、组合覆盖法都要覆盖的广。
缺点:对所有路径进行测试(循环、条件、分支选择等),工作量指数级增长。
1.2基本路径分析法
基本路径法是在程序控制流图的基础上,通过分析控制构造的环路复杂性,导出基本可执行路径集合,从而设计测试用例的方法。
1.2.1步骤
- 程序的控制流图(简化的流程图)
- 程序圈复杂度
- 导出测试用例
- 准备测试用例
程序基本控制流图如下:
圆圈:控制流图的一个节点,表示一个或多个无分支的语句;
箭头:称为边或连接,代表控制流
区域:由边和节点封闭起来的范围,不要忘记区域外的部分。
案例:
1 void sort(int iRecordNum ,int iType)
2 {
3 int x=0;
4 int y=0;
5 while(iRecordNum>0)
6 {
7 if(0==iType)
8 {x=y+2;break;}
9 else
10 if(1==iType)
11 x=y+10;
12 else
13 x=y+20
14 iRecordNum--;
15 }
16 }
1)画图:流程图原始→流程图简化→控制流程图
圈复杂度V(G)=E-N+2或者V(G)=P+1
E:边数、N:节点、P:判定点
2)计算:所以:本题的圈复杂度是:V(G)=10-8+2=4或者V(G)=3+1=4
3)导出测试用例 V(G)的值表示该程序的独立路径。
路径1:5-16
路径2:5-7-8-16
路径3:5-7-10-11-14-16
路径4:5-7-10-13-14-5-16
4)准备测试用例(输出x)
用例设计 | |
路径1: | 5-16 |
输入数据: | iRecordNum=0,或<0的某一个值 |
预期结果: | X=0 |
路径2: | 5-7-8-16 |
输入数据: | iRecordNum=1,iiType=0 |
预期结果: | X=2 |
路径3: | 5-7-10-11-14-16 |
输入数据: | iRecordNum=1,iiType=1 |
预期结果: | X=10 |
路径4: | 5-7-10-13-14-5-16 |
输入数据: | iRecordNum=1,iiType=2 |
预期结果: | X=20 |