一、实验目的

通过实验,能够掌握利用白盒测试方法对软件程序进行功能测试,能熟练应用语句覆盖、判定覆盖、条件覆盖、判定-条件覆盖、条件组合覆盖法设计测试用例。

二、实验环境

Windows环境,Word相关的办公软件,Java编程环境或C++编程环境。

三、实验原理

白盒测试原理:已知软件的内部工作过程,可以通过测试证明每种内部操作是否符合设计规格要求,所有内部流程是否已经过检查。它是把测试对象看作装在一个透明的白盒子里,也就是完全了解程序的结构和处理过程。这种方法按照程序内部的逻辑测试程序,检验程序中的每条通路是否都能按预定要求正确工作,其又称为结构测试。

1、语句覆盖

语句覆盖指代码中的所有语句都至少执行一遍,用于检查测试用例是否有遗漏,如果检查到没有执行到的语句时要补充测试用例。无须细分每条判定表达式,该测试虽然覆盖了可执行语句,但是不能检查判断逻辑是否有问题。

2、判定覆盖

又称判断覆盖、分支覆盖,指设计足够的测试用例,使得程序中每个判断的取真分支和取假分支至少经历一次,即判断真假取值均曾被满足。

判定覆盖比语句覆盖强,但是对程序逻辑的覆盖度仍然不高,比如由多个逻辑条件组合而成的判定,仅判定整体结果而忽略了每个条件的取值情况。

3、条件覆盖、条件判定覆盖

条件覆盖指程序中每个判断中的每个条件的所有可能的取值至少要执行一次,但是条件覆盖不能保证判定覆盖,条件覆盖只能保证每个条件至少有一次为真,而不考虑所有的判定结果。

条件判定覆盖是条件覆盖和判定覆盖的组合,指设计足够的测试用例,使得判定中每个条件的所有可能的取值至少出现一次,并且每个判定取到的各种可能的结果也至少出现一次。条件判定覆盖弥补了条件和判定覆盖的不足,但是未考虑条件的组合情况。

4、条件组合覆盖

又称多条件覆盖,设计足够的测试用例,使得判定条件中每一个条件的可能组合至少出现一次。线性地增加了测试用例的数量。

5、基本路径法

在程序控制流图的基础上,通过分析控制构造的环路复杂性,导出基本可执行的路径集合,从而设计测试用例的方法。在基本路径测试中,设计出的测试用例要保证在测试中程序的每条可执行语句至少执行一次,在基本路径法中,需要使用程序的控制流图进行可视化表达。

四、实验内容

针对给出的程序代码,运用主要的白盒测试方法:语句覆盖、判定覆盖、条件覆盖、判定-条件覆盖、条件组合覆盖法设计测试用例。

程序代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
plaintext
#include<iostream>

using namespace std;//此句也可以在main函数体中出现。

int fun(int x, int y)

{

1) int t= 0;

2) if (x>=80 && y>=80)

{

3) t=1;

}

4) else if (x + y >= 140 && (x >= 90 || y >= 90))

{

5) t = 2;

}

6) else

{

7) t = 3;

}



8) return t;

}



int main()

{

int x, y;

cout << "---------------" << '\n';

cout << "请输入 x:";

cin >> x;

cout << "请输入 y:";

cin >> y;

cout << "magic 已知:0" << endl;

cout << "---------------" << '\n';

cout << "测试结果分别是:" << '\n';

cout << "---------------" << '\n';

cout << "x的值 y的值 t的值" << endl;

cout << "------------------------------" << '\n';

cout << x << " " << y << " " << fun(x, y) << endl;

getchar();

getchar();

return 0;

}

函数fun()的流程图:、

clip_image002.png

五、实验步骤

1、对程序代码进行编号;

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
plaintext
2、int t= 0;

3、if (x>=80 && y>=80)

{

4、t=1;

}

5、else if (x + y >= 140 && (x >= 90 || y >= 90))

{

6、t = 2;

}

7、else

{

8、t = 3;

}



9、return t;

}

10、画出该程序的控制流图如下图所示;

img

程序控制流图

11、采用语句覆盖、判定覆盖、条件覆盖、判定-条件覆盖、条件组合覆盖法设计测试用例。

12、执行语句覆盖、判定覆盖、条件覆盖、判定-条件覆盖、条件组合覆盖法测试用例并截图。

六、实验结果

1、语句覆盖测试用例:

测试用例 X Y x>=80&&y>=80 x+y>=140&& (x>=90||y>=90) 执行路径
1 80,80 T F 1,2,3,8
2 1,1 F F 1,2,4,6,7,8
3 90,50 F T 1,2,4,5,8

(1) 语句覆盖测试用例1执行截图如下:

img

(2) 语句覆盖测试用例2执行截图如下:

img

(3)语句覆盖测试用例3执行截图如下:

img

2、判定覆盖测试用例:

测试用例 X Y x>=80&&y>=80 x+y>=140&&(x>=90||y>=90) 执行路径
1 80,80 T F 1,2,3,8
2 90,50 F T 1,2,4,5,8

(1)判定覆盖测试用例1执行截图如下:

img

(2)判定覆盖测试用例2执行截图如下:

img

3、条件覆盖测试用例:

第一个判定( x>=80&&y>=80)各种条件取值的情况:

x>=80为true, 记为T1;

x<80为false, 记为F1;

y>=80为true, 记为T2;

Y<80为false, 记为F2;

第二个判定(x + y >= 140 && (x >= 90 || y >= 90))各种条件取值的情况:

x+y>=140为true, 记为T3;

x+y<140为false, 记为F3;

x>=90为true,为true, 记为T4;

x<90为true,为false, 记为F4;

y>=90为true,为true, 记为T5;

y<90为true,为false, 记为F5;

测试用例 X Y x>=80&&y>=80 x+y>=140&& (x>=90||y>=90) 条件覆盖 执行路径
1 90,50 F T T1,F2,T3,T4,F5 1,2,3,8
2 1,90 F F F1,T2,F3,F4,T5 1,2,4,6,7,8

(1)条件覆盖测试用例1执行截图如下:

img

(2)条件覆盖测试用例2执行截图如下:

img

4、判定-条件覆盖测试用例:

测试用例 X Y x>=80&&y>=80 x+y>=140&& (x>=90||y>=90) 条件覆盖 执行路径
1 90,50 F T T1,F2,T3,T4,F5 1,2,3,8
2 1,90 F F F1,T2,F3,F4,T5 1,2,4,6,7,8
1 80,80 T F T1,T2,T3,F4,F5 1,2,3,8

(1)条件覆盖测试用例1执行截图如下:

img

(2)条件覆盖测试用例2执行截图如下:

clip_image020.jpg

(3)条件覆盖测试用例3执行截图如下:

clip_image022.jpg

5、条件组合测试用例:

列出各个判定内的条件完全组合

第一个判定 x>=80&&y>=80两个条件(1,2)组合如下:

(1) x>=80, y>=80, 记为(T1,T2)T

(2) x>=80, y<80, 记为(T1,F2)

(3) x<80,y>=80, 记为(F1,T2)

(4) x<80,y<80, 记为(F1,F2)

第二个判定的三个条件(3,4,5)组合如下:

(5) x+y>=140, x>=90, y>=90 记为(T3,T4,T5)T

(6) x+y>=140, x>=90, y<90 记为(T3,T4,F5)T

(7) x+y>=140, x<90, y>=90 记为(T3,F4,T5)T

(8) x+y>=140, x<90, y<90 记为(T3,F4,F5)

(9) x+y<140, x>=90, y>=90 记为(F3,T4,T5) (此组合不可能)

(10) x+y<140, x>=90, y<90 记为(F3,T4,F5)

(11) x+y<140, x<90, y>=90 记为(F3,F4,T5)

(12) x+y<140, x<90, y<90 记为(F3,F4,F5)

测试用例 X Y x>=80&&y>=80 x+y>=140&&(x>=90||y>=90) 条件组合覆盖 执行路径
1 90,90 T T 1( T1,T2),5( T3,T4,T5) 1,2,3,8
2 90,50 F T 2( T1,F2),6( T3,T4,F5) 1,2,4,5,8
3 50,90 F T 3( F1,T2),7( T3,F4,T5) 1,2,4,5,8
4 70,70 F F 4( F1,F2),8( T3,F4,T5) 1,2,4,6,7,8
5 90,40 F F 2( T1,F2),10( F3,T4,F5) 1,2,4,6,7,8
6 40,90 F F 3( F1,T2),11( F3,F4,T5) 1,2,4,6,7,8
7 1,1 F F 4( F1,F2),12( F3,F4,F5) 1,2,4,6,7,8

(1)条件组合覆盖测试用例1执行截图如下:

clip_image024.jpg

(2)条件组合覆盖测试用例2执行截图如下:

clip_image026.jpg

(3)条件组合覆盖测试用例3执行截图如下:

clip_image028.jpg

(4)条件组合覆盖测试用例4执行截图如下:

clip_image030.jpg

(5)条件组合覆盖测试用例5执行截图如下:

clip_image032.jpg

(6)条件组合覆盖测试用例6执行截图如下:

clip_image034.jpg

(7)条件组合覆盖测试用例7执行截图如下:

clip_image036.jpg

6、独立(基本)路径测试用例:

1)求出McCabe圈复杂度

根据程序圈复杂度的计算公式,求程序路径集合中的基本路径数目。

3

2) 独立路径如下:

1,2,3,8

1,2,4,5,8

1,2,4,6,7,8

  1. 独立(基本)路径测试用例
测试用例 X Y x>=80&&y>=80 x+y>=140&&(x>=90||y>=90) 执行路径
1 90,90 T T 1,2,3,8
2 90,50 F T 1,2,4,5,8
3 70,70 F F 1,2,4,6,7,8

(1)语句覆盖测试用例1执行截图如下:

clip_image038.jpg

(2)语句覆盖测试用例2执行截图如下:

clip_image040.jpg

(3) 语句覆盖测试用例3执行截图如下:

img