10.15软件测试作业--三角形
软件分析与测试
白盒测试实验报告——三角形
一、实验目的
(1)巩固白盒测试技术,能熟练应用控制流覆盖方法设计测试用例;
(2)学习测试用例的书写。
二、实验内容
判断三角形类型
输入三个整数a、b、c,分别作为三角形的三条边,通过程序判断这三条边是否能构成三角形?如果能构成三角形,则判断三角形的类型(等边三角形、等腰三角形、一般三角形)。要求输入三个整数a、b、c,必须满足以下条件:1≤a≤200;1≤b≤200;1≤c≤200。
要求:
为测试该程序的方便,请将三角形判断的算法尽量放入一个函数中。
(1)画出程序的控制流图;
(2)分别以判定覆盖、条件覆盖、判定/条件覆盖、全条件覆盖、MC/DC覆盖设计测试用例,并写出每个测试用例的执行路径(全覆盖满足困难时,可适当简化);
(3)请采用基本路径测试方法(兼顾循环测试)对程序进行测试用例的设计;
(4)通过你的测试,请总结你所使用测试方法发现的Bug。
要求:设计测试用例时,每种覆盖方法的覆盖率应尽可能达到100%
三、实验要求
- 根据题目要求编写测试用例
- 撰写实验报告
- 有关的实现程序请附到实验报告中
- 实验报告命名规则:学号后两位+姓名_白盒实验¬
四、实验报告
(1)程序代码
#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)程序控制流图
数字代表行数
(3)判定覆盖
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)条件覆盖
条件如下:
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)判定/条件覆盖
简化掉输入检测与三角形判定。
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)全条件覆盖(可适当简化)
同样,省略前面的判定,只保留最后几步判定
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覆盖
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)基本路径覆盖
圈复杂度:15(条边)-12(个节点)+ 2 = 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 |
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)数据流覆盖
程序的控制流图
计算相关定义、引用集合、DU(定义/引用)路径
结点的定义、引用变量
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 |
|
|
边的引用变量
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) |
|
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] |
基于代码的覆盖——数据流覆盖
共15条DU路径,5条唯一
[1,2]
[3,4,2]
[1,2,5]
[1,2,5,7]
[1,2,5,7,9]
测试用例:0 0 0
测试路径:1-2-3-4-2
覆盖的DU路径:[1,2] [3,4,2]
测试用例: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
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
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
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)
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;
}
}
变异体改变汇总
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% |
|
|
变异体分析
变异体M1:
源程序(a<1||a>200..)变成a>200少了对于a<1的判定,所以当b、c满足条件时,会产生错误,对于测试用例0 3 4产生影响。
变异体M2:
源程序(a+b<=c)变成(a+b>=c)改变了判定条件,使得大多是的三角形判定失败,对很多用例产生了影响。
变异体M3:
源程序(a==b&&b==c)变成(a==b&&b==c&&c==a),但是由于前两个条件保证了第三个条件的成立性,所以变异体程序对结果没有影响,是等价变异体
变异体M4:
源程序((a==b)||(b==c)||(a==c))变成((a==b)||(b==c)),对于某些等腰三角形的判定产生了影响,比如用例4 3 4 会被误判为普通三角形。