1.12k likes | 1.34k Views
第四部分 白盒测试. 结构流分析 程序结构分析 数据流分析 控制流分析 逻辑覆盖:语句覆盖、判定覆盖、条件覆盖、 判定 — 条件覆盖、路径覆盖等 程序插桩:方法简介、断言语句 其他白盒测试简介. 如图显示某程序的逻辑结构。试为它设计足够的测试用例,分别实现对程序的判定覆盖、条件覆盖和条件组合覆盖。. 如图显示某程序的逻辑结构。试为它设计足够的测试用例,分别实现对程序的判定覆盖、条件覆盖和条件组合覆盖。. A>0 and B=0.
E N D
第四部分 白盒测试 结构流分析 程序结构分析 数据流分析 控制流分析 逻辑覆盖:语句覆盖、判定覆盖、条件覆盖、 判定—条件覆盖、路径覆盖等 程序插桩:方法简介、断言语句 其他白盒测试简介
如图显示某程序的逻辑结构。试为它设计足够的测试用例,分别实现对程序的判定覆盖、条件覆盖和条件组合覆盖。如图显示某程序的逻辑结构。试为它设计足够的测试用例,分别实现对程序的判定覆盖、条件覆盖和条件组合覆盖。 如图显示某程序的逻辑结构。试为它设计足够的测试用例,分别实现对程序的判定覆盖、条件覆盖和条件组合覆盖。 A>0 and B=0 S1 S2
最少测试用例计算 众所周知,结构化程序是由3种基本控制结构组成的: 顺序型-构成串行操作; 选择型-构成分支操作; 重复型-构成循环操作。 为了把问题简化,避免出现测试用例太多的组合,把构成循环操作的重复型结构用选择结构代替,只对循环体检验一次。这样,任一循环便改造成进入循环体或不进入循环体的分支操作了。 在做了以上简化循环的假设以后,对于一般的程序控制流,只要考虑选择型结构。
P A 选择型 B 顺序型 当P S 直到P N-S图表示的基本控制结构 Y N C D S DOWHILE型 DOUNTIL型
最少测试用例计算 例1:两个串行分支结构的N-S图 P1 Y N 最少测试用例 2×2=4 a b P2 Y N d c
例2:最少测试用例计算 1 Y N 2 Y N 3 Y N 4 Y N 5 Y N 6 Y N 7 Y N 8 Y N 9 Y N
条件测试路径选择 • 当程序中判定多于一个时,形成的分支结构可以分为两类:嵌套型分支结构和连锁型分支结构。 • 对于嵌套型分支结构,若有n个判定语句,需要n+1个测试用例; • 对于连锁型分支结构, 若有n个判定语句,需要有2n个测试用例,覆盖它的2n条路径。当n较大时将无法测试。
§3 路经分析 • 着眼于路径分析的测试为路径测试; • 完成路经测试的理想情况时做到路径覆盖; • 一、路径表达式和路径数 • 可用弧序列或节点序列表示某一条具体路径。给出路径通式时用弧序列表示。 • 1、路径表达式 • 路径表达式有两个运算符:相乘和相加
§3 路经分析 • (1)弧a和弧b相乘,表示为ab,它表明路径是实现经历弧a接着再经历弧b,弧a和弧b是先后相继的。 • (2)弧a和弧b相加,表示为a+b,它表明弧a和弧b是并立的(或的关系),即两条路径是并行关系。 • 举例:pg53
§3 路经分析 • (3)运算规律 • 加法交换律 • 加法结合律 • 加法幂等律 • 乘法结合律 • 分配律 • 对路径表达式化简
§3 路经分析 • 2、路经数计算 • 将路径表达式中的弧都用数字1代入,然后,按照相乘、湘价计算出数值,即为该程序的路径数。 • 注:程序的圈复杂度和路径数有着直接的关系
§3 路经分析 • 二、基本路经测试 • 如果一个程序的独立路径都被测试过,那么可以认为程序中的每个语句都以检验过了,也就达到了语句覆盖,这种方式就是基本路经测试方法。 • 独立路经测试——基本路经测试 复习:独立路径的概念
§3 路经分析 • 举例: • 要求:最多输入100个值(以-999为输入结束标志),计算落在给定范围内的那些值(成为有效输入值)的个数、总和和平均值。 • 下面的程序片断为主程序调用的求平均值的函数average(),变量sum为总和,total为有效值的个数,两者都为全局变量。 • 主程序main()完成数据输入(调用时传给value数组)及平均值、总和、有效值个数的输出。
§3 路经分析 • 具体步骤 • (1)根据程序给出流图; • (2)确定圈复杂性度量V(G); • (3)确定独立路径集; • (4)为每个独立路径的执行,设计测试用例
§3 路经分析 分析:确定每个节点代表的程序 复习while 语句的流图框架
§3 路经分析 (1)流图 考虑符合条件中的单个条件
§3 路经分析 • (2)圈复杂性V(G) • V(G)=6 (围成的区域数) • V(G)=17(边)-13(节点) +2=6 • V(G)=5(判定节点)+1=6
§3 路经分析 • (3)六条独立路径 • 路径1 1-2-10-11-13(aloq) • 路径2 1-2-10-12-13 • 路径3 1-2-3-10-11-13 • 路径4 1-2-3-4-5-8-9-2…… • 路径5 1-2-3-4-5-6-7-8-9-2….. • 路径6 1-2-3-4-5-6-8-9-2……
§3 路经分析 • (4)设计测试用例 • 路径1 1-2-10-11-13(aloq) • 执行的条件情况: • 节点2,条件value(I)!=-999为假; 程序结束以输入-999退出while 循环 • 节点10,条件total>0为真 要求有有效的输入数据。 假如最大值为maximum,如150; 最小值为minimum,如22
§3 路经分析 • 可如下设计一组测试用例数据,如5个数,分别是:12,26,58,160,-999 • 期望结果是: 平均值:42 总和:84 有效值个数:2 • 通用的测试用例表示: • Value(k)=有效输入,k<I • Value(i)=-999,2<=I<=100 输入I个值,I大于2,小于100。最后一个值value(I)为-999,I个值中一定有有效值,如,第k个值。
§3 路经分析 • 路径2 1-2-10-12-13 • 执行的条件情况: • 节点2,条件value(I)!=-999为假; 程序结束以输入-999退出while 循环 • 节点10,条件total>0为false,即输入的一组数据中没有一个是有效值。 假如最大值为maximum,如100; 最小值为minimum,如22
§3 路经分析 • 可如下设计一组测试用例数据,如5个数,分别是:12,21,158,160,-999 • 期望结果是: 平均值:-999 总和:0 有效值个数:0 • 通用的测试用例表示: • 任何Value(k)都为无效输入,k<I • Value(i)=-999,2<=I<=100 输入I个值,I大于2,小于100。最后一个值value(I)为-999,I个值中没有一个有效值。
§3 路经分析 • 路径3 1-2-3-10-11-13 • 执行的条件情况: • 节点2,条件value(I)!=-999为真; 程序以输入-999退出while 循环 • 节点10,条件total>0为真,即输入的一组数据中至有一个是有效值。 • 节点3,inputnum<100为假,程序以输入数据超过100个,退出while 循环。 假如最大值为maximum,如150; 最小值为minimum,如22。
§3 路经分析 • 测试用例设计: • 试图输入101个数或更多,数中没有-999,前100个数中至少有一个是有效数。 • 期望结果:计算100个之后,程序应结束,期望的平均值、有效值总数、平均值根据前100个值中的有效值计算。
§3 路经分析 • 课堂作业(小测验): • 假如输入个数最多为10个,请为本题的独立路径4、5、6涉及具体的测试用例,并给出期望结果。
§3 路经分析 三、循环测试路径选择 • 循环分为4种不同类型:简单循环、连锁循环、嵌套循环和非结构循环。 (1) 简单循环 ① 零次循环:从循环入口到出口 ② 一次循环:检查循环初始值 ③ 二次循环:检查多次循环 ④ m次循环: 检查在多次循环 ⑤ 最大次数循环、比最大次数多一次、少一次的循环。
例:求最小值 k = i; for ( j = i+1; j <= n; j++ ) if ( A[j] < A[k] ) then k = j;
a c j<=n b e k=j j++
(2)嵌套循环 ① 对最内层循环做简单循环的全部测试。所有其它层的循环变量置为最小值; ② 逐步外推,对其外面一层循环进行测试。测试时保持所有外层循环的循环变量取最小值,所有其它嵌套内层循环的循环变量取“典型”值。。 ③ 反复进行,直到所有各层循环测试完毕。
④ 对全部各层循环同时取最小循环次 数,或者同时取最大循环次数 (3)连锁循环如果各个循环互相独立,则可以用与简单循环相同的方法进行测试。但如果几个循环不是互相独立的,则需要使用测试嵌套循环的办法来处理。 (4) 非结构循环这一类循环应该使用结构化程序设计方法重新设计测试用例。
Z路径覆盖下的循环测试策略 简化循环意义下的路径覆盖称为Z路径覆盖 循环简化的含义是限制循环的次数。无论循环的形式和循环体实际执行的次数,简化后的循环测试只考虑执行循环体1次和0次(不执行)两种情况。 一旦循环结构简化为选择结构后,路径的数量将大大减少,通过枚举的办法得到所有的路径是完全有可能的。 简化后的选择结构 两种典型循环结构
例:输入一行字符,分别统计出其中英文字母、空格、数字和其他字符的个数。程序如下,请按路径分析方法设计测试用例。例:输入一行字符,分别统计出其中英文字母、空格、数字和其他字符的个数。程序如下,请按路径分析方法设计测试用例。 要求:1、画出流图;2、分析复杂性;3、给出独立路径;4、设计测试用例。 #include”stdio.h” main() { char c; int letters=0,space=0,digit=0,other=0; printf(“请输入一行字符:\n”); while((c=getchar())!=’\n’) { if(c>=’a’&&c<=’z’||c>=’A’&&c<=’Z’) letters++; else if(c==’ ’) space++; else if(c>=’0’&&c<=’9’) digit++; else other++ } printf(“其中:字母数=%d空格数=%d 数字数=%d 其它字符数=%d\n”,letters,space,digit,other); }
1、流图; #include”stdio.h” main() { char c; int letters=0,space=0,digit=0,other=0; printf(“请输入一行字符:\n”); while((c=getchar())!=’\n’) { if(c>=’a’&&c<=’z’||c>=’A’&&c<=’Z’) letters++; else if(c==’ ’) space++; else if(c>=’0’&&c<=’9’) digit++; else other++ } printf(“其中:字母数=%d空格数=%d 数字数=%d 其它字符数=%d\n”,letters,space,digit,other); } 1 2 4 3 5 6 7 8 9 10 11
a while 语句 n c b 为字母 e d 为空格 g h 为数字 f j k 1 i 其它 l m 2 3 5 4 6 7 9 8 10 11
序号 测试用例 覆盖独立路径 预期结果 备注 1 输入空串 ab 输出结果都为0 2 输入“ab……” acdfn…… 正确给出字符个数 3 输入“a……” acegin…… 正确给出空格个数 4 输入“8……” acehjln…… 正确给出数字个数 5 输入“#……” acehkmn…… 正确给出其他字符个数 (2)复杂性为:5 (3)独立路径为: ①ab ②acdfn…… ③acegin…… ④acehjln…… ⑤acehkmn…… (4) 测试用例为
给出如下一段程序,按照条件覆盖、分支覆盖、条件/分支覆盖、条件组合覆盖给出测试用例。给出如下一段程序,按照条件覆盖、分支覆盖、条件/分支覆盖、条件组合覆盖给出测试用例。 y a>2 and b<>1 x=a+2 n y x<6 n Y=x+b
x a b a>2 and b<>1 x<6 执行路径 3 3 2 T T 6 2 1 F F x a b a>2 b<>1 x<6 执行路径 3 3 2 T T T 6 2 1 F F F x a b a>2 and b<>1 x<6 a>2 b<>1 执行路径 3 3 2 T T T T 6 2 1 F F F F (1)分支覆盖 (2)条件覆盖 (3)条件/分支覆盖
(4)条件组合覆盖 a>2 记t1 b<>1 记t2 x<6 记t3 每个判定可能的条件有:(1)t1 t2,(2)t1 ~t2,(3)~t1 t2,(4)~t1 ~t2 (5)t3 (6)~t3 设计4个测试用例,覆盖以上6种条件组合
测试用例 x a b 覆盖组合 覆盖条件 执行路径 1 6 3 2 1,5 t1 t2 t3 2 4 3 1 2,5 t1~t2t3 3 7 2 2 3,6 ~t1t2 ~t3 ~t1~t2 ~t3 4 7 2 1 4,6
四、路径分析基本路径测试归纳 • 基本路径测试方法把覆盖的路径数压缩到一定限度内,程序中的循环体最多只执行一次——独立路径覆盖。 • 它是在程序控制流图的基础上,分析控制构造的环路复杂性,导出基本可执行路径集合,设计测试用例的方法。设计出的测试用例要保证在测试中,程序的每一个可执行语句至少要执行一次。
§4 程序插桩 • 程序插桩(program instrumentation)是一种基本的测试手段,在软件测试中有着广泛的作用。 • 一、方法简介 • 程序插桩方法简单的说是借助于往被测程序中插入操作来实现测试目的的方法。 • 以计算整数X和Y的最大公约数程序为例,说明插桩方法的要点。
§ 4 程序插桩 在程序入口处插入对计数器C(i)的初始化语句 图中的虚线框并不是原来的内容,而是为了纪录语句执行次数而插入的。这些虚线框要完成的工作都是计数语句。 C(i)=C(i)+1 在程序出口处加入打印语句 即构成完整的插桩程序
§ 4 程序插桩 1、2需结合具体的问题解决 • 二、设计程序插桩时序考虑的问题 • (1)探测哪些信息? • (2)在程序的那些地方设置探测点; • (3)需要设置那些探测点。 可根据控制结构考虑 在没有分支结构的程序段只需一个插桩语句
§ 4 程序插桩 • 三、断言(assertions)语句 这里仅对断言做一个简单的说明,以后我们还要进一步讨论