10.15软件测试作业--三角形


#白盒测试实验报告——三角形

##一、实验目的

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
#include <iostream>
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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
st=>start: 4 start
cond_while_0=>condition: 6 合法性
op_while_1=>operation: 8 非法提示
op_while_2=>operation: 9 输入abc

cond_if_0=>condition: 11
cond_if_1=>condition: 17
cond_if_2=>condition: 19

op_cout_0=>operation: 13 非三角形
op_cout_1=>operation: 18 等边三角形
op_cout_2=>operation: 20 等腰三角形
op_cout_3=>operation: 22 三角形

e=>end

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

###(3)判定覆盖

1
2
3
4
P1:覆盖判定 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
7
MC/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
25
st=>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
2
3
4
5
基本路径集
路径1:1—2—3—4—10
路径2:1—2—3—5—6—10
路径3:1—2—3—5—7—8—10
路径4:1—2—3—5—7—9—10

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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
st=>start: 1 start
cond_while_0=>condition: 2 合法性
op_while_1=>operation: 3 非法提示
op_while_2=>operation: 4 输入abc

cond_if_0=>condition: 5
cond_if_1=>condition: 7
cond_if_2=>condition: 9

op_cout_0=>operation: 6 非三角形
op_cout_1=>operation: 8 等边三角形
op_cout_2=>operation: 10 等腰三角形
op_cout_3=>operation: 11 三角形

e=>end: 12 end

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

计算相关定义、引用集合、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


a
(1,2)
[1,2]


(3,2)

[3,4,2]


(1,5)
[1,2,5]


(1,7)
[1,2,5,7]


(1,9)
[1,2,5,7,9]


b
(1,2)
[1,2]


(3,2)

[3,4,2]


(1,5)
[1,2,5]


(1,7)
[1,2,5,7]


(1,9)
[1,2,5,7,9]


c
(1,2)
[1,2]


(3,2)

[3,4,2]


(1,5)
[1,2,5]


(1,7)
[1,2,5,7]


(1,9)
[1,2,5,7,9]

基于代码的覆盖——数据流覆盖

1
2
3
4
5
6
共15条DU路径,5条唯一
[1,2]
[3,4,2]
[1,2,5]
[1,2,5,7]
[1,2,5,7,9]
1
2
3
测试用例:0 0 0
测试路径:1-2-3-4-2
覆盖的DU路径:[1,2] [3,4,2]
1
2
3
测试用例:3 4 5
测试路径:1-2-5-7-9-11-12
覆盖的DU路径:[1,2,5] [1,2,5,7] [1,2,5,7,9]

###(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
21
void 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
21
void 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
21
void 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
21
void 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
4
M1:第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
2
变异体M2:
源程序(a+b<=c)变成(a+b>=c)改变了判定条件,使得大多是的三角形判定失败,对很多用例产生了影响。
1
2
变异体M3:
源程序(a==b&&b==c)变成(a==b&&b==c&&c==a),但是由于前两个条件保证了第三个条件的成立性,所以变异体程序对结果没有影响,是等价变异体
1
2
变异体M4:
源程序((a==b)||(b==c)||(a==c))变成((a==b)||(b==c)),对于某些等腰三角形的判定产生了影响,比如用例4 3 4 会被误判为普通三角形。