[关闭]
@rg070836rg 2015-10-28T11:24:57.000000Z 字数 7082 阅读 5205

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

软件分析与测试


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


一、实验目的

  1. 1)巩固白盒测试技术,能熟练应用控制流覆盖方法设计测试用例;
  2. 2)学习测试用例的书写。

二、实验内容

判断三角形类型

  1. 输入三个整数abc,分别作为三角形的三条边,通过程序判断这三条边是否能构成三角形?如果能构成三角形,则判断三角形的类型(等边三角形、等腰三角形、一般三角形)。要求输入三个整数abc,必须满足以下条件:1a2001b2001c200

要求:
为测试该程序的方便,请将三角形判断的算法尽量放入一个函数中。

  1. 1)画出程序的控制流图;
  2. 2)分别以判定覆盖、条件覆盖、判定/条件覆盖、全条件覆盖、MC/DC覆盖设计测试用例,并写出每个测试用例的执行路径(全覆盖满足困难时,可适当简化);
  3. 3)请采用基本路径测试方法(兼顾循环测试)对程序进行测试用例的设计;
  4. 4)通过你的测试,请总结你所使用测试方法发现的Bug
  5. 要求:设计测试用例时,每种覆盖方法的覆盖率应尽可能达到100%

三、实验要求

  • 根据题目要求编写测试用例
  • 撰写实验报告
  • 有关的实现程序请附到实验报告中
  • 实验报告命名规则:学号后两位+姓名_白盒实验¬

四、实验报告

(1)程序代码

  1. #include <iostream>
  2. using namespace std;
  3. void test_tir(int a,int b,int c)
  4. {
  5. while(a<1||a>200||b<1||b>200||c<1||c>200)
  6. {
  7. cout<<"输入的值不符合条件,请重新输入:"<<endl;
  8. cin>>a>>b>>c;
  9. }
  10. if((a+b<=c)||(b+c<=a)||(a+c<=b))
  11. {
  12. cout<<"非三角形"<<endl;
  13. }
  14. else
  15. {
  16. if(a==b&&b==c)
  17. cout<<"等边三角形"<<endl;
  18. else if((a==b)||(b==c)||(a==c))
  19. cout<<"等腰三角形"<<endl;
  20. else
  21. cout<<"是三角形"<<endl;
  22. }
  23. }
  24. int main()
  25. {
  26. int a,b,c;
  27. cout<<"请输入三条边"<<endl;
  28. cin>>a>>b>>c;
  29. test_tir(a,b,c);
  30. return 0;
  31. }

(2)程序控制流图

  1. 数字代表行数
Created with Raphaël 2.1.24 start6 合法性8 非法提示9 输入abc11 13 非三角形End17 18 等边三角形19 20 等腰三角形22 三角形yesnoyesnoyesnoyesno

(3)判定覆盖

  1. P1:覆盖判定 6: while(a<1||a>200||b<1||b>200||c<1||c>200) 合法性
  2. P2:覆盖判定11: if((a+b<=c)||(b+c<=a)||(a+c<=b)) 三角形判定
  3. P3:覆盖判定17: if(a==b&&b==c) 等边三角形判定
  4. 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. T1a+b<=c
  3. T2b+c<=a
  4. T3a+c<=b
  5. T4a==b
  6. T5b==c
  7. T6a==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. T1:a==b
  3. T2:b==c
  4. T3:a==c
  5. P1:if(a==b&&b==c) 等边三角形判定
  6. 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. T1:a==b
  3. T2:b==c
  4. 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. MC/DC是修改的条件/判定覆盖
  2. 简化掉输入检测与三角形判定。
  3. T1:a==b
  4. T2:b==c
  5. T3:a==c
  6. P1:if(a==b&&b==c) 等边三角形判定
  7. 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)基本路径覆盖

Created with Raphaël 2.1.2S1 2 3 4 5E67 89 10 yesnoyesnoyesnoyesno

  1. 圈复杂度:15(条边)-12(个节点)+ 2 = 5

  1. 基本路径集
  2. 路径1123410
  3. 路径21235610
  4. 路径312357810
  5. 路径412357910

  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)数据流覆盖

程序的控制流图

Created with Raphaël 2.1.21 start2 合法性3 非法提示4 输入abc5 6 非三角形12 end7 8 等边三角形9 10 等腰三角形11 三角形yesnoyesnoyesnoyesno

计算相关定义、引用集合、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. 15DU路径,5条唯一
  2. [1,2]
  3. [3,4,2]
  4. [1,2,5]
  5. [1,2,5,7]
  6. [1,2,5,7,9]
  1. 测试用例:0 0 0
  2. 测试路径:1-2-3-4-2
  3. 覆盖的DU路径:[1,2] [3,4,2]
  1. 测试用例:3 4 5
  2. 测试路径:1-2-5-7-9-11-12
  3. 覆盖的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. void test_tir_by4(int a,int b,int c)
  2. {
  3. while(a>200||b<1||b>200||c<1||c>200)
  4. {
  5. cout<<"输入的值不符合条件,请重新输入:"<<endl;
  6. cin>>a>>b>>c;
  7. }
  8. if((a+b<=c)||(b+c<=a)||(a+c<=b))
  9. {
  10. cout<<"非三角形"<<endl;
  11. }
  12. else
  13. {
  14. if(a==b&&b==c)
  15. cout<<"等边三角形"<<endl;
  16. else if((a==b)||(b==c)||(a==c))
  17. cout<<"等腰三角形"<<endl;
  18. else
  19. cout<<"是三角形"<<endl;
  20. }
  21. }

变异体二

与源代码相比,第8行的第一个条件被改变,即a+b<=c变成a+b>=c

  1. void test_tir_by1(int a,int b,int c)
  2. {
  3. while(a<1||a>200||b<1||b>200||c<1||c>200)
  4. {
  5. cout<<"输入的值不符合条件,请重新输入:"<<endl;
  6. cin>>a>>b>>c;
  7. }
  8. if((a+b>=c)||(b+c<=a)||(a+c<=b))
  9. {
  10. cout<<"非三角形"<<endl;
  11. }
  12. else
  13. {
  14. if(a==b&&b==c)
  15. cout<<"等边三角形"<<endl;
  16. else if((a==b)||(b==c)||(a==c))
  17. cout<<"等腰三角形"<<endl;
  18. else
  19. cout<<"是三角形"<<endl;
  20. }
  21. }

变异体三

与源代码相比,第14行被改变,即由a==b&&b==c变成a==b&&b==c&&c==a

  1. void test_tir_by2(int a,int b,int c)
  2. {
  3. while(a<1||a>200||b<1||b>200||c<1||c>200)
  4. {
  5. cout<<"输入的值不符合条件,请重新输入:"<<endl;
  6. cin>>a>>b>>c;
  7. }
  8. if((a+b<=c)||(b+c<=a)||(a+c<=b))
  9. {
  10. cout<<"非三角形"<<endl;
  11. }
  12. else
  13. {
  14. if(a==b&&b==c&&c==a)
  15. cout<<"等边三角形"<<endl;
  16. else if((a==b)||(b==c)||(a==c))
  17. cout<<"等腰三角形"<<endl;
  18. else
  19. cout<<"是三角形"<<endl;
  20. }
  21. }

变异体四

与源代码相比,第16行被改变,即由(a==b)||(b==c)||(a==c)变成(a==b)||(b==c)

  1. void test_tir_by3(int a,int b,int c)
  2. {
  3. while(a<1||a>200||b<1||b>200||c<1||c>200)
  4. {
  5. cout<<"输入的值不符合条件,请重新输入:"<<endl;
  6. cin>>a>>b>>c;
  7. }
  8. if((a+b<=c)||(b+c<=a)||(a+c<=b))
  9. {
  10. cout<<"非三角形"<<endl;
  11. }
  12. else
  13. {
  14. if(a==b&&b==c)
  15. cout<<"等边三角形"<<endl;
  16. else if((a==b)||(b==c))
  17. cout<<"等腰三角形"<<endl;
  18. else
  19. cout<<"是三角形"<<endl;
  20. }
  21. }

变异体改变汇总

  1. M1:第03行由 a<1||a>200.. 变成 a>200..
  2. M2:第08行由 a+b<=c 变成 a+b>=c
  3. M3:第14行由 a==b&&b==c 变成 a==b&&b==c&&c==a
  4. 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. 变异体M1:
  2. 源程序(a<1||a>200..)变成a>200少了对于a<1的判定,所以当bc满足条件时,会产生错误,对于测试用例0 3 4产生影响。
  1. 变异体M2:
  2. 源程序(a+b<=c)变成(a+b>=c)改变了判定条件,使得大多是的三角形判定失败,对很多用例产生了影响。
  1. 变异体M3:
  2. 源程序(a==b&&b==c)变成(a==b&&b==c&&c==a),但是由于前两个条件保证了第三个条件的成立性,所以变异体程序对结果没有影响,是等价变异体
  1. 变异体M4:
  2. 源程序((a==b)||(b==c)||(a==c))变成((a==b)||(b==c)),对于某些等腰三角形的判定产生了影响,比如用例4 3 4 会被误判为普通三角形。
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注