1、黑盒测试(一)和白盒测试(二)实验 背景知识 结构性测试是知道产品内部工作过程,检测产品内部动作是否按照规格说明书的规定正常进行。结构性测试允许测试人员利用程序内部的逻辑结构及有关信息,设计或选择测试用例,对程序所有逻辑路径进行测试。通过在不同点检查程序的状态,确定实际的状态是否与预期的状态一致。 一、 逻辑覆盖 结构性测试力求提高测试覆盖率。逻辑覆盖是一系列测试过程的总称,它是在使用白盒测试法时,选用测试用例执行程序逻辑路径的方法。 逻辑覆盖按覆盖程度由低到高大致分为以下几类: (1) 语句覆盖:设计若干测试用例,使程序中每一可执行语句至少执行一次; (2) 判断覆
2、盖:设计用例,使程序中的每个逻辑判断的取真取假分支至少经历一次; (3) 条件覆盖:设计用例,使判断中的每个条件的可能取值至少满足一次; (4) 判断/条件覆盖:设计用例,使得判断中的每个条件的所有可能结果至少出现一次,而且判断本身所有可能结果也至少出现一次; (5) 条件组合覆盖。设计用例,使得每个判断表达式中条件的各种可能组合都至少出现一次;显然,满足⑤的测试用例也一定是满足②、③、④的测试用例。 (6) 路径覆盖。设计足够的测试用例,使程序的每条可能路径都至少执行一次。 如果把路径覆盖和条件组合覆盖结合起来,可以设计出检错能力更强的测试数据用例。 二、 基本路径测
3、试 如果把覆盖的路径数压缩到一定限度内,例如,程序中的循环体只执行零次和一次,就成为基本路径测试。它是在程序控制流图的基础上,通过分析控制构造的环路复杂性,导出基本可执行路径集合,从而设计测试用例的方法。设计出的测试用例要保证在测试中,程序的每一个可执行语句至少要执行一次。 ① 程序的控制流图 控制流图是描述程序控制流的一种图示方法。符号○称为控制流图的一个结点,一组顺序处理框可以映射为一个单一的结点。控制流图中的箭头称为边,它表示了控制流的方向,在选择或多分支结构中分支的汇聚处,即使没有执行语句也应该有一个汇聚结点。边和结点圈定的区域叫做区域,当对区域计数时,图形外的区域也应记为
4、一个区域。 ② 计算程序环路复杂性 进行程序的基本路径测试时,程序的环路复杂性给出了程序基本路径集合中的独立路径条数,这是确保程序中每个可执行语句至少执行一次所必需的测试用例数目的上界。 所谓独立路径,是指包括一组以前没有处理的语句或条件的一条路径。只要设计出的测试用例能够确保这些基本路径的执行,就可以使得程序中的每个可执行语句至少执行一次,每个条件的取真分支和取假分支也能得到测试。 基本路径集不是唯一的,对于给定的控制流图,可以得到不同的基本路径集。 通常环路复杂性可用以下三种方法求得。 *将环路复杂性定义为控制流图中的区域数。 *设E 为控制流图的边数,N 为图的
5、结点数,则定义环路复杂性为 V(G)=E-N+2。 *若设P 为控制流图中的简单判定结点数,则有 V(G)=P+1。 ③ 导出测试用例 利用逻辑覆盖方法生成测试用例,确保基本路径集中每条路径的执行。 测试用例格式(参考) 表1-2测试用例表 测试项目名称 测试人员 编制日期 测试覆盖标准 测试用例名称编号 测试数据 预期输出 实际输出 测试路径 1 2 测试结果分析 题目: A. 上图是某银行历史明细帐的查询界面。历史明细帐功能可以查询查询2年内的存折明细(不包
6、括当天)。帐号是一个16位的数字,但是后四位的和除以5总是余3。请根据所学测试用例设计方法给该功能设计测试用例 输入数据 有效等价类 无效等价类 帐号 1. 全部为数字, 16位字符, 最后四位数字的和除以5总是3 2. 有非数字存在 3. 为空 4. <16 or >16位字符 5. 最后四位数字的和除以5不一定等于5 日期 1. 起始日期与截止日期均为数字且截止日期小于20160418 为8位数字 起始日期>=20140418且截止日期<=2016 MM={1.3.5.7.8.10.12}&&{1<=DD<=31} Or MM={4,6,9,1
7、1}&&{1<=DD<=30} Or MM={2}&&{1<=DD<=28} 2. 有非数字存在 3. 为空 4. <8 or >8位字符 5. 起始日期<20140418 or截止日期>20160418 6.MM={1.3.5.7.8.10.12}&&{DD>31} Or MM={4,6,9,11}&&{DD>30} Or MM={2}&&{DD>28} 验证码 1.为1274 2. 除1274以外其他字符 密码 1. 6-12位字符, 不能有特殊符号, 不能有空格 2. <6 or >12位字符 3. 存在特殊符号 4. 为空 5. 存在空格
8、 帐号 1327483658111112 输入有效 1 47127348ifufh233 输入无效 2 输入无效 3 76876875 输入无效 4 3423432345660006 输入无效 5 日期 20150418 20160305 输入有效 1 2016oi-4 2015okij 输入无效 2 输入无效 3 201655 201699999 输入无效 4 20140318 20170505 输入无效 5 20160331 20141302 输入无效 6
9、 验证码 1274 输入有效 1 7657 输入无效 2 密码 Zhangtao1906 输入有效 1 @#$%^#&! 输入无效 2 输入无效 3 Zhnagtao 33 输入无效 4 B. 问题描述如下: 1. 程序读入三个正整数,这三个正整数代表同一三角形三条边的长度,程序根据这三个值判断三角形属于不等边,等腰,等边三角形中的一种,假定输入的三个正整数的值都是0~100。 2. 一元二次方程式
10、 AX2+BX+C=0 的求根程序有以下功能: ①.输入A、B、C三个系数; ②.输出根的性质的信息,包括两个相等或不相等的实根,或无实根 ③. 打印根的值(如有实根) 提示:时,方程的解: 或x = 。 要求: 1. 根据问题1、2的说明,画出对应的程序流程图 2. 根据边界值分析法,等价类划分法给问题1、2设计测试用例 输入数据 有效等价类 无效等价类 三角形三边分别为,x,y,z 1.x+y>z && x+z>y && y+z>x 3.0
11、
12、 b*b-4*a*c>0 4. b*b-4*a*c=0 6. a>0 && a<0 2. a,b,c均为无理数 5. b*b-4*a*c<0 7. a=0 a=2,b=5,c=2 输入有效值 1,3,6 a=1,b=2,c=1 输入有效值 1,4,6 a=√2, b=2,c=1 输入无效值 2 a=2 ,b=3 ,c=2 输入无效值 5 a=0 输入无效值 7 3. 写程序完成问题1、2的功能(语言任选) 问题1:
13、
#include 14、a!=c))) /*判断是否为等腰三角形*/
printf("构成等腰三角形\n");
else if(a==c && a==b) /*判断是否为等边三角形*/
printf("构成等边三角形\n");
else
printf("构成一般三角形!\n");
}
else
printf("请输入1-100之间的数!\n");
}
问题2:
#include 15、lf", &a, &b, &c);
result = b * b - 4 * a * c;
if (result >= 0)
{
if (result == 0)
{
root1 = (-b) / (2 * a);
printf("有两个相同的实根%.4lf\n", root1);
}
else
{
root1 = (-b + sqrt(result)) / (2 * a);
root2 = (-b - sqrt(result)) / (2 * a) 16、
printf("有两个不同的实根%.4lf和%.4lf\n", root1, root2);
}
}
else
{
printf("无实根\n");
}
}
4. 对问题1、2用白盒测试用例的设计方法(语句覆盖、判定覆盖、条件覆盖、条件组合覆盖)设计测试用例
5. 语句覆盖:
a) x=2 y=4 z=3,
b) x=1 y=1 z=3,
c) x=101 y=90 z=33,
d) x=2 y=2 z=3 ,
e) 17、x=2 y=2 z=2
6. 判定覆盖
a) x=2 y=4 z=3,
b) x=1 y=1 z=3,
c) x=101 y=90 z=33,
d) x=2 y=2 z=3 ,
e) x=2 y=2 z=2
7. 条件覆盖
a) x=2 y=4 z=3,
b) x=1 y=1 z=3,
c) x=101 y=90 z=33,
d) x=2 y=2 z=3 ,
e) x=2 y=2 z=2
8. 条件组合覆盖
a) x=2 y=4 z=3,
b) x=1 y=1 z=3,
c) x=101 y=90 z=33,
d) x=2 y=2 z 18、3 ,
e) x=2 y=2 z=2
9. 语句覆盖:
a) a=2,b=5,c=2
b) a=1,b=2,c=1
c) a=√2, b=2,c=1
d) a=2 ,b=3 ,c=2
e) a=0
10. 判定覆盖
a) a=2,b=5,c=2
b) a=1,b=2,c=1
c) a=√2, b=2,c=1
d) a=2 ,b=3 ,c=2
e) a=0
11. 条件覆盖
a) a=2,b=5,c=2
b) a=1,b=2,c=1
c) a=√2, b=2,c=1
d) a=2 ,b=3 ,c=2
e) a=0
12. 条件组合覆盖
a) a=2, 19、b=5,c=2
b) a=1,b=2,c=1
c) a=√2, b=2,c=1
d) a=2 ,b=3 ,c=2
e) a=0
13. 利用设计的程序和测试用例,使用这些测试用例进行测试,给出测试的情况。
1.
1.x = 3 y = 4 z = 5
2.x = 1 y = 1 z = 3
3.x = 101 y = 55 z = 25
4. x = 5 y = 5 z = 7
5 x = 6 y = 6 z = 6
2.
1. 20、a = 2 b = 5 c = 2
2.a = 1 b = 2 c = 1
3.a=2 b = 3 c = 2
4. a = 0 b = 2 c = 3
C.
下面是冒泡排序的程序,其中 array: 存放一组整数, n: 没 存放数组的长度。
(1) 试计算此程序段的环形复杂性;
(2) 用基本路径覆盖法给出测试路径;
1.Array为空
2.Array 非空, N = 1
3.Array 非空, N > 1, 全升序
4.Array 非空, N > 1, 全降序
5. Array 非空, N > 1, 部分升序,部分降序
21、
(3) 考虑循环嵌套,为各测试路径设计测试用例;
(4) 添加驱动程序,执行测试用例,分析结果。
bool Bubble( int* array, int n )
{ int i, j, temp;
if( !array ) return false;
for( i = 0; i < n-1; i ++)
{ for( j = 0; j < n-i-1; j ++ )
{ if( array[j] > array[j+1] )// 将较小的元素放在前面
{ te 22、mp = array[j]; array[j] = array[j+1];array[j+1] = temp;}
}
}
return true;
}
实验步骤、要求
(1)根据题目编写程序,并调试通过。
(2)根据结构性测试技术设计测试用例
1.语句覆盖
①array[10] = {}; n = 0;
②array[1] = {1}; n = 1;
③array[5] = {5, 4, 3, 2, 1}; n = 5;
④array[5] = {1, 2, 3, 4, 5}; n = 5;
⑤array[5] 23、 = {1, 3, 5, 4, 2}; n = 5;
2..判定覆盖
①array[10] = {}; n = 0;
②array[1] = {1}; n = 1;
③array[5] = {5, 4, 3, 2, 1}; n = 5;
④array[5] = {1, 2, 3, 4, 5}; n = 5;
⑤array[5] = {1, 3, 5, 4, 2}; n = 5;
3.条件覆盖
①array[10] = {}; n = 0;
②array[1] = {1}; n = 1;
③array[5] = {5, 4, 3, 2, 1 24、}; n = 5;
④array[5] = {1, 2, 3, 4, 5}; n = 5;
⑤array[5] = {1, 3, 5, 4, 2}; n = 5;
4.条件组合覆盖
①array[10] = {}; n = 0;
②array[1] = {1}; n = 1;
③array[5] = {5, 4, 3, 2, 1}; n = 5;
④array[5] = {1, 2, 3, 4, 5}; n = 5;
⑤array[5] = {1, 3, 5, 4, 2}; n = 5; 25、
(3) 根据设计的测试用例集进行测试,计算测试用例的分支覆盖率、条件覆盖率和语句覆盖率
①int array[10]; n = 0;
② array[1] = {1}; n = 1
③ array[5] = {5, 4, 3, 2, 1}; n = 5;
④ array[5] = {1, 2, 3, 4, 5}; n = 5;
⑤array[5] = {1, 3, 5, 4, 2}; n = 5;
小工具的实现实验(三)
1. 以某种语言(如C语言)的一个方法为例,试编写小工具实现一下功能
a. 分析程序自动生成控制流图
b. 计算出环形复杂度
c. 根据基本路径法生成测试用例。
2.以某种语言的为例,编写自动获得程序测试覆盖率小工具(利用程序插装等原理)。如对于某个程序,运行了测试用例以后能给出测试覆盖率等情况。






