#白盒测试实验报告——三角形
##一、实验目的1
2(1)巩固白盒测试技术,能熟练应用控制流覆盖方法设计测试用例;
(2)学习测试用例的书写。
##二、实验内容
###判断三角形类型1
输入三个整数a、b、c,分别作为三角形的三条边,通过程序判断这三条边是否能构成三角形?如果能构成三角形,则判断三角形的类型(等边三角形、等腰三角形、一般三角形)。要求输入三个整数a、b、c,必须满足以下条件:1≤a≤200;1≤b≤200;1≤c≤200。
要求:
为测试该程序的方便,请将三角形判断的算法尽量放入一个函数中。1
2
3
4
5(1)画出程序的控制流图;
(2)分别以判定覆盖、条件覆盖、判定/条件覆盖、全条件覆盖、MC/DC覆盖设计测试用例,并写出每个测试用例的执行路径(全覆盖满足困难时,可适当简化);
(3)请采用基本路径测试方法(兼顾循环测试)对程序进行测试用例的设计;
(4)通过你的测试,请总结你所使用测试方法发现的Bug。
要求:设计测试用例时,每种覆盖方法的覆盖率应尽可能达到100%
##三、实验要求
- 根据题目要求编写测试用例
 - 撰写实验报告
 - 有关的实现程序请附到实验报告中
 - 实验报告命名规则:学号后两位+姓名_白盒实验¬
 
##四、实验报告
###(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
33
34
using namespace std;
void test_tir(int a,int b,int c)
{
	while(a<1||a>200||b<1||b>200||c<1||c>200)
	{
		cout<<"输入的值不符合条件,请重新输入:"<<endl;
		cin>>a>>b>>c;
	}
	if((a+b<=c)||(b+c<=a)||(a+c<=b))
	{
		cout<<"非三角形"<<endl;
	}
	else
	{
		if(a==b&&b==c)
			cout<<"等边三角形"<<endl;
		else if((a==b)||(b==c)||(a==c))
			cout<<"等腰三角形"<<endl;
		else
			cout<<"是三角形"<<endl;
	}
}
int main()
{
	int a,b,c;
	cout<<"请输入三条边"<<endl;
	cin>>a>>b>>c;
	test_tir(a,b,c);
	return 0;
}
###(2)程序控制流图1
数字代表行数
1  | st=>start: 4 start  | 
###(3)判定覆盖1
2
3
4P1:覆盖判定 6: while(a<1||a>200||b<1||b>200||c<1||c>200) 合法性
P2:覆盖判定11: if((a+b<=c)||(b+c<=a)||(a+c<=b))          三角形判定
P3:覆盖判定17: if(a==b&&b==c)                            等边三角形判定
P4:覆盖判定19: else if((a==b)||(b==c)||(b==c))           等腰三角形判定
| 编号 | 测试用例 | 执行路径 | 覆盖判定 | 输出结果 | 
|---|---|---|---|---|
| 1 | 0 0 0 | 4-6-8-9-6 | -P1 | |
| 2 | 1 2 3 | 4-6-11-13-E | P1 P2 | 非三角形 | 
| 3 | 6 6 6 | 4-6-11-17-18-E | P1 -P2 P3 | 等边三角形 | 
| 4 | 6 6 7 | 4-6-11-17-19-20-E | P1 -P2 -P3 P4 | 等腰三角形 | 
| 5 | 3 4 5 | 4-6-11-17-19-22-E | P1 -P2 -P3 -P4 | 三角形 | 
| 编号 | 测试用例 | 执行路径 | 数据合法性判定 | 三角形判定 | 等边判定 | 等腰判定 | 输出结果 | 
|---|---|---|---|---|---|---|---|
| 1 | 0 0 0 | 4-6-8-9-6 | False | ||||
| 2 | 1 2 3 | 4-6-11-13-E | True | True | 非三角形 | ||
| 3 | 6 6 6 | 4-6-11-17-18-E | True | False | True | 等边三角形 | |
| 4 | 6 6 7 | 4-6-11-17-19-20-E | True | False | False | True | 等腰三角形 | 
| 5 | 3 4 5 | 4-6-11-17-19-22-E | True | False | False | False | 三角形 | 
###(4)条件覆盖1
2
3
4
5
6
7条件如下:
T1:a+b<=c
T2:b+c<=a
T3:a+c<=b 
T4:a==b
T5:b==c
T6:a==c
| 编号 | 测试用例 | 执行路径 | 条件覆盖 | 输出结果 | 
|---|---|---|---|---|
| 1 | 1 1 2 | 4-6-8-9-6 | T1 | 非三角形 | 
| 2 | 3 1 1 | 4-6-8-9-6 | -T1 T2 | 非三角形 | 
| 3 | 1 3 1 | 4-6-8-9-6 | -T1 -T2 T3 | 非三角形 | 
| 4 | 6 6 6 | 4-6-11-17-18-E | -T1 -T2 -T3 T4 T5 | 等边三角形 | 
| 5 | 6 6 7 | 4-6-11-17-19-20-E | -T1 -T2 -T3 T4 -T5 -T6 | 等腰三角形 | 
| 6 | 3 4 4 | 4-6-11-17-19-20-E | -T1 -T2 -T3 -T4 T5 -T6 | 等腰三角形 | 
| 7 | 4 3 4 | 4-6-11-17-19-20-E | -T1 -T2 -T3 -T4 -T5 T6 | 等腰三角形 | 
| 8 | 3 4 5 | 4-6-11-17-19-22-E | -T1 -T2 -T3 -T4 -T5 -T6 | 三角形 | 
| 编号 | 测试用例 | 执行路径 | a+b<=c | b+c<=a | a+c<=b | a==b | b==c | a==c | 输出结果 | 
|---|---|---|---|---|---|---|---|---|---|
| 1 | 1 1 2 | 4-6-8-9-6 | True | 非三角形 | |||||
| 2 | 3 1 1 | 4-6-8-9-6 | False | True | 非三角形 | ||||
| 3 | 1 3 1 | 4-6-8-9-6 | False | False | True | 非三角形 | |||
| 4 | 6 6 6 | 4-6-11-17-18-E | False | False | False | True | True | 等边三角形 | |
| 5 | 6 6 7 | 4-6-11-17-19-20-E | False | False | False | True | False | False | 等腰三角形 | 
| 6 | 3 4 4 | 4-6-11-17-19-20-E | False | False | False | False | True | False | 等腰三角形 | 
| 7 | 4 3 4 | 4-6-11-17-19-20-E | False | False | False | False | False | True | 等腰三角形 | 
| 8 | 3 4 5 | 4-6-11-17-19-22-E | False | False | False | False | False | False | 三角形 | 
###(5)判定/条件覆盖1
2
3
4
5
6简化掉输入检测与三角形判定。
T1:a==b
T2:b==c
T3:a==c
P1:if(a==b&&b==c)                   等边三角形判定 
P2:else if((a==b)||(b==c)||(b==c))  等腰三角形判定
| 编号 | 测试用例 | 执行路径 | 覆盖判定/条件 | 输出结果 | 
|---|---|---|---|---|
| 1 | 3 3 4 | 4-6-11-17-19-20-E | T1 -T2 -T3 -P1 P2 | 等腰三角形 | 
| 2 | 4 3 3 | 4-6-11-17-19-20-E | -T1 T2 -T3 -P1 P2 | 等腰三角形 | 
| 3 | 3 4 3 | 4-6-11-17-19-20-E | -T1 -T2 T3 -P1 P2 | 等腰三角形 | 
| 4 | 3 3 3 | 4-6-11-17-18-20-E | T1 T2 P1 | 等边三角形 | 
| 5 | 3 4 5 | 4-6-11-17-19-22-E | -T1 -T2 -T3 -P1 -P2 | 三角形 | 
| 编号 | 测试用例 | 执行路径 | a==b | b==c | a==c | 等边三角形判定 | 等腰三角形判定 | 输出结果 | 
|---|---|---|---|---|---|---|---|---|
| 1 | 3 3 4 | 4-6-11-17-19-20-E | true | false | false | false | true | 等腰三角形 | 
| 2 | 4 3 3 | 4-6-11-17-19-20-E | false | true | false | false | true | 等腰三角形 | 
| 3 | 3 4 3 | 4-6-11-17-19-20-E | false | false | true | false | true | 等腰三角形 | 
| 4 | 3 3 3 | 4-6-11-17-18-20-E | true | true | true | 等边三角形 | ||
| 5 | 3 4 5 | 4-6-11-17-19-22-E | false | false | false | false | false | 三角形 | 
###(6)全条件覆盖(可适当简化)1
2
3
4同样,省略前面的判定,只保留最后几步判定
T1:a==b
T2:b==c
T3:a==c
| 编号 | 测试用例 | 执行路径 | 覆盖全条件 | 输出结果 | 
|---|---|---|---|---|
| 1 | 3 4 5 | 4-6-11-17-19-22-E | -T1 -T2 -T3 | 三角形 | 
| 2 | 3 4 3 | 4-6-11-17-19-20-E | -T1 -T2 T3 | 等腰三角形 | 
| 3 | 4 3 3 | 4-6-11-17-19-20-E | -T1 T2 -T3 | 等腰三角形 | 
| 4 | 不存在 | -T1 T2 T3 | ||
| 5 | 3 3 4 | 4-6-11-17-19-20-E | T1 -T2 -T3 | 等腰三角形 | 
| 6 | 不存在 | T1 -T2 T3 | ||
| 7 | 不存在 | T1 T2 -T3 | ||
| 8 | 3 3 3 | 4-6-11-17-18-20-E | T1 T2 T3 | 等边三角形 | 
| 编号 | 测试用例 | 执行路径 | a==b | b==c | a==c | 输出结果 | 
|---|---|---|---|---|---|---|
| 1 | 3 4 5 | 4-6-11-17-19-22-E | false | false | false | 三角形 | 
| 2 | 3 4 3 | 4-6-11-17-19-20-E | false | false | true | 等腰三角形 | 
| 3 | 4 3 3 | 4-6-11-17-19-20-E | false | true | false | 等腰三角形 | 
| 4 | 不存在 | false | true | true | ||
| 5 | 3 3 4 | 4-6-11-17-19-20-E | true | false | false | 等腰三角形 | 
| 6 | 不存在 | true | false | true | ||
| 7 | 不存在 | true | true | false | ||
| 8 | 3 3 3 | 4-6-11-17-18-20-E | true | true | true | 等边三角形 | 
###(7)MC/DC覆盖1
2
3
4
5
6
7MC/DC是修改的条件/判定覆盖
简化掉输入检测与三角形判定。
T1:a==b
T2:b==c
T3:a==c
P1:if(a==b&&b==c)                   等边三角形判定 
P2:else if((a==b)||(b==c)||(a==c))  等腰三角形判定
下面就P1:if(a==b&&b==c)  进行MC/DC覆盖
| 编号 | 测试用例  |a==b|b==c|等边三角形判定|输出结果|
|—| —– | —- | —- | —- | —- | —- |
| 1|3 3 3|T|T|T|等边三角形|
| 2|3 4 4|F|T|F|等腰三角形|
| 3|3 3 4|T|F|F|等腰三角形|
下面就P2:else if((a==b)||(b==c)||(a==c)) 进行MC/DC覆盖
| 编号 | 测试用例 | a==b | b==c | a==c | 等腰三角形判定 | 输出结果 | 
|---|---|---|---|---|---|---|
| 1 | 3 4 5 | F | F | F | F | 三角形 | 
| 2 | 3 4 3 | F | F | T | T | 等腰三角形 | 
| 3 | 3 4 4 | F | T | F | T | 等腰三角形 | 
| 4 | 3 3 4 | T | F | F | T | 等腰三角形 | 
###(8)基本路径覆盖1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25st=>start: S
cond_while_0=>condition: 1 
op_while_1=>operation: 2 
op_while_2=>operation: 3 
cond_if_0=>condition: 4 
cond_if_1=>condition: 6
cond_if_2=>condition: 8
op_cout_0=>operation: 5
op_cout_1=>operation: 7 
op_cout_2=>operation: 9 
op_cout_3=>operation: 10 
e=>end: E
st->cond_while_0
cond_while_0(yes)->op_while_1->op_while_2->cond_while_0
cond_while_0(no)->cond_if_0
cond_if_0(yes)->op_cout_0->e
cond_if_0(no)->cond_if_1
cond_if_1(yes)->op_cout_1->e
cond_if_1(no)->cond_if_2
cond_if_2(yes)->op_cout_2->e
cond_if_2(no)->op_cout_3->e
1  | 圈复杂度:15(条边)-12(个节点)+ 2 = 5  | 
1  | 基本路径集  | 
1  | 设计测试用例  | 
| 编号 | 执行路径 | 测试用例 | 输出结果 | 
|---|---|---|---|
| 1 | S-1-2-3-1 | -1 -1 -1 | 不符合条件 | 
| 2 | S-1-4-5-E | 1 2 3 | 非三角形 | 
| 3 | S-1-4-6-7-E | 6 6 6 | 等边三角形 | 
| 4 | S-1-4-6-8-9-E | 3 3 4 | 等腰三角形 | 
| 5 | S-1-4-6-8-10-E | 3 4 5 | 普通三角形 | 
###(9)数据流覆盖
程序的控制流图
1  | st=>start: 1 start  | 
计算相关定义、引用集合、DU(定义/引用)路径
1  | 结点的定义、引用变量  | 
| Node | Def | Use | 
|---|---|---|
| 1 | {a,b,c} | |
| 2 | {a,b,c} | |
| 3 | {a,b,c} | |
| 4 | ||
| 5 | {a,b,c} | |
| 6 | ||
| 7 | {a,b,c} | |
| 8 | ||
| 9 | {a,b,c} | |
| 10 | ||
| 11 | ||
| 12 | 
1  | 边的引用变量  | 
| Edge | Use | 
|---|---|
| (1,2) | |
| (2,3) | {a,b,c} | 
| (3,4) | |
| (2,5) | {a,b,c} | 
| (5,7) | {a,b,c} | 
| (7,9) | {a,b,c} | 
| (9,11) | {a,b,c} | 
| (5,6) | |
| (7,8) | |
| (9,10) | 
1  | DU(定义/引用)路径  | 
| DU(定义/引用)路径 | ||
|---|---|---|
| Variable | DU Pairs | DU Paths | 
基于代码的覆盖——数据流覆盖
1  | 共15条DU路径,5条唯一  | 
1  | 测试用例:0 0 0  | 
1  | 测试用例:3 4 5  | 
###(10)变异覆盖
####变异体一:
与源代码相比,第3行被改变,即由a<1||a>200||b<1||b>200||c<1||c>200变成a>200||b<1||b>200||c<1||c>2001
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21void test_tir_by4(int a,int b,int c)
{
    while(a>200||b<1||b>200||c<1||c>200)
    {
        cout<<"输入的值不符合条件,请重新输入:"<<endl;
        cin>>a>>b>>c;
    }
    if((a+b<=c)||(b+c<=a)||(a+c<=b))
    {
        cout<<"非三角形"<<endl;
    }
    else
    {
        if(a==b&&b==c)
            cout<<"等边三角形"<<endl;
        else if((a==b)||(b==c)||(a==c))
            cout<<"等腰三角形"<<endl;
        else
            cout<<"是三角形"<<endl;
    }
}
####变异体二:
与源代码相比,第8行的第一个条件被改变,即a+b<=c变成a+b>=c1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21void test_tir_by1(int a,int b,int c)
{
    while(a<1||a>200||b<1||b>200||c<1||c>200)
    {
        cout<<"输入的值不符合条件,请重新输入:"<<endl;
        cin>>a>>b>>c;
    }
    if((a+b>=c)||(b+c<=a)||(a+c<=b))
    {
        cout<<"非三角形"<<endl;
    }
    else
    {
        if(a==b&&b==c)
            cout<<"等边三角形"<<endl;
        else if((a==b)||(b==c)||(a==c))
            cout<<"等腰三角形"<<endl;
        else
            cout<<"是三角形"<<endl;
    }
}
####变异体三:
与源代码相比,第14行被改变,即由a==b&&b==c变成a==b&&b==c&&c==a1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21void test_tir_by2(int a,int b,int c)
{
    while(a<1||a>200||b<1||b>200||c<1||c>200)
    {
        cout<<"输入的值不符合条件,请重新输入:"<<endl;
        cin>>a>>b>>c;
    }
    if((a+b<=c)||(b+c<=a)||(a+c<=b))
    {
        cout<<"非三角形"<<endl;
    }
    else
    {
        if(a==b&&b==c&&c==a)
            cout<<"等边三角形"<<endl;
        else if((a==b)||(b==c)||(a==c))
            cout<<"等腰三角形"<<endl;
        else
            cout<<"是三角形"<<endl;
    }
}
####变异体四:
与源代码相比,第16行被改变,即由(a==b)||(b==c)||(a==c)变成(a==b)||(b==c)1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21void test_tir_by3(int a,int b,int c)
{
    while(a<1||a>200||b<1||b>200||c<1||c>200)
    {
        cout<<"输入的值不符合条件,请重新输入:"<<endl;
        cin>>a>>b>>c;
    }
    if((a+b<=c)||(b+c<=a)||(a+c<=b))
    {
        cout<<"非三角形"<<endl;
    }
    else
    {
        if(a==b&&b==c)
            cout<<"等边三角形"<<endl;
        else if((a==b)||(b==c))
            cout<<"等腰三角形"<<endl;
        else
            cout<<"是三角形"<<endl;
    }
}
####变异体改变汇总1
2
3
4M1:第03行由     a<1||a>200..            变成    a>200..
M2:第08行由     a+b<=c                  变成    a+b>=c
M3:第14行由     a==b&&b==c              变成    a==b&&b==c&&c==a
M4:第16行由     (a==b)||(b==c)||(a==c)  变成    (a==b)||(b==c)
#####测试用例集
| 编号 |  a |b |c
|—| —– | —- | —- |
|t1|0|1|1
|t2|1|2|3
|t3|6|6|6
|t4|6|6|7
|t5|3|4|5
|t6|1|1|2
|t7|3|1|1
|t8|1|3|1
|t9|3|4|4
|t10|4|3|4
|t11|4|3|3
#####测试执行结果
| 测试编号 | P |M1|M2|M3|M4|杀死的变异体
|— | —– | —- | —- | —- | —- |—-|
|t1|不符合|非三角形|不符合|不符合|不符合|M1
|t2|非三角形|非三角形|非三角形|非三角形|非三角形|无
|t3|等边三角形|等边三角形|非三角形|等边三角形|等边三角形|M2
|t4|等腰三角形|等腰三角形|非三角形|等腰三角形|等腰三角形|M2
|t5|三角形|三角形|非三角形|三角形|三角形|M2
|t6|非三角形|非三角形|非三角形|非三角形|非三角形|无
|t7|非三角形|非三角形|非三角形|非三角形|非三角形|无
|t8|非三角形|非三角形|非三角形|非三角形|非三角形|无
|t9|等腰三角形|等腰三角形|非三角形|等腰三角形|等腰三角形|M2
|t10|等腰三角形|等腰三角形|非三角形|等腰三角形|三角形|M2 M4
|t11|等腰三角形|等腰三角形|非三角形|等腰三角形|等腰三角形|M2
#####测试用例集的充分性
| 测试用例| 测试用例集的充分性| 测试用例| 测试用例集的充分性
|——-| —- |— | —– |
|t1|25%|t2|0%
|t3|25%|t4|25%
|t5|25%|t6|0%
|t7|0%|t8|0%
|t9|25%|t10|50%
|t11|25%
####变异体分析1
2变异体M1:
源程序(a<1||a>200..)变成a>200少了对于a<1的判定,所以当b、c满足条件时,会产生错误,对于测试用例0 3 4产生影响。
1  | 变异体M2:  | 
1  | 变异体M3:  | 
1  | 变异体M4:  |