白盒测试即结构测试或逻辑驱动测试,白盒测试主要用来检测产品内部动作是否按照设计说明书的规定进行,检验程序中的每条道路是否都能按规定要求工作。白盒测试框架就是一套完整的,实现良好的,稳定的测试功能库集合。白盒测试具备测试用例及测试集的定义管理功能,且具备完备的断言系统。
一、白盒测试
这一方法是把测试对象看作一个打开的盒子,测试人员依据程序内部逻辑结构相关信息,设计或选择测试用例,对程序所有逻辑路径进行测试,通过在不同点检查程序的状态,确定实际的状态是否与预期的状态一致。
一、概述
白盒测试又称结构测试、透明盒测试、逻辑驱动测试或基于代码的测试。白盒测试是一种测试用例的设计方法,盒子对应的是被测试的测试,"白盒"法全面了解程序内部逻辑结构、对所有逻辑路径进行测试。"白盒"法是穷举路径测试。测试者必须检查程序的内部结构,从检查程序的逻辑着手,得出测试数据;白盒测试主要用来检测。
二、基本方法
强度由低到高:语句覆盖、判定覆盖、条件覆盖、判定条件覆盖、条件组合覆盖、路径覆盖。
(1)语句覆盖:就是设计若干个测试用例,运行被测程序,使得每一可执行语句至少执行一次。
(2)判定覆盖:使设计的测试用例保证程序中每个判断的每个取值分支至少经历一次。
(3)条件覆盖:条件覆盖是指选择足够的测试用例,使得运行这些测试用例时,判定中每个条件的所有可能结果至少出现一次,但未必能覆盖全部分支
(4)判定条件覆盖:判定-条件覆盖就是设计足够的测试用例,使得判断中每个条件的所有可能取值至少执行一次,同时每个判断的所有可能判断结果至少执行,即要求各个判断的所有可能的条件取值组合至少执行一次。
(5)条件组合覆盖:在白盒测试法中,选择足够的测试用例,使所有判定中各条件判断结果的所有组合至少出现一次,满足这种覆盖标准成为条件组合覆盖。
(6)路径覆盖:是每条可能执行到的路径至少执行一次。
补充:(1)语句覆盖在所有的测试方法中是一种最弱的覆盖。
(2)判定覆盖和条件覆盖比语句覆盖强,满足判定/条件覆盖标准的测试用例一定也满足判定覆盖、条件覆盖和语句覆盖(3)路径覆盖也是一种比较强的覆盖,但未必考虑判定条件结果的组合,并不能代替条件覆盖和条件组合覆盖。
三、优缺点
1. 优点
a.迫使测试人员去仔细思考软件的实现
b.可以检测代码中的每条分支和路径
c.揭示隐藏在代码中的错误
d.对代码的测试比较彻底
e.最优化
2. 缺点
a.代价昂贵
b.无法检测代码中遗漏的路径和数据敏感性错误
c.不验证规格的正确性
四、白盒测试中设计到圈复杂度的计算
首先要画出控制流图(这里不再加以说明)
圈复杂度计算公式为:V(G)=e-n+2。其中,e表示控制流图中边的数量,n表示控制流图中节点的数量。
此外圈复杂度的计算还有更直观的方法,因为圈复杂度所反映的是“判定条件”的数量,所以圈复杂度实际上就是等于判定节点的数量再加上1,也即控制流图的区域数,
此外对应与控制流图区域数还有一个圈复杂度计算公式:V(G)=区域数=判定节点数+1。其中判定节点是控制流图中出现的判断条件。
下面附上一个实例,实例并不是很好,但是很全,由于包含细节较多,如有错误,还望见谅。
被测程序:寻找最大数程序:max.numbers
程序操作说明:从键盘输入3个整数(间隔为空格),找出并输出其中数值最大的那一个。如果其中有一个以上的最大数(相等的情况),也要表示出来。
#include
1 void main()
2 {
3 int i,a,b,c;
4 i = 0;
5 while(i<100) {
6 printf("Enter numbers: ");
7 scanf("%d %d%d",&a,&b,&c);
8 if(a>b)
9 {
10 if(a>c)
11 printf("max. a=%d\n",a);
12 else if(a==c)
13 printf("max. a=c=%d\n",c);
14 else
15 printf("max.c=%d\n",c);
16 }
17 else{
18 if(a==b)
19 {
20 if(a>c)
21 printf("max.a=b=%d\n",a);
22 else
23 if(a==c)
24 printf("max.a=b=c=%d\n",c);
25 else
26 printf("max.c=%d\n",c);
27 }
28 else{
29 if(b>c)
30 printf("max.b=%d\n",b);
31 else
32 if(b==c)
33 printf("max. b=c=%d\n",b);
34 else
35 printf("max. c=%d\n",c);
36 }
37 }
38 i++;
39 }
40 }
实验要求:依据语句覆盖、判断覆盖、条件覆盖、判断/条件覆盖、条件组合覆盖、基本路径测试分别给出测试用例。基本路径测试要求画出程序流图、控制流图、计算圈复杂度、给出路径并导出测试用例。
整个程序对应的流程图如下和控制流图对应如下:
(1) 语句覆盖
由控制流图可知:测试用例需要9组
a. a=3,b=2,c=1
路径经过为:1,3,4,5,6,7,8,10,11,16.38,39
b. a=2,b=1,c=2
路径经过为:1,3,4,5,6,7,8,10,12,13,16.38,39
c. a=2,b=1,c=3
路径经过为:1,3,4,5,6,7,8,10,12,15,16.38,39
d. a=2,b=2,c=1
路径经过为:1,3,4,5,6,7,8,18,20,21,27.38,39
e. a=b=c=2
路径经过为:1,3,4,5,6,7,8,18,20,23,24,27,38,39
f. a=2,b=2,c=3
路径经过为:1,3,4,5,6,7,8,18,20,23,26,27,38,39
g. a=1,b=3,c=2
路径经过为:1,3,4,5,6,7,8,18,29,30,37, 38,39
h. a=1,b=2,c=2
路径经过为:1,3,4,5,6,7,8,18,29,32,33,37, 38,39
i. a=1,b=2,c=3
路径经过为:1,3,4,5,6,7,8,18,29,32,35,37, 38,39
(2) 判断覆盖
由控制流图可知:测试用例需要9组
a. a=3,b=2,c=1
路径经过为:1,3,4,5,6,7,8,10,11,16.38,39
b. a=2,b=1,c=2
路径经过为:1,3,4,5,6,7,8,10,12,13,16.38,39
c. a=2,b=1,c=3
路径经过为:1,3,4,5,6,7,8,10,12,15,16.38,39
d. a=2,b=2,c=1
路径经过为:1,3,4,5,6,7,8,18,20,21,27.38,39
e. a=b=c=2
路径经过为:1,3,4,5,6,7,8,18,20,23,24,27,38,39
f. a=2,b=2,c=3
路径经过为:1,3,4,5,6,7,8,18,20,23,26,27,38,39
g. a=1,b=3,c=2
路径经过为:1,3,4,5,6,7,8,18,29,30,37, 38,39
h. a=1,b=2,c=2
路径经过为:1,3,4,5,6,7,8,18,29,32,33,37, 38,39
i. a=1,b=2,c=3
路径经过为:1,3,4,5,6,7,8,18,29,32,35,37, 38,39
(3) 条件覆盖
整个测试所覆盖的条件:
1.a>b 真为T1,假为F1
2.a>c 真为T2,假为F2
3.a=c 真为T3,假为F3
4.a=b 真为T4,假为F4
5.b>c 真为T5,假为F5
6.b=c 真为T6,假为F6
测试用例 |
覆盖条件 |
具体条件取值 |
a=3,b=2,c=1 |
T1,T2 |
a>b,a>c |
a=2,b=1,c=2 |
T1, F2,T3 |
a>b ,a=c |
a=2,b=1,c=3 |
T1,F2,F3 |
a>b,a<=c, |
a=2,b=2,c=1 |
F1,T4,T2 |
a=b,a>c |
a=b=c=2 |
F1,T4,F2,T3 |
a=b=c |
a=2,b=2,c=3 |
F1,T4,F2,F3 |
a=b,a<c |
a=1,b=3,c=2 |
F1,F4,T5 |
a<b,b>c |
a=1,b=2,c=2 |
F1,F4,F5,T6 |
a<b,b=c |
a=1,b=2,c=3 |
F1,F4,F5,F6 |
a<b,b<c |
(4) 判断/条件覆盖
a. a=3,b=2,c=1
覆盖路径经过为:1,3,4,5,6,7,8,10,11,16.38,39
覆盖条件:T1,T2
b. a=2,b=1,c=2
路径经过为:1,3,4,5,6,7,8,10,12,13,16.38,39
覆盖条件:T1, F2,T3
c. a=2,b=1,c=3
路径经过为:1,3,4,5,6,7,8,10,12,15,16.38,39
覆盖条件:T1,F2,F3
d . a=2,b=2,c=1
路径经过为:1,3,4,5,6,7,8,18,20,21,27.38,39
覆盖条件:F1,T4,T2
e. a=b=c=2
路径经过为:1,3,4,5,6,7,8,18,20,23,24,27,38,39
覆盖条件:F1,T4,F2,T3
f. a=2,b=2,c=3
路径经过为:1,3,4,5,6,7,8,18,20,23,26,27,38,39
覆盖条件:F1,T4,F2,F3
g. a=1,b=3,c=2
路径经过为:1,3,4,5,6,7,8,18,29,30,37, 38,39
覆盖条件:F1,F4,T5
h. a=1,b=2,c=2
路径经过为:1,3,4,5,6,7,8,18,29,32,33,37, 38,39
覆盖条件:F1,F4,F5,T6
i. a=1,b=2,c=3
路径经过为:1,3,4,5,6,7,8,18,29,32,35,37, 38,39
覆盖条件:F1,F4,F5,F6
(5) 条件组合覆盖
所有可能的条件组合:
编号 |
覆盖条件 |
判定条件 |
具体条件 |
1 |
T1,T2 |
8取Y,10取Y |
a>b,a>c |
2 |
T1, F2, |
8取Y,10取N, |
a>b,a<=c |
3 |
F2,T3 |
10取N,12取Y |
a=c |
4 |
F2,F3 |
10取N,12取N |
a<c |
5 |
F1,T4 |
8取N,18取Y |
a=b |
6 |
F1,F4 |
8取N,18取N |
a<b |
7 |
T4,T2 |
18取Y,20取Y |
a=b,a>c |
8 |
T4,F2 |
18取Y,20取N |
a=b,a<=c |
9 |
F2,T3 |
20取N,23取Y |
a=c |
10 |
F2,F3 |
20取N,23取N |
a<c, |
11 |
F4,T5 |
18取N,29取Y |
a<b,b>c |
12 |
F4,F5 |
18取N,29取N |
a<b,b<=c |
13 |
F5,T6 |
29取N,32取Y |
b<=c,b==c |
14 |
F5,F6 |
29取N,32取N |
b<c |
1.a>b 真为T1,假为F1
2.a>c 真为T2,假为F2
3.a=c 真为T3,假为F3
4.a=b 真为T4,假为F4
5.b>c 真为T5,假为F5
6.b=c 真为T6,假为F6
测试用例:
测试用例 |
覆盖条件 |
覆盖组合 |
具体条件取值 |
a=3,b=2,c=1 |
T1,T2 |
1 |
a>b,a>c |
a=2,b=1,c=2 |
T1, F2,T3 |
2,3 |
a>b ,a=c |
a=2,b=1,c=3 |
T1,F2,F3 |
2,4 |
a>b,a<=c, |
a=2,b=2,c=1 |
F1,T4,T2 |
5,7 |
a=b,a>c |
a=b=c=2 |
F1,T4,F2,T3 |
5,8,3 |
a=b=c |
a=2,b=2,c=3 |
F1,T4,F2,F3 |
5,8,4 |
a=b,a<c |
a=1,b=3,c=2 |
F1,F4,T5 |
6,11 |
a<b,b>c |
a=1,b=2,c=2 |
F1,F4,F5,T6 |
6,12,13 |
a<b,b=c |
a=1,b=2,c=3 |
F1,F4,F5,F6 |
6,12,14 |
a<b,b<c |
(7)基本路径测
a. a=3,b=2,c=1
路径经过为:1,3,4,5,6,7,8,10,11,16.38,39
b. a=2,b=1,c=2
路径经过为:1,3,4,5,6,7,8,10,12,13,16.38,39
c. a=2,b=1,c=3
路径经过为:1,3,4,5,6,7,8,10,12,15,16.38,39
d. a=2,b=2,c=1
路径经过为:1,3,4,5,6,7,8,18,20,21,27.38,39
e. a=b=c=2
路径经过为:1,3,4,5,6,7,8,18,20,23,24,27,38,39
f. a=2,b=2,c=3
路径经过为:1,3,4,5,6,7,8,18,20,23,26,27,38,39
g. a=1,b=3,c=2
路径经过为:1,3,4,5,6,7,8,18,29,30,37, 38,39
h. a=1,b=2,c=2
路径经过为:1,3,4,5,6,7,8,18,29,32,33,37, 38,39
i. a=1,b=2,c=3
路径经过为:1,3,4,5,6,7,8,18,29,32,35,37, 38,39
每个测试用例对应的路径:
路径1: 1-3-4-5-6-7-8-10-11-16-38-39
路径2: 1-3-4-5-6-7-8-10-12-13-16-38-39
路径3: 1-3-4-5-6-7-8-10-12-15-16-38-39
路径4: 1-3-4-5-6-7-8-18-20-21-27-37-38-39
路径5: 1-3-4-5-6-7-8-18-20-23-24-27-37-38-39
路径6:1-3-4-5-6-7-8-18-20-23-26-27-37-38-39
路径7: 1-3-4-5-6-7-8-18-29-30-36-37-38-39
路径8:1-3-4-5-6-7-8-18-29-32-33-36-37-38-39
路径9:1-3-4-5-6-7-8-18-29-32-35-36-37-38-39
圈复杂度V(G)=判断节点数+1=9+1=10