1、,黑盒测试 zr 希望大家提供一些待测函数/功能点(函数需求说明书 / 功能点说明书)。课堂练习需要。 可以是以前的课程当中写过的,C,数据结构,JAVA等课程中,做过的实验或课设、课本上的。也可以自己联想现实的软件,有哪些函数或功能点。比如,排序算法类,字符串处理类,走炮分析函数(棋牌类),NextDate,三角形软件。 下课时告诉我,或者发邮件 。,请帮忙,有合适的函数,加一次平时互动分。,输入是什么,输出是什么 功能点,或者需求说明书,实验五科技楼 测试二室周二/三下午 5-6节。第7节在教室上课。上机时,第2节课开始后,实验完成一部分的,可以给我检查。检查后继续完成实验,第7节课回到教
2、室上课。,白盒测试,路径测试 循环测试 变量测试 静态白盒测试 白盒测试总结实验五 和一些题目,路径测试,程序图压缩后的控制流图每个节点代表连续的语句段每条有线边表示程序执行的分支走向(控制流)程序图能够反映出所有的执行路径A 判定节点,有e1 e2 两个分支 B e4 C e3 是一个循环体,路径数量有多少种?,路径测试,程序中,判定和循环,会导致程序执行产生分支,增加程序的路径数量。当代码中,有多个判定和循环时,形成串联、嵌套等多种形式,路径数目会非线性快速增长,则难以覆盖所有可执行路径。基路径法为了降低测试风险,需要找到一批典型路径;通过测试典型路径,达到对全部可执行路径的测试覆盖。,路
3、径测试,构建程序图的方法1) 连续的串行语句压缩为一个节点因为连续,不存在分支,且重点关注程序结构2) 所有循环次数只考虑一次循环忽略循环次数,仅简单考虑是否执行循环体两种情况 computeNextDate() 的程序图代码P114 看看代码和程序图 P137,路径测试,环复杂度是一种程序结构复杂度的度量模型随着判定节点的增加,判定节点的分支会导致增加程序图中的封闭环区域。思想:依据判定节点对程序图的封闭环数目造成的影响来衡量程序的复杂程度。因而,通过封闭环的数量估计程序的结构复杂性。,路径测试,计算环复杂度直观观察法:程序图将二维平面分隔为封闭区域和开放区域的个数封闭区域有 4个外部的开放
4、区域 1个环复杂度为 5,路径测试,计算环复杂度图中边数 e,节点数 n计算公式 V(G) = e n + 1要求:没有孤立点;且双联通。任意两个节点 I J 之间,存在从I 到 J 和从J 到 I 的两条有向路径。如 B-C,C-B然而有 A-E ,没有E-AC D之间没有路径,路径测试,改造程序图在程序出口节点G处增加一条指向程序入口节点的有向边e11强制生成一个循环这样任意两节点间都满足联通E-A C-D D-C 都有路径 V(G) = e n + 1 = 11 7 + 1 = 5,其他课本上的公式可能为V=e-n+2,其中 e 不含附加的虚线分支,计算 compute NextDate
5、 的环复杂度 P137,路径测试,计算环复杂度判定节点法 V(G) = P + 1P为 2 分支的判定节点数ABCD 4个节点对于一个 switch 节点,含有n个分支,应视为 n-1 个独立判定节点 P132 多出口程序(含多个return),路径测试,基路径测试法 程序的路径组合数量很大对于一段包含循环和多个串联判定结构的代码,可执行路径数量很多,测试所有路径的工作量大 137.png测试的完备性和无冗余性难以达到等价类法 等价划分 将数据空间分为多个等价类 基路径法原理:将全体路径集合看作一个向量空间,从中抽取一组线性无关的独立路径,作为一组向量基,路径测试,基路径测试原理:将全体路径集
6、合看作一个向量空间,从中抽取一组线性无关的独立路径,作为一组向量基基于线性基的理论,其它所有路径则与这组向量基路径有相关性,均可由这组路径的某种组合方式来表示。因而,选择这组有效的独立路径进行测试,放弃测试大量的其他路径。 完备性:通过对独立路径的测试达到对所有路径的测试覆盖 无冗余性:每条路径都是独立的,针对每条路径设计的用例之间不存在冗余,路径测试,核心问题: 确定独立路径集合的规模 如何从整个路径集合中抽取独立路径的集合抽取独立路径的原则:任意两条路径线性无关所有独立路径的并是整个向量空间,路径测试,如何确定独立路径集合的规模按照环复杂度概念,对于指定的程序图,对路径的测试中,所需独立路
7、径集合的大小就等于其程序图的环复杂度右图 环复杂度 5 节点不多 7个,程序图分布复杂 computeNextDate()环复杂度 6节点多 17个,但环复杂度不高,路径测试,独立路径集合 首先选择基础路径选择一条最复杂的路径1) 该路径应包含尽可能多的判定节点(条件判定和循环判定)2) 应包含尽可能复杂的判定表达式(与或关系)3) 应对应尽可能高的执行概率(业务情况的重要性)4) 应包含尽可能多的语句,路径测试,右图,选择主路径思考判定节点有:A B C D 4个主路径 A - B - C - G,哪些是判定节点?,路径测试,根据主路径抽取其他独立路径依次在主路径上的每个判定节点处,执行一个
8、新的分支,构建一个新的独立路径。直到找到足够的独立路径数,即独立路径数等于程序图的环复杂度。 主路径 Ae1 - Be4 Ce9 - G路径2 A -e2- D - E - F - G路径3 A - B -e5- E - F - G路径4 A - B - C -e3- B - C - G,路径测试,根据主路径抽取其他独立路径主路径 A - B - C - G当主路径上,所有的判定节点的每个分支已经覆盖,却未达到独立路径集数量时,须检查程序中尚未完全覆盖的判定分支,构建新的独立路径。路径5 判定节点 D 分支 e7A - D -e7- F - G,路径测试,测试用例设计 根据程序源代码生成程序图
9、 计算程序图的环复杂度,确定独立路径集合的大小 以最复杂的路径为基础路径,通过覆盖所有判定分支确定其他路径,抽取独立路径集合 根据得到的路径集合对应设计测试用例注意剔除不可行路径,必要时补充其他重要的路径,路径测试,测试实践 computeNextDate() 函数环复杂度 6判定节点 6 8 12 18 21 独立路径 A, 6, 8, 12, 13, 16, 18, 20, 21, B, 34, 35 路径2 A, 6,e2, 7, 16, 18, 20, 21, B, 34, 35,路径测试,判定节点 6 8 12 18 21 独立路径 A, 6, 8, 12, 13, 16, 18,
10、20, 21, B, 34, 35 路径3 A, 6, 8,e5, 9, 16, 18, 20, 21, B, 34, 35 路径4 A, 6, 8, 12,e9, 15, 16, 18, 20, 21, B, 34, 35,路径测试,判定节点 6 8 12 18 21 独立路径 A, 6, 8, 12, 13, 16, 18, 20, 21, B, 34, 35 路径5 A, 6, 8, 12, 13, 16,18,e14, 33, 34, 35 路径6 A, 6, 8, 12, 13, 16, 18, 20, 21, e17, 28, 34, 35,路径测试,不可行路径程序设计中,有的路径
11、实际上不可能执行完成。主要原因:前后判定表达式的多个简单条件之间存在一定的关联性,其取值互相约束,导致部分路径不可行。 节点6的 e3分支(节点6 8间),对应month为 2, 4 6 9 11此时不可能执行 节点21的 e16分支(节点21 B),即12月情况path 1 3 4 都不可行。,不可行分支将增大测试难度,提高引入缺陷的风险。 写代码时,应尽量减少或避免前后判定之间的关联,路径测试,不可行分支e16分支(21 B节点),要求e2分支(6 7节点)Path1:A, 6, 8, 12, 13, 16, 18, 20, 21, B, 34, 35 Path2:A, 6, 7, 16,
12、 18, 20, 21, B, 34, 35Path3:A, 6, 8, 9, 16, 18, 20, 21, B, 34, 35Path4:A, 6, 8, 12, 15, 16, 18, 20, 21, B, 34, 35Path5:A, 6, 8, 12, 13, 16, 18, 33, 34, 35Path6:A, 6, 8, 12, 13, 16, 18, 20, 21, 28, 34, 3521 e16 B,修改为 21 e17 28修改后Path1 与 Path6 相同了,修改后,只有5条路径,缺少一条,继续补充路径以保证完备性,路径测试,补充路径 1) 补充执行概率较高的路径
13、2) 补充可能包含严重缺陷的路径 3) 补充涉及复杂算法的路径本例主要考虑 1) ,补充 Path6 e2 e14 56.38%,大月普通日期Path7 e3 e5 e14 32.26%,小月普通日期Path8 e3 e6 e9 e14 6.05%,2月普通日期,P1P5 对应各种月末,执行概率的总和约3%,路径测试,设计用例每条路径至少设计一个测试用例 P139,路径测试,小结 基路径测试主要关注:因条件判定和循环带来的路径爆炸问题,目的是要达到路径测试的完备和无冗余。根据程序图的环复杂度,以一条最复杂的基础路径为基准,抽取一组独立路径。 良好的程序设计编写代码当中需要注意,避免表达式之间的
14、关联性,尽量有效减少和避免不可行路径。代码设计应简单,保持程序的环复杂度不超过10,可降低植入缺陷的概率。,路径测试,补充:分支覆盖(即判定覆盖)与基路径覆盖 程序的需求:输出应等于输入 分支覆盖可以是这两个用例 (0, T,T,T; 0) (1, F,F,F; 1),int returnInput(int x, bool b1, bool b2, bool b3)if (b1) x+; if (b2) x-; if (b3) x=x; return x; ,分支覆盖常会错过与判定结构和判定决策交互相关的bug 100%覆盖率不代表测试完全,bug在哪里?,画程序图,路径测试,共有 23种决策
15、组合分支覆盖错过了函数中的一些可能路径。实际上 2n 很大(n=10, 1024)测试各种组合不可行 基本路径覆盖环复杂度4,需要选择四条线性无关的独立路径主路径 TTT,路径2 FTT,路径3 TFT,路径4 TTF。路径2 和路径3 发现 bug。,if (b1) x+; if (b2) x-; if (b3) x=x; return x;,路径测试,基路径的作用与判定覆盖不同,基本路径覆盖可以确保对所有相互独立的分支结果进行测试。即对于一条新的独立路径,所有前面判定节点的分支(决策结果) 不变。从而能够有助于了解 改变一个判定决策对函数的行为的影响。如果选择 FFF 作为主路径,独立路径
16、集 FFF、TFF、FTF、FFT ,与 TTT 路径无关。两个路径集都同样有效,任何一个都可以覆盖所有的相互独立分支,1TTT TTT TTT 2FTT 3TFT 4TTF,白盒测试,路径测试 循环测试 变量测试,循环测试,循环程序中常见且重要的结构绘制B样条曲线的代码 P1491) 循环次数的边界错误2) 重复多次循环可能会内存泄露3) 循环内部的计算处理不正确或有误差 测试原理:关注循环过程的正确性对循环次数的边界和循环体的执行过程进行测试,循环测试,单个循环节点循环次数的测试循环过程的测试 测试循环次数尽量测试循环次数的所有典型情况次数的边界:0次,循环 0次(不执行循环体);1次,循
17、环1次,2次;多次 n(预测最大可能的次数 );正常典型值(通常为最大次数的一半) ,约 n/2,循环测试,尽量测试循环次数的所有典型情况。 代码1:i 和 iter 的取值决定循环的次数 iter 1, 执行循环 可取 iter = 1, 2,3, 10代码2:输入 “”, ”a”, “c9” “d6e5a5c12d” 如果 hexnum 为int类型,则会溢出,预期输出和实际输出不符,void Func10( int iter ) for( int i = 1; i iter ; i+ ) ,while(c=getchar() !=EOF) 16进制数转换为数值 hexnum,循环测试,测
18、试循环过程1) 循环变量 for(i = 1; i n; i+)循环变量的初值设置是否正确,会影响到循环次数。循环变量的增量是否正确;循环变量的终止条件是否存在边界错误,即循环变量的最大值是否正确。,针对循环过程的测试并非典型的动态测试过程, 也包含静态检查和调试,循环测试,测试循环过程2) 循环迭代测试循环体内部包含的语句执行过程中,重要变量的取值是否按预期规律发生变化,其取值是否正确;多次循环是否导致误差累积;是否对内存造成压力;是否有continue, break 等语句,造成复杂的循环过程,如跳过某些代码,会增加代码的风险。,循环测试,循环结构串联 嵌套 非结构化,循环测试,多个循环节
19、点 串联1) 前后循环的判定节点相互独立,则分别单个测试2) 前后循环的判定节点相互关联时,存在一定的复杂性和不确定性。还需要结合对数据变量的测试来做补充测试。,循环测试,多层循环嵌套判定节点相互独立时,按照由内向外的次序,先测试最内层的循环体;然后逐步测试最外层的循环体。测试每层循环体时,根据单个循环的方法测试并考虑4种特殊组合(边界情况),测试其计算结果:内层最小循环次数,外层最小(最大)次数内层最大循环次数,外层最小(最大)次数,嵌套结构里面,节点2和节点3的循环次数常会有关联性,循环测试,非结构化非结构化循环测试难度大,通常难以测试好需重新设计成结构化的程序,测试实践:冒泡法排序 代码
20、 Bubble.docx具有两个循环体,为嵌套结构。两个节点的次数有关联性,n-1, (i=0,1,2,n-2)n-1-i 次循环次数由变量 n 决定内部有 if 判定,多种路径,循环测试,循环测试,n-1, n-1-i 次 循环0次n=1,数组中只有1个元素i j 均不循环,无需排序用例1:n=1 pArray = 5输出: pArray = 5,循环测试,n-1, n-1-i 次(i=0,n-2) 循环1次n=2,数组有2个元素i j 均执行 1次循环,进行 1次数值比较完成排序需考虑判定测试用例2:n=2, pArray = 6,5用例3:n=2, pArray = 5,6 输出均为:p
21、Array = 5,6,循环测试,两层循环 n-1, n-1-i 次(i=0,n-2) 循环多次次数由变量 n 决定用例:n=5pArray = 6,8,2,7,5输出: pArray = 2,5,6,7,8外层 n-1, (i=0,1,2,n-2) k=n-1内层 k-0 次,k-1 次, k-i次 ,2次,1次,循环测试,嵌套多循环每层测试的4种特殊组合内层最小循环次数,外层最小(最大)次数内层最大循环次数,外层最小(最大)次数用例:n=5,pArray =6,8,2,7,5 可通过调试查看4种情况,输入:pArray =6,8,2,7,5 其中,i=0时,内层最大 k-0,在i=1前加断
22、点,调试 即对应,外层最小,内层最大时, 进行了一次冒泡, 输出:pArray =6,2,7,5,8,白盒测试,路径测试 循环测试 变量测试,变量测试,程序运行控制流运行路径判定节点、独立路径集、典型循环次数数据流变量赋值、数值计算和处理等变量、常量、数组、数据结构键盘和鼠标的输入、手机触摸屏文件、网络等设备的输入输出等,变量测试,次边界源代码内部的边界比如 16进制字符串“d6e5a5c12d” 转换为具体数值,可能会溢出 ASCII表比如文本框只接受英文字母 ABZabz 代码中 2的幂某通信协议支持256条命令,最常用的15条命令用4个Bit表示。为了更快的通信,对常用命令发送 4个Bi
23、t,对一般命令发送8个Bit。边界 14 15 16 254 255 256,依据业务特性,仔细检查代码,查找次边界条件,设计测试用例,变量测试,计算公式计算本息总和的公式 A = P(1 + r / n)nt, n = 0 出错如果 n 是另一项计算的结果,或者根据用户的输入来设置 n的取值。在程序运行时,调试观察变量的中间数据。根据观察结果更改某些测试用例,取得感兴趣的、有风险的中间值。,测试员需要考虑有没有n值为0的情况出现,什么输入会导致它取0。,变量测试,对变量的测试重点关注代码中:1) 计算复杂的变量2) 计算结果对函数返回值影响最大的变量3) 最有可能出错的变量数据流测试法思路:
24、判断某被测变量的运行路径的风险性;风险高的路径需要重点进行考察和测试。,变量测试,数据流测试法重点关注:变量在使用之前被多次定义(多次赋值)这种情况含有缺陷的风险高。,1 a = 1; 2 while( t1 ) 3 if( t2 ) 4 b = a * a; 5 a = a 1; 6 7 8 9 printf( “a = %d, b = %dn”, a, b );,变量测试,数据流测试分析源码中,变量使用前被定义的次数相关概念定义节点:变量 v 的值在语句 n 处发生改变 DEF(v,n)使用节点:变量 v 的值在语句 m 处使用 USE(v,m)节点对:变量 v 的任一DEF(v,n) 和
25、任一 USE(v,m) 构成的二元组。,变量测试,相关概念定义使用路径:从 DEF(v,n) 开始执行,到 USE(v,m) 结束的一条路径,记做 du-path。需要判断每条路径是否为高风险的路径,即变量在使用前是否被多次定义。定义清除路径:如果定义使用路径中不包含关于 v 的其他定义节点,则该路径称为定义清除路径,记做dc-path。清除路径的变量在使用前,只定义了一次。一般风险低,无需重点测试。,变量测试,案例代码:变量 a 定义节点 1 5,使用节点 4 5 7路径 path1-4, path1-5, path1-7path5-4, path5-5, path5-7,1 a = 1;
26、2 while( t1 ) 3 if( t2 ) 4 b = a * a; 5 a = a 1; 6 7 x=a; 8 9 printf( “a = %d, b = %dn”, a, b );,变量测试,测试方法 确定需要重点测试的变量 v 找出 v 的所有定义节点和使用节点 确定 v 的所有 du-path (定义/使用路径) 判断每条路径是否为高风险路径,变量测试,考察每条路径path1-4: 1,2,3,4path1-5: 1,2,3,4,5path1-7: 1,2,3,4,5,6,71,2,3,6,7语句5 a = a 1; 实际上可以分为先使用,后定义的两句汇编代码,dc-path,
27、风险高,节点7使用 a 之前,a 有两次定义。 path 1-7 需要重点关注和测试。,定义节点 1 5,使用节点 4 5 7,变量测试,考察每条路径path5-4: 5,6,7,8,2,3,4path5-5: 5,6,7,8,2,3,4,5 path5-7: 5,6,7 都是 dc-path,一般无需测试语句5 a = a 1; 实际上可以分为先使用,后定义的两句汇编代码path5-5 退化情况,不关注,定义节点 1 5,使用节点 4 5 7,白盒测试,路径测试 循环测试 变量测试 静态白盒测试,静态白盒测试,静态测试 检查、分析和审核。静态测试能尽早地发现需求分析、软件设计的问题,且能有效
28、地检查代码。 嵌入式软件领域2006年,静态测试的比重达 45.6%。2009年,比重已经超过动态测试,达到54%。原因在于业界想尽早进行测试,尽量降低成本;也得益于静态测试的扫描工具比较高效、稳定和容易执行。,静态白盒测试,静态白盒测试小组会议中,有条理地仔细审查软件设计、体系结构和源代码,从而找出软件缺陷的过程。主要目的:尽早发现缺陷,以找出动态测试难以发现或隔离的bug。 开发初期,测试小组集中精力进行软件设计的审查非常有价值。白盒测试也为黑盒测试员提供测试重点,及寻找软件潜在缺陷的思路。,静态白盒测试,主要检查方式代码检查、走查以3-5人小组会议的方式来阅读及直观检查特定的代码。适用于
29、每个模块编码结束时,或者程序编码结束时。目标:找出代码中的错误,不必考虑改正错误的方法。时间:90-120分钟,每小时少于300-500行以内的代码。,据统计,代码中60%以上的缺陷可以通过代码审查发现出来,静态白盒测试,代码检查 Inspection 检查小组协调人称职的程序员(非作者)。负责安排进程,检查中起主导协调作用,记录发现的缺陷。还有作者、一名设计人员,以及一名测试员。测试员应具备较高的软件测试水平,并熟悉大部分的常见编码错误。检查之前几天,小组成员熟悉代码和设计规范。,静态白盒测试,检查过程1) 由作者逐条语句讲解程序的逻辑结构。小组其他成员通读代码,提问题、判断检查是否存在错误
30、。2) 参考常见的编码错误检查表来分析代码。通常能发现30%70%的逻辑设计和编码错误,且无需调试定位。 协调确保会议高效进行,集中精力查找缺陷,而不是修正错误。对事不对人。,交流编码技术和风格、算法等方面;获取预防缺陷的经验;交流感情,团队凝聚力。,静态测试 与 动态测试 各自擅长于发现不同类型的Bug,有互补性。,静态白盒测试,代码走查 WalkThrough 代码走查与检查类似小组会议阅读代码,并参考错误检查列表 特点:使用了“计算机”,即测试员会带来一些代表性的书面测试用例。会议期间,小组演算每个测试用例。在黑板上记录变量和程序状态,用例沿着程序的逻辑结构走一遍。作用:启动代码走查的手
31、段,作为怀疑程序逻辑思路、设想与计算错误的参照。,很多问题是在向程序员提问的过程中发现的,而非测试用例本身直接发现的,静态白盒测试,检查表 Checklist 通用代码审查清单数据引用错误数据声明错误计算错误比较错误入口和出口的连接存储器的使用,控制流程错误子程序参数错误输入输出错误逻辑和性能维护性和可靠性,数组和字符串的下标是否是整数?是否在范围之内? 变量是否被赋予了不同类型的值? 为引用的指针分配内存了吗?,计算中,是否使用了不同数据类型的变量? 数值计算过程中,是否可能出现溢出? 复杂表达式中计算次序是否正确,运算优先级对吗?需要加括号更清晰些?,静态白盒测试,修改后的程序实际中,修改
32、现有的程序比写新程序更容易产生错误,因而也需要进行代码审查、走查。其他形式的检查桌面检查/同事审查,白盒测试,路径测试 循环测试 变量测试 静态白盒测试 白盒测试总结实验五,白盒测试,白盒测试需要分析程序的结构和实现的细节主要运用在单元测试和集成测试阶段,主要由开发小组承担测试任务。 综合使用策略1) 优先进行静态白盒测试特别对于重要、核心的功能模块,应定期组织严格的评审2) 测试工具尽量利用测试工具完成代码结构和质量的相关分析和评估,从而优化代码结构,白盒测试,3)选择合理的测试覆盖指标针对判定节点、路径和循环,选择合理的覆盖指标,设计测试用例4) 关键变量使用数据流测试法确定补充重要的测试
33、路径5) 结合边界抽取测试数据判定表达式、循环次数、变量取值范围等的边界6) 针对黑盒测试检查不到或难以检查的地方,使用特殊的白盒测试方法(如内存泄露测试)进行补充,可以用白盒覆盖指标,评估黑盒测试用例集是否存在漏洞和冗余 P159,白盒测试,白盒方法的局限性实际上,基于源代码,难以查出代码违反设计规范的地方;难以发现没有实现的功能需求。判断软件的整体行为是否完全符合客户的实际需求需要黑盒测试,白盒测试,白盒可衡量覆盖度。早期通过白盒测试,可以尽早发现部分缺陷,降低修复成本。能有效解决编码阶段引入的问题,如果遗留到系统测试阶段,就很难去发现、去定位。 黑盒从用户角度出发,根据需求规格书,针对程
34、序接口或用户界面测试。主要测试整体系统的行为,更适合系统的功能测试。当然单元测试、集成测试中也需要黑盒测试。,白盒测试,路径测试 循环测试 变量测试 静态白盒测试 白盒测试总结实验五 和练习题,课堂作业,白盒测试也称结构测试或逻辑驱动测试,典型的白盒测试方法包括静态测试和动态测试。其中,静态测试除了静态结构分析法、静态质量度量法外,还有_ A代码检查法 B逻辑覆盖法 C基本路径测试法 D结构覆盖法 A,课堂作业,假设在程序控制流图中,有 12 条边,8 个节点,则确保程序中每个可执行语句,至少执行一次所必需的测试用例数目的上限是_ 环复杂度是 V=e+1-n+1=6,路径覆盖需要6个,课堂作业
35、,关于白盒测试的测试用例设计方法叙述,正确的是_ A完成语句覆盖所需的测试用例数目一定多于完成 判定覆盖所需的测试用例数目 B达到 100条件覆盖要求就一定能够满足 100语句覆盖的要求 C达到 100条件/判定覆盖要求就一定能够满足 100条件覆盖的要求 D任何情况下,都可以达到 100路径覆盖的要求 C,课堂作业,针对程序段:IF( A|B|C )THEN W=W/X,对于(A,B,C)的取值,_测试用例能够满足 MCDC(修正条件逻辑判定)的要求。 A(F,T,T) (T,F,T) (T,F,F) (T,T,F) B(T,F,F) (T,T,F) (F,T,T) (F,F,F) C(T,
36、F,F) (T,T,F) (F,T,T) (F,F,T) D(T,F,F) (F,T,F) (F,F,T) (F,F,F) D,课堂作业,针对下列程序段,需要_个测试用例可以满足分支覆盖的要求。 4画出程序图,看到有4条路径。leap =的分支有4个,int IsLeap(int year) if ( year % 4 = 0 ) if ( ( year % 100 = 0 ) if ( year % 400 = 0 ) leap = 1; elseleap = 0; else leap = 1; else leap = 0; return leap; ,实验五,binSearch3binSe
37、arch4 while ( low = high ) high = mid;/mid-1,画出程序图,找出独立路径集。 设计测试用例。简单说明具体 用例的设计过程。,一起来画程序图,public static int binSearch3 ( int array, int key) int mid, low, high, found;low = 0;high = array.length-1;found=-1;while ( low high ) / =mid = (low+high)/2;if ( key = arraymid ) found = mid + 1;break;else if
38、( key arraymid )high = mid -1;elselow = mid + 1;return found; ,请位同学来找路径集,主路径(3个节点) 1-4, while, =, , high, , while, return路径2-4 1-4, while,return 1-4, while, =, break, return 1-4, while, =, , low, , while, return,public static int binSearch3 ( int array, int key) int mid, low, high, found;low = 0;hig
39、h = array.length-1;found=-1;while ( low high ) / =mid = (low+high)/2;if ( key = arraymid ) found = mid + 1;break;else if ( key arraymid )high = mid -1;elselow = mid + 1;return found; ,主路径(3个节点) 1-4, while, =, =high, 那么用例的low = high。 得到length = 1 设计用例为 array=5, key = 3(/5),循环测试,public static int binS
40、earch3 ( int array, int key) int mid, low, high, found;low = 0;high = array.length-1;found=-1;while ( low high ) / =mid = (low+high)/2;if ( key = arraymid ) found = mid + 1;break;else if ( key arraymid )high = mid -1;elselow = mid + 1;return found; ,0次, low=high array = , k = 11次, 可以low=high-1 array = 3 7, k=3(/-1/9) 2次(略) 一般次 Array = 1 2 3 4 7,k=4/5/7循环多次 Array = 1 2 4 6 7, , 8 9 11 15 28, 99, k = 27/28,谢谢大家!,