文章目录
一、问题描述
针对三角形的形状判定程序设计测试用例,进行白盒测试。假定这里构成三角形的边取值只能为大于0的实数。
程序判定的类型有:
二、实验目的
- 掌握白盒测试的原理与基本方法;
- 掌握使用逻辑覆盖和基路径测试等设计测试用例的方法;
- 掌握单元测试的方法步骤;
- 掌握控制流图的画法和通过控制流图找出基本路径的方法。
三、实验环境
语言:C++
平台:Visual Studio Code
四、程序代码
此代码将三角形判断模块单独分开,其中,在判断三角形的同时计算了三角形的周长和面积。共分为下面几个模块(具体将体现在流程图中)
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 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 |
#include <stdio.h> #include <math.h> #include<cctype> #include<iostream> using namespace std; void clearData(float a, float b, float c){ //数据清洗 if (a < 0 || b < 0 || c < 0)printf("输入不合法\n"); } void calMetric(float a, float b, float c){ //计算周长和面积 float s, area; s = (a + b + c) / 2; area = (float)sqrt(s *(s - a)*(s - b)*(s - c)); //计算三角形的面积 printf("面积是:%.2f\n", area); //计算三角形的周长 printf("周长是:%.2f\n", float(a + b + c)); } void judge(float a, float b, float c){ //判断构成的三角形 if (a + b > c && b + c > a && a + c > b){//两边之和大于第三边 calMetric(a, b, c); if (a == b && a == c) //判断三条边是否相等 printf("等边三角形\n"); //输出等边三角形 else if (a == b || a == c || b == c) //判断是否有两边相等 printf("等腰三角形\n"); //等腰三角形 else if ((a*a+b*b==c*c)||(a*a+c*c==b*b)||(b*b+c*c==a*a)) printf("直角三角形\n"); //直角三角形 else printf("普通三角形\n"); //普通三角形 } else printf("边长%f %f %f不能构成三角形!\n", a, b, c);//两边之和小于第三边不能组成三角形 } float input(){ //输入模块 float a; cin>>a; return a; } void Triangle(float a, float b, float c){ clearData(a, b, c); judge(a, b, c); } int main(){ float a, b, c; while(1){ printf("请输入三角形的三条边:"); a = input(); b = input(); c = input(); if(a == 0 || b == 0 || c == 0)break; Triangle(a,b,c); } return 0; } |
五、程序流程图
分析:程序功能应该为①先从键盘输入数据,按空格分开②若不合法则输出当前输入不能构成三角形、若合法则判断分别是否能构成三角形③是否为等边三角形、等腰三角形、直角三角形、普通三角形④在判断过程中计算面积与周长最后输出结果。共有4个模块程序流程图如下,其中带有判定的模块为2个,一个为三角形判断模块,另一个数据输入清洗模块。由于数据清洗模块直接规定了数据输入范围与类型,一次性判断输入是否合法,只有一个if语句,因此不再进行具体的白盒测试,下面主要对三角形判断模块进行白盒测试(Mi代表模块,Ji代表控制语句):
六、针对三角形判断模块的白盒测试:
映射的控制流图为:
1.语句覆盖
设计若干个测试用例,运行所测程序,使得每条可执行语句至少被执行一次。测试用例如下:
序号 | 输入(a, b, c) | 期望输出 | 周长 | 面积 | 覆盖流 | 测试结果 |
Case1 | 2 3 4 | 普通 | 9.0 | 2.9 | 1 2 3 5 7 9 11 | 通过 |
Case2 | 3 3 3 | 等边 | 9.0 | 3.9 | 1 2 3 5 6 11 | 通过 |
Case3 | 2 2 3 | 等腰 | 7.0 | 1.98 | 1 2 3 5 7 8 11 | 通过 |
Case4 | 3 4 5 | 直角 | 12.0 | 6.0 | 1 2 3 5 7 9 10 11 | 通过 |
Case6 | -1 -2 -2 | 不构成 | \ | \ | 1 4 11 | 通过 |
2.判定覆盖
设计足够多的测试用例,使得被测程序中的每个判断的“真”、“假”分支至少被执行一次。本软件共5个判定分支J1/J2/J3/J4/J5,测试用例如下:
序号 | 输入(a, b, c) | 期望输出 | 周长 | 面积 | 覆盖流 | 测试结果 |
Case7 | 2 3 4 | 普通 | 9.0 | 2.9 | 1 2 3 5 7 9 11 | 通过 |
Case8 | 3 3 3 | 等边 | 9.0 | 3.9 | 1 2 3 5 6 11 | 通过 |
Case9 | 2 2 3 | 等腰 | 7.0 | 1.98 | 1 2 3 5 7 8 11 | 通过 |
Case10 | 3 4 5 | 直角 | 12.0 | 6.0 | 1 2 3 5 7 9 10 11 | 通过 |
Case11 | -1 -2 -2 | 不构成 | \ | \ | 1 4 11 | 通过 |
Case12 | 2 2 4 | 不构成 | \ | \ | 1 2 4 11 | 通过 |
3.条件覆盖
设计足够多的测试用例,使得被测试程序中的每个判断语句中的每个逻辑条件的可能取值至少被满足一次。测试用例如下:
序号 | 输入(a, b, c) | 期望输出 | 满足条件 | 测试结果 |
Case13 | 2 2 2 | 等边 | a>c、b+c>a、a+c>b
a == b、a == c、b == c a*a+b*b <> c*c a*a+c*c <> b*b b*b+c*c <> a*a 输入合法
|
通过 |
Case14 | 1 2 3 | 不构成 | a<=c
ba a+c>b 输入合法 |
通过 |
Case15 | -1 -2 -2 | 不构成 | 输入不合法 | 通过 |
Case16 | 3 4 5 | 直角 | a>c、b+c>a、a+c>b
a <> b、a <> c、b <> c a*a+b*b == c*c a*a+c*c <> b*b b*b+c*c <> a*a 输入合法
|
通过 |
Case17 | 2 2 1 | 等腰 | a>c、b+c>a、a+c>b
a == b、a <> c、b <> c a*a+b*b <> c*c a*a+c*c <> b*b b*b+c*c <> a*a 输入合法
|
通过
|
Case18 | 1 2 2 | 等腰 | a>c、b+c>a、a+c>b
a <> b、a <> c、b == c a*a+b*b <> c*c a*a+c*c <> b*b b*b+c*c <> a*a 输入合法
|
通过 |
Case19 | 2 1 2 | 等腰 | a>c、b+c>a、a+c>b
a <> b、a == c、b <> c a*a+b*b <> c*c a*a+c*c <> b*b b*b+c*c <> a*a 输入合法
|
通过 |
Case20 | 5 3 4 | 直角 | a>c、b+c>a、a+c>b
a <> b、a <> c、b <> c a*a+b*b <> c*c a*a+c*c <> b*b b*b+c*c == a*a 输入合法
|
通过 |
Case21 | 3 5 4 | 直角 | a>c、b+c>a、a+c>b
a <> b、a <> c、b <> c a*a+b*b <> c*c a*a+c*c == b*b b*b+c*c <> a*a 输入合法
|
通过 |
Case22 | 3 5 7 | 普通 | a>c、b+c>a、a+c>b
a <> b、a <> c、b <> c a*a+b*b <> c*c a*a+c*c <> b*b b*b+c*c <> a*a 输入合法
|
通过 |
Case23 | 3 2 1 | 不构成 | a>c
b>a a+c<=b 输入合法 |
通过 |
Case24 | 2 3 1 | 不构成 | a>c
b<=a a+c>b 输入合法 |
通过 |
4.判定-条件覆盖
设计足够多的测试用例,使得被测试程序中的每个判断本身的判定结果至少被满足一次,同时,每个逻辑条件的可能值也至少被满足一次,即同时满足100%的判定覆盖和100%的条件覆盖的标准。本软件共5个判定分支J1/J2/J3/J4/J5,测试用例如下:
序号 | 输入(a, b, c) | 期望输出 | 满足条件 | 判定J1-J5 | 测试结果 |
Case25 | 2 2 2 | 等边 | a>c、b+c>a、a+c>b
a == b、a == c、b == c a*a+b*b <> c*c a*a+c*c <> b*b b*b+c*c <> a*a 输入合法
|
T
T F F F T |
通过 |
Case26 | 1 2 3 | 不构成 | a<=c
ba a+c>b 输入合法 |
T
F \\\ |
通过 |
Case27 | -1 -2 -2 | 不构成 | 输入不合法 | F | 通过 |
Case28 | 3 4 5 | 直角 | a>c、b+c>a、a+c>b
a <> b、a <> c、b <> c a*a+b*b == c*c a*a+c*c <> b*b b*b+c*c <> a*a 输入合法
|
T
T F F T
|
通过 |
Case29 | 2 2 1 | 等腰 | a>c、b+c>a、a+c>b
a == b、a <> c、b <> c a*a+b*b <> c*c a*a+c*c <> b*b b*b+c*c <> a*a 输入合法
|
T
T F T F |
通过
|
Case30 | 1 2 2 | 等腰 | a>c、b+c>a、a+c>b
a <> b、a <> c、b == c a*a+b*b <> c*c a*a+c*c <> b*b b*b+c*c <> a*a 输入合法
|
T
T F T F |
通过 |
Case31 | 2 1 2 | 等腰 | a>c、b+c>a、a+c>b
a <> b、a == c、b <> c a*a+b*b <> c*c a*a+c*c <> b*b b*b+c*c <> a*a 输入合法
|
T
T F T F |
通过 |
Case32 | 5 3 4 | 直角 | a>c、b+c>a、a+c>b
a <> b、a <> c、b <> c a*a+b*b <> c*c a*a+c*c <> b*b b*b+c*c == a*a 输入合法
|
T
T F F T
|
通过 |
Case33 | 3 5 4 | 直角 | a>c、b+c>a、a+c>b
a <> b、a <> c、b <> c a*a+b*b <> c*c a*a+c*c == b*b b*b+c*c <> a*a 输入合法
|
T
T F F T
|
通过 |
Case34 | 3 5 7 | 普通 | a>c、b+c>a、a+c>b
a <> b、a <> c、b <> c a*a+b*b <> c*c a*a+c*c <> b*b b*b+c*c <> a*a 输入合法
|
T
T F F F
|
通过 |
Case35 | 3 2 1 | 不构成 | a>c
b>a a+c<=b 输入合法 |
T
F \\\ |
通过 |
Case36 | 2 3 1 | 不构成 | a>c
b<=a a+c>b 输入合法 |
T
F \\\ |
通过 |
5.条件组合覆盖
设计足够多的测试用例,使得被测试程序中的每个判定的所有可能条件取值的组合至少被满足一次。
序号 | 输入(a, b, c) | 期望输出 | 满足的条件组合 | 程序流 | 测试结果 |
Case37 | 2 2 2 | 等边 | 输入合法
a>c a == b
|
1 2 3 5 6 11 | 通过 |
Case38 | 1 2 3 | 不构成 | 输入合法
a+b <= c |
1 2 4 11 | 通过 |
Case39 | -1 -2 -2 | 不构成 | 输入不合法 | 1 4 11 | 通过 |
Case40 | 3 4 5 | 直角 | 输入合法
a>c、b+c>a、a+c>b a <> b、a <> c、b <> c a*a+b*b == c*c a*a+c*c <> b*b b*b+c*c <> a*a
|
1 2 3 5 7 9 10 11 | 通过 |
Case41 | 2 2 1 | 等腰 | a>c、b+c>a、a+c>b
a == b、a <> c、b <> c a*a+b*b <> c*c a*a+c*c <> b*b b*b+c*c <> a*a 输入合法
|
1 2 3 5 7 8 11 | 通过
|
Case42 | 1 2 2 | 等腰 | a>c、b+c>a、a+c>b
a <> b、a <> c、b == c a*a+b*b <> c*c a*a+c*c <> b*b b*b+c*c <> a*a 输入合法
|
1 2 3 5 7 8 11 | 通过 |
Case43 | 2 1 2 | 等腰 | a>c、b+c>a、a+c>b
a <> b、a == c、b <> c a*a+b*b <> c*c a*a+c*c <> b*b b*b+c*c <> a*a 输入合法
|
1 2 3 5 7 8 11 | 通过 |
Case44 | 5 3 4 | 直角 | a>c、b+c>a、a+c>b
a <> b、a <> c、b <> c a*a+b*b <> c*c a*a+c*c <> b*b b*b+c*c == a*a 输入合法
|
1 2 3 5 7 9 10 11 | 通过 |
Case45 | 3 5 4 | 直角 | a>c、b+c>a、a+c>b
a <> b、a <> c、b <> c a*a+b*b <> c*c a*a+c*c == b*b b*b+c*c <> a*a 输入合法
|
1 2 3 5 7 9 10 11 | 通过 |
Case46 | 3 5 7 | 普通 | a>c、b+c>a、a+c>b
a <> b、a <> c、b <> c a*a+b*b <> c*c a*a+c*c <> b*b b*b+c*c <> a*a 输入合法
|
1 2 3 5 7 9 11 | 通过 |
Case47 | 3 2 1 | 不构成 | 输入合法
a+b <= c |
1 2 4 11 | 通过 |
Case48 | 2 3 1 | 不构成 | 输入合法
a+b <= c |
1 2 4 11 | 通过 |
6.基本路径覆盖
- 画出程序流图(如上图所示)注意控制流图是退化了的流程图,将流程图中执行语句、判定语句、开始、结束等退化成节点,将流程线退化成一个节点到另一个节点的带箭头的弧线。
- 根据程序的控制流图计算出该流图的圈复杂度为6,则基本路径至少为
- 导出测试路径。
路径一:1-4-11
路径二:1-2-3-5-7-9-11
路径三:1-2-3-5-6-11
路径四:1-2-3-5-7-8-11
路径五:1-2-3-5-7-9-11
路径六:1-2-3-5-7-9-10-11
七、测试过程
根据测试计划的测试用例,进行测试,由于条件组合测试最为完备,因此下面采用条件组合测试的测试用例进行测试,结果如下。
条件组合覆盖
序号 | 输入(a, b, c) | 期望输出 | 满足的条件组合 | 程序流 | 测试结果 |
Case37 | 2 2 2 | 等边 | 输入合法
a>c a == b
|
1 2 3 5 6 11 | 通过 |
Case38 | 1 2 3 | 不构成 | 输入合法
a+b <= c |
1 2 4 11 | 通过 |
Case39 | -1 -2 -2 | 不构成 | 输入不合法 | 1 4 11 | 通过 |
Case40 | 3 4 5 | 直角 | 输入合法
a>c、b+c>a、a+c>b a <> b、a <> c、b <> c a*a+b*b == c*c a*a+c*c <> b*b b*b+c*c <> a*a
|
1 2 3 5 7 9 10 11 | 通过 |
Case41 | 2 2 1 | 等腰 | a>c、b+c>a、a+c>b
a == b、a <> c、b <> c a*a+b*b <> c*c a*a+c*c <> b*b b*b+c*c <> a*a 输入合法
|
1 2 3 5 7 8 11 | 通过
|
Case42 | 1 2 2 | 等腰 | a>c、b+c>a、a+c>b
a <> b、a <> c、b == c a*a+b*b <> c*c a*a+c*c <> b*b b*b+c*c <> a*a 输入合法
|
1 2 3 5 7 8 11 | 通过 |
Case43 | 2 1 2 | 等腰 | a>c、b+c>a、a+c>b
a <> b、a == c、b <> c a*a+b*b <> c*c a*a+c*c <> b*b b*b+c*c <> a*a 输入合法
|
1 2 3 5 7 8 11 | 通过 |
Case44 | 5 3 4 | 直角 | a>c、b+c>a、a+c>b
a <> b、a <> c、b <> c a*a+b*b <> c*c a*a+c*c <> b*b b*b+c*c == a*a 输入合法
|
1 2 3 5 7 9 10 11 | 通过 |
Case45 | 3 5 4 | 直角 | a>c、b+c>a、a+c>b
a <> b、a <> c、b <> c a*a+b*b <> c*c a*a+c*c == b*b b*b+c*c <> a*a 输入合法
|
1 2 3 5 7 9 10 11 | 通过 |
Case46 | 3 5 7 | 普通 | a>c、b+c>a、a+c>b
a <> b、a <> c、b <> c a*a+b*b <> c*c a*a+c*c <> b*b b*b+c*c <> a*a 输入合法
|
1 2 3 5 7 9 11 | 通过 |
Case47 | 3 2 1 | 不构成 | 输入合法
a+b <= c |
1 2 4 11 | 通过 |
Case48 | 2 3 1 | 不构成 | 输入合法
a+b <= c |
1 2 4 11 | 通过 |