白盒测试之流图

 if (a or b) 2x 3 else 4y 5 ... 如果那个条件改为 and,如: 1 if (a and b) 2x 3 esle 4y 5 ... 白盒测试的测试方法有代码检查法,静态结构分析法,静态质量度量法,逻辑覆盖法,基本 路径测试法,域测试,符号测试,Z 路径覆盖,程序变异. 其中运用最为广泛的是基本路径测试法. 基本路径测试法是在程序控制流图的基础上, 通过分析控制构造的环路复杂性, 导出基 本可执行路径集合,从而设计测试用例的方法. 设计出的测试用例要保证在测试中程序的每个可执行语句至少执行一次. 在程序控制流图的基础上, 通过分析控制构造的环路复杂性, 导出基本可执行路径集合, 从而设计测试用例.包括以下 4 个步骤和一个工具方法: 1. 程序的控制流图:描述程序控制流的一种图示方法. 2. 程序圈复杂度:McCabe 复杂性度量.从程序的环路复杂性可导出程序基本路径集合 中的独立路径条数, 这是确定程序中每个可执行语句至少执行一次所必须的测试用例数目的 上界. 3. 导出测试用例:根据圈复杂度和程序结构设计用例数据输入和预期结果. 4. 准备测试用例:确保基本路径集中的每一条路径的执行. 工具方法: 图形矩阵: 是在基本路径测试中起辅助作用的软件工具, 利用它可以实现自动地确定一 个基本路径集. 程序的控制流图:描述程序控制流的一种图示方法. 圆圈称为控制流图的一个结点,表示一个或多个无分支的语句或源程序语句 流图只有二种图形符号: 图中的每一个圆称为流图的结点,代表一条或多条语句. 流图中的箭头称为边或连接,代表控制流 任何过程设计都要被翻译成控制流图. 如何根据程序流程图画出控制流程图 画出控制流程图? 如何根据程序流程图画出控制流程图 在将程序流程图简化成控制流图时,应注意: n 在选择或多分支结构中,分支的汇聚处应有一个汇聚结点. n 边和结点圈定的区域叫做区域,当对区域计数时,图形外的区域也应记为一个区域. 如下页图所示 n 如果判断中的条件表达式是由一个或多个逻辑运算符 (OR, AND, NAND, NOR) 连接的 复合条件表达式,则需要改为一系列只有单条件的嵌套的判断. 例如: 1 if a or b 2x 3 else 4y 对应的逻辑为: 独立路径:至少沿一条新的边移动的路径 o 第一步:画出控制流图 流程图用来描述程序控制结构.可将流程图映射到一个相应的流图(假设流程图的菱形 决定框中不包含复合条件).在流图中,每一个圆,称为流图的结点,代表一个或多个语句. 一个处理方框序列和一个菱形决测框可被映射为一个结点,流图中的箭头,称为边或连接, 代表控制流,类似于流程图中的箭头.一条边必须终止于一个结点,即使该结点并不代表任 何语句(例如:if-else-then 结构).由边和结点限定的范围称为区域.计算区域时应包括图外 部的范围. 画出其程序流程图和对应的控制流图如下 o 第二步:计算圈复杂度 圈复杂度是一种为程序逻辑复杂性提供定量测度的软件度量, 将该度量用于计算程序的 基本的独立路径数目, 为确保所有语句至少执行一次的测试数量的上界. 独立路径必须包含 一条在定义之前不曾用到的边. 有以下三种方法计算圈复杂度: 流图中区域的数量对应于环型的复杂性; 给定流图 G 的圈复杂度 V(G),定义为 V(G)=E-N+2,E 是流图中边的数量,N 是流图 中结点的数量; 给定流图 G 的圈复杂度 V(G),定义为 V(G)=P+1,P 是流图 G 中判定结点的数量. o 第三步:导出测试用例 根据上面的计算方法,可得出四个独立的路径.(一条独立路 径是指,和其他的独立路径相比,至少引入一个新处理语句或一个新判断的程序通路.V(G) 值正好等于该程序的独立路径的条数.) ü 路径 1:4-14 ü 路径 2:4-6-7-14 ü 路径 3:4-6-8-10-13-4-14 ü 路径 4:4-6-8-11-13-4-14 根据上面的独立路径,去设计输入数据,使程序分别执行到上面四条路径. o 第四步:准备测试用例 为了确保基本路径集中的每一条路径的执行, 根据判断结点给出的条件, 选择适当的数 据以保证某一条路径可以被测试到,满足上面例子基本路径集的测试用例是: 例说明: 例说明:流程图描述了最多输入 50 个值(以–1 作为输入结束标志),计算其中有效的学 生分数的个数,总分数和平均值. 步骤 1:导出过程的流图. 步骤 2:确定环形复杂性度量 V(G): 1)V(G)= 6 (个区域) 2)V(G)=E–N+2=16–12+2=6 其中 E 为流图中的边数,N 为结点数; 3)V(G)=P+1=5+1=6 其中 P 为谓词结点的个数.在流图中,结点 2,3,5,6,9 是谓词结点. 步骤 3:确定基本路径集合(即独立路径集合).于是可确定 6 条独立的路径: 路径 1:1-2-9-10-12 路径 2:1-2-9-11-12 路径 3:1-2-3-9-10-12 路径 4:1-2-3-4-5-8-2… 路径 5:1-2-3-4-5-6-8-2… 路径 6:1-2-3-4-5-6-7-8-2… 步骤 4:为每一条独立路径各设计一组测试用例,以便强迫程序沿着该路径至少执行一 次. 1)路径 1(1-2-9-10-12)的测试用例: score[k]=有效分数值,当 k < i ; score=–1, 2≤i≤50; 期望结果:根据输入的有效分数算出正确的分数个数 n1,总分 sum 和平均分 average. 2)路径 2(1-2-9-11-12)的测试用例: score[ 1 ]= – 1 ; 期望的结果:average = – 1 ,其他量保持初值. 3)路径 3(1-2-3-9-10-12)的测试用例: 输入多于 50 个有效分数,即试图处理 51 个分数,要求前 51 个为有效分数; 期望结果:n1=50,且算出正确的总分和平均分. 4)路径 4(1-2-3-4-5-8-2…)的测试用例: score=有效分数,当 i<50; score[k]<0, k< i ; 期望结果:根据输入的有效分数算出正确的分数个数 n1,总分 sum 和平均分 average. score=有效分数, 当 i<50; 5)路径 5 的测试用例: score[k]>100, k< i ; 期望结果:根据输入的有效分数算出正确的分数个数 n1,总分 sum 和平均分 average. 6)路径 6(1-2-3-4-5-6-7-8-2…)的测试用例: score=有效分数, 当 i<50; 期望结果:根据输入的有效分数算出正确的分数个数 n1,总分 sum 和平均分 average. 注意事项: 注意事项: 必须注意,一些独立的路径,往往不是完全孤立的,有时它是程序正常的控制流的一部 分,这时,这些路径的测试可以是另一条路径测试的一部分. 方法工具:图形矩阵 o 导出控制流图和决定基本测试路径的过程均需要机械化, 为了开发辅助基本路径测试 的软件工具,称为图形矩阵(graph matrix)的数据结构很有用. 利用图形矩阵可以实现自动地确定一个基本路径集.一个图形矩阵是一个方阵,其行/ 列数控制流图中的结点数, 每行和每列依次对应到一个被标识的结点, 矩阵元素对应到结点 间的连接(即边).在图中,控制流图的每一个结点都用数字加以标识,每一条边都用字母加 以标识.如果在控制流图中第 i 个结点到第 j 个结点有一个名为 x 的边相连接,则在对应的 图形矩阵中第 i 行/第 j 列有一个非空的元素 x. 对每个矩阵项加入连接权值(link weight),图矩阵就可以用于在测试中评估程序的控制 结构, 连接权值为控制流提供了另外的信息. 最简单情况下, 连接权值是 1(存在连接)或 0(不 存在连接),但是,连接权值可以赋予更有趣的属性: 执行连接(边)的概率. 穿越连接的处理时间. 穿越连接时所需的内存. 穿越连接时所需的资源. 根据上面的方法对例 4 画出图形矩阵如下: 连接权为"1"表示存在一个连接,在图中如果一行有两个或更多的元素"1",则这行所 代表的结点一定是一个判定结点, 通过连接矩阵中有两个以上(包括两个)元素为"1"的个数, 就可以得到确定该图圈复杂度的另一种算法. 熟悉测试理论的人都知道, 路径覆盖是白盒测试中一种很重要的方法, 广泛应用于单元 测试. 那么基于路径覆盖的分析方法是不是只能应用于单元测试呢, 能不能将其推而广之呢. 一般而言,在单元测试中,路径就是指函数代码的某个分支,而实际上如果我们将软件系统 的某个流程也看成路径的话, 我们将可以尝试着用路径分析的方法来设计测试用例. 采用路 径分析的方法设计测试用例有两点好处: 一是降低了测试用例设计的难度, 只要搞清了各种 流程,就可以设计出高质量的测试用例来,而不用太多测试方面的经验;二是在测试时间较 紧的情况下,可以有的放矢的选择测试用例,而不用完全根据经验来取舍.下面就具体的介 绍一下如何用路径分析的方法编写测试用例. 首先是将系统运行过程中所涉及到的各种流程图表化,可以先从最基本的流程入手,将 流程抽象成为不同功能的顺序执行.在最基本流程的基础上再去考虑次要或者异常的流程, 这样将各种流程逐渐细化, 这样既可以逐渐加深对流程的理解, 还可以将各个看似孤立的流 程关联起来.完成所有流程的图表化后就完成了所有路径的设定. 找出了所有的路径,下面的工作就是给每条路径设定优先级,这样在测试时就可以先测 优先级高的, 再测优先级低的, 在时间紧迫的情况下甚至可以考虑忽略一些低优先级的路径. 优先级根据两个原则来选取:一是路径使用的频率,使用越频繁的优先级越高;二是路径的 重要程度, 如果失败对系统影响越大的优先级越高. 将根据两个原则所分别得到的优先级相 加就得到了整个路径的优先级.根据优先级的排序就可以更有针对性的进行测试. 为每条路径设定好优先级后,接下来的工作就是为每条路径选取测试数据,构造测试用 例. 一条路径可以对应多个测试用例, 在选取测试数据时, 可以充分利用边界值选取等方法, 通过表格将各种测试数据的输入输出对应起来,这样就完成了测试用例的设计. 对于测试人员而言,测试用例的设计是一件非常困难的工作,而同时测试用例的设计好 坏又直接关系到整个系统的设计质量. 本文介绍了一种更理论化的设计方法来尽量简化这种 工作, 将一般应用于单元测试的路径分析方法推广到集成测试, 系统测试等后续测试过程中, 希望能给大家一点启示.

你可能感兴趣的:(数据结构,工作,测试,单元测试,工具,图形)