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

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

软件分析与测试


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


一、实验目的

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

二、实验内容

判断三角形类型

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

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

  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. T1:a+b<=c
  3. T2:b+c<=a
  4. T3:a+c<=b
  5. T4:a==b
  6. T5:b==c
  7. 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. 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. 路径1:1—2—3—4—10
  3. 路径2:1—2—3—5—6—10
  4. 路径3:1—2—3—5—7—8—10
  5. 路径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)数据流覆盖

程序的控制流图

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. 共15条DU路径,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的判定,所以当b、c满足条件时,会产生错误,对于测试用例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 会被误判为普通三角形。
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注