白盒测试及其用例的设计.doc_第1页
白盒测试及其用例的设计.doc_第2页
白盒测试及其用例的设计.doc_第3页
白盒测试及其用例的设计.doc_第4页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第四章 白盒测试及其用例的设计 4.1问:为什么要进行白盒测试? 答:贯穿程序的独立路径数通常巨大,即使每条路径都测试过了,仍然可能 存在错误。这是因为:(1)穷举路经测试法无法检查出程序本身是否违反了设计 规范,即程序是否是一个错误的程序。(2)穷举路经测试不可能查出程序因为遗 漏路径而出错。(3)穷举路经测试发现不了一些与数据相关的错误。 4.2问:采用白盒测试方法必须遵循哪些原则? 答:采用白盒测试方法必须遵循以下几条原则,才能达到测试的目的:(1) 保证一个模块中的所有独立路径至少被测试一次。(2)所有逻辑值均需测试真 (true) 和假 (false) 两种情况。(3)检查程序的内部数据结构,保证其结构的有 效性。(4)在上下边界及可操作范围内运行所有循环。 4.3问:常用的白盒测试方法有哪些? 答:白盒测试主要是检查程序的内部结构、逻辑、循环和路径。常用测试用 例设计方法有:(1)逻辑覆盖法(逻辑驱动测试);(2)基本路径测试法。 其中,逻辑覆盖法中根据覆盖标准从低到高分别是:语句覆盖、判定覆盖、 条件覆盖、判定/条件覆盖、条件组合覆盖。 4.4问:请用一个实例说明各种比较常用的覆盖测试方法,包括语句覆盖、判定 覆盖、条件覆盖、判定/条件覆盖、组合覆盖和路径覆盖等。 答:下面以一个简单但经典的小程序作为参考实例: IF (A1) AND (B=0) THEN X=X/A IF (A=2) OR (X1) THEN X=X+1 其中,“AND”和“OR”为逻辑运算符。其所对应的程序流程图如下所示。 其控制流图中的各个程序点分别由字母a,b,c,d,e来表示。(1)语句覆盖 语句覆盖方法选择足够多的测试用例,使程序中的每个可执行语句至少执行 一次。例如上例,设计一个能通过路径ace的测试路径即可。即当A=2,B=0,X=3 时,程序按照流程图上的路径ace执行,即程序段中的4个语句均得到执行,完 成语句覆盖。 语句覆盖可以保证程序中每个语句都得到执行,但是它并不能全面地检验每 一个语句,即它并不是一种充分的检验方法。当程序段中两个判定的逻辑运算存 在问题时,如果第一个判定的运算符“AND”错写成运算符“OR”,这时仍使用 该测试用例,则程序仍按流程图上的路径 ace 执行;当第二个条件语句中 X1 误写成X0时,上述的测试用例也不能发现这一错误。 (2)判定覆盖 判定覆盖是比语句覆盖较强一些的方法,即通过执行足够的测试用例,使得 程序中的每个判定至少都获得一次“真”值和“假”值,也就是使程序中的每个 取“真”分支和取“假”分支至少均经历一次,也称为“分支覆盖”。对上述示 例程序段,设计两个测试用例,使它们能通过路径 ace 和 abd,或通过路径 acd 及abe,即可达到“判定覆盖”的标准。 若选用的两组测试用例如判定覆盖测试用例表所示,则可分别执行流程图上 的路径ace和abd,从而使两个判断的4个分支c,e和 b,d分别得到覆盖。 判定覆盖测试用例表 测试用例 A, B, X (A1)AND(B=0) (A=2)OR(X1) 执行路径 测试用例1 2, 0, 3 真(T) 真(T) ace 测试用例2 1, 0, 1 假(-T) 假(-T) abd 需要注意的是,上述的两组测试用例在满足判定覆盖的同时,还完成了语句 覆盖,因此判定覆盖要比语句覆盖更强一些。但是,此时仍然存在这样的问题, 即如果程序段中的第 2 个判定条件 X1 误写为 X1)AND(B=0)包含了两个条件:A1及 B=0。此时一个更强的 覆盖标准是“条件覆盖”,条件覆盖的目的是设计若干测试用例,在执行被测程 序以后,要使每个判定中每个条件的可能值至少满足一次。 因此,在第一个判定(A1)AND(B=0)中应考虑到各种条件取值的情况: A1为真与 A1 为假的情况 B=0为真与B=0 为假的情况 同样,对于第二个判定 (A=2) OR (X1)应考虑到: A=2 为真与 A=2 为假的情况 X1 为真与X1 为假的情况 因此,只需要采用两个测试用例,就可以满足测试要求,即覆盖4个条件可 能产生的8种情况,如条件覆盖测试用例表表所示。 条件覆盖测试用例表 测试用例 A, B, X 执行路径 覆盖条件 测试用例1 2, 0, 3 ace (BCEF) T1 ,T 2 ,T3, T4 测试用例5 1, 1, 1 abd (AD) -T1 ,-T2 ,-T3,-T4这两个测试用例不但覆盖了 4 个条件的全部 8种情况,而且将两个判定的 4 个分支 b,c,d,e 也同时覆盖了,即同时达到了条件覆盖和判定覆盖。但是,并不 是说满足条件覆盖,就一定能够满足判定覆盖。 (4)判定/条件覆盖 判定/条件覆盖要求设计足够的测试用例,使得判定中每个条件的所有(真/ 假)至少出现一次,并且每个判定本身的判定结果(真/假)也至少出现一次。 对于上述示例程序段,若采用测试用例1和测试用例5,就可以达到判定/条件覆 盖的这一要求,如判断/条件覆盖测试用例表所示。 判断/条件覆盖测试用例表 测试用例 A, B, X 执行 路径 覆盖条件 (A1)AND (B=0) (A=2) OR (X1) 测试用例1 2, 0, 3 ace T1 ,T 2 ,T3, T4 真(T) 真(T1) 测试用例5 1, 1, 1 abd -T1 ,-T2 ,-T3,-T4 假(-T) 假(T1) 在实际情况下,大多数计算机不能用一条指令对多个条件做出判定,而必须 将源程序中对多个条件的组合分解成几个简单的单个条件判定,上例经编译系统 产生的目标程序执行流程如图所示。从执行流程得到,上面的两个例子未能使目 标程序中每一个简单判定区的各种可能的结果(真/假),如不可能使判定I (B=0) 为“假”,也不可能使判定 K(X1)为“真”。原因是:含有 AND 和 OR 的逻 辑表达式中,某些条件将对其他条件产生抑制,如逻辑表达式 AAND B,如果 A 为“假”,目标程序就不用再检查B了,这样 B中的错误就无法发现。 (5)组合覆盖 组合覆盖的目的是通过执行足够的测试用例,使得每个判定中条件的各种可 能都至少出现一次。因此,满足条件组合覆盖的测试用例一定满足“判定覆盖”、 “条件覆盖”、“判定/条件覆盖”。 在上述示例程序段中的每个判定个包含有2个条件,这2个条件在判定中有 8种可能的组合,如下: A1, B=0 记为T1,T2 1) A1, B0 记为T1,-T2 2) A=1, B=0 记为 -T1,T2 3) A=1, B0 记为 -T1,-T2 4) A=2, X1 记为T3,T4 5) A=2, X=1 记为T3,-T4 6) A2, X1 记为 -T3,T4 7) A2, X=1 记为 -T3,-T4 8) 下面的4个测试用例,用以覆盖上述 8种条件组合,如组合覆盖测试用例表 所示。 组合覆盖测试用例表 测试用例 A,B, X 执行路径 覆盖条件 覆盖组合号 测试用例1 2, 0, 3 ace T1 ,T 2 ,T3, T4 1,5 测试用例4 2, 1, 1 abe T1 ,-T2 ,T3,-T4 2,6 测试用例5 1, 1, 1 abd -T1 ,-T2 ,-T3,-T4 4,8 测试用例6 1, 0, 3 abe -T1 ,T2 ,-T3, T4 3,7 在示例程序段中共有4条路经,上面的4个测试用例虽然同时覆盖了全部条 件组合4个分支,但是却仅覆盖了 3条路经,漏掉了路径acd。(6)路径覆盖 通过前面讨论过的5种覆盖准则的学习,应注意到,虽然有的覆盖准则提到 经历路径这一问题,但并未涉及到路径的覆盖。事实上,路径能否全面覆盖是软 件测试中很重要的问题。因为程序要得到正确的结果,就必须能保证程序总是沿 着特定的路径顺利执行。只有当程序中的每一条路经都经受了检验,才能使程序 受到了全面检验。 路径覆盖的目的是指设计足够多的测试用例,要求覆盖程序中所有可能的路 径。针对以上示例,从流程图中可以看出,其中有4条可能的路径。即: 路径1 ace (BCEF,1-2-3-4-5) 记为 L1 路径2 abd (AD,1-3-5) 记为 L2 路径3 abe (AEF,1-3-4-5) 记为 L3 路径4 acd (BCD,1-2-5) 记为 L4 因此,可以给出 4 个测试用例:测试用例 1、测试用例 2、测试用例 4 和测 试用例3。使其分别覆盖这4条路经。如路径覆盖测试用例表所示。 路径覆盖测试用例表 测试用例 A, B, X 执行路径 测试用例1 2, 0, 3 ace(L1) 测试用例2 1, 0, 1 abd(L2) 测试用例4 2, 1, 1 abe(L3) 测试用例3 3, 0, 3 acd(L4) 需要指出,由于所引用的示例程序段非常简单,所以只有4条路经。但实际 问题当中,一个不太复杂的程序,其路径都是一个庞大的数字,要在测试中覆盖 这样多的路径是无法实现的。为了解决这个难题,只有把覆盖路径数量压缩到一 定的限度内,例如,程序中的循环体只执行了一次。 另外需要注意的事,在实际工作中,即使对于路径数目很有限的程序已经做 到路径覆盖,仍然不能保证被测试程序的正确性,还需要采用其他测试方法进行 补充。 4.5问:什么是基本路径测试方法? 答:对于复杂性大的程序要做到所有路径覆盖(测试所有可执行路径)是不 可能的。根据前面叙述过的独立路径概念,某一程序的独立路径是指从程序入口 道程序出口的多次执行中,每次至少看一个语句集(包括运算、赋值、输入/输 出或判断)是新的和未被重复的。换用流图来进行描述的话,独立路径就是在从 入口进入流图后,至少走过一个弧。 在不能做到所有路径覆盖的前提下,如果某一程序的每一个独立路径都被 测试过,那么可以认为程序中的每个语句都已经检验过了,即达到了语句覆盖, 这种测试方法就是通常所说的基本路径测试方法。 4.6问:如何进行基本路径测试方法? 答:测试用例设计者导出一个过程设计的逻辑复杂性测度,并使用修改测度 作为指南来定义执行路径的基本集,从该基本集导出的测试用例保证对程序中的 每一条执行语句至少执行一次。基本路径测试用例的设计方法步骤如下,分为以 下四个步骤: (1)画出程序的控制流图。(2)计算环形复杂度。 环形复杂度是一种为程序逻辑复杂性提供定量测度的软件度量,将该度量用 于计算程序的基本的独立路径数目,为确保所有语句至少执行一次的测试数量的 上界。独立路径必须包含一条在定义之前不曾用到的边。有以下三种方法计算环 形复杂度:(a)流图中区域的数量对应于环形复杂度;(b)给定流图 G 的环形 复杂度V(G),定义为V(G)=E-N+2,E是流图中边的数量,N是流图中节点的数 量;(c)给定流图 G的环形复杂度V(G),定义为V(G)=P+1,P是流图 G中判定 节点的数量。 (3)导出测试用例,根据上面的计算方法,导出基本路径集,列出程序的独 立路径。 (4)设计测试用例。 4.7问:代码走查属于白盒测试范畴,请以 Java 为例,说明一种语言规范走查的 内容。 答:Java语言规范走查内容一般情况下,包括以下内容: 测试项 测试内容 下标 是否有下标变量越界错误? 除数 是否包含有除零错误的可能? Get 方法 当对一个不知是否为空的对象取其属性值会引起空指 针异常。如果空指针异常没有被接收程序将终止。 字符串 在字符串比较和将字符串写入数据表前应 Trim()掉它 的前后空格。 字符串连结符 + 将字符串连结操作中的+操作符同加法运算中的+操作 混淆将导致奇怪的结果。例如:y为 int 类型,y的值为 5,g.drawString(y+2=+y+2,30,30);将显示 y+2=52 Float double 不要用等于或不等于来比较浮点值,而应该判断其差别 是否小于某一指定小的值。例如:89.6 实际可能为 89.59999232458 Float double 不要对浮点值用做计数循环,应用整型值。 Float double 不要使用类型 float 或者 double 的变量执行精确的金融 计算。浮点数的不精确会导致引起不正确金融计算的错 误。可定义若干类来完成不同的金融计算。 switch switch语句的末尾如果没有defaul语句将会不利于处理 异常。 switch 是否在 switch 结构中的每一个 case 语句体结束时都有 break语句? if语句 在 if 语句体右括号后紧跟一个分号常常是一个错误, 会使 if语句成为顺序语句。 通过循环语句对一 Vector 型变量赋值时,其 Vec

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论