#白盒测试实验报告——三角形
##一、实验目的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>200
1
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>=c
1
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==a
1
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: |