白盒测试与黑盒测试
- 测试用例
- 定义
- 生成的基本准测
- 设计步骤
- 作用
- 测试数据和测试用例的区别
 
- 黑盒测试
- 定义
- 优点
- 缺点
- 黑盒测试的实施过程
- 等价类划分法
- 边界值分析法
- 错误推测法
- 因果图
- 判定表
- 判定表例题
 
 
- 白盒测试
- 介绍
- 覆盖程度
- 基本路径覆盖
- 程序流程图简化成控制流图
- 计算圈复杂度
- 导出测试用例
- 准备测试用例
 
 
- 例题
- 1) 绘制控制流图
- 2)列出所有决定及其条件分支
- 3) 使用判定/条件覆盖测试方法来设计测试用例
- 4) 请使用条件组合测试方法来设计测试用例
- 5) 请使用路径覆盖方法来设计测试用例
- 6) 请使用基本路径测试方法来设计测试用例
 
 
本文介绍白盒测试与黑盒测试有关内容,并伴随例子讲解
测试用例
测试用例就是一个文档,描述输入、动作、或者时间和一个期望的结果,其目的是确定应用程序的某个特性是否正常的工作。
 软件测试用例的基本要素包括测试用例编号、测试标题、重要级别、测试输入、操作步骤、预期结果。
定义
满足特定目的的测试数据、测试代码、测试规程的集合
 是发现软件缺陷的最小测试执行单元
 有特殊的书写标准和基本原则
生成的基本准测
代表性:能够代表并覆盖各种输入数据、操作和环境设置等
 可判定性:测试结果的正确性是可判定的
 可再现性:对同样的测试用例,系统的执行结果应当是相同的
设计步骤
为测试需求确定测试用例->为测试用例确定输入输出->编写测试用例->评审测试用例->跟踪测试用例
作用
避免盲目测试;估算测试工作量;减少回归测试的复杂程度;方便书写软件测试缺陷报告;实施不同级别的测试
测试数据和测试用例的区别
测试数据:被用来测试系统的输入数据(输入)
 测试用例:被测试系统的输入和根据规格说明书预测的该系统的输出(输入&输出)
黑盒测试
定义
黑盒测试又称功能测试、数据驱动测试或基于规格说明书的测试,是一种从用户观点出发的测试。
等价性划分、边值分析、组合测试、随机测试和误差猜测、场景测试
黑盒测试主要测试的错误类型有:
 ①不正确或遗漏的功能;
 ②接口、界面错误;
 ③性能错误;
 ④数据结构或外部数据访问错误;
 ⑤初始化或终止条件错误等等。
优点
(1)有针对性地寻找问题,并且定位问题更准确。
 (2)黑盒测试可以证明产品是否达到用户要求的功能,符合用户的工作要求。
 (3)黑盒测试与软件如何实现无关,如果实现发生变化,黑盒测试用例仍然可用(可重用性,面向回归测试)
 (4)测试用例开发可以与软件开发同时进行,可节省软件开发时间,通过软件的用例就可以设计出大部分黑盒测试用例。
 (5)能重复执行相同的动作,测试工作中最枯燥的部分可交由机器完成。
缺点
(1)需要充分了解待测试软件产品所用到的各项技术,测试人员需要具有较多经验。
 (2)测试用例数量较大
 (3)测试用例可能产生很多冗余
 (4)功能性测试的覆盖范围不可能达到100%
 (5)在测试过程中很多是手工测试操作。
 (6)测试人员要负责大量文档、报表的编制和整理工作。
黑盒测试的实施过程
(1)测试计划阶段
 (2)测试设计阶段
    依据程序需求规格说明书或用户手册,按照一定规范化的方法进行软件功能划分和设计测试用例。
 (3)测试执行阶段
   按照设计的测试用例执行测试;
   自由测试(作为测试用例测试的补充)。
 (4)测试总结阶段
等价类划分法
等价类是指某个输入域的子集合。 在该子集合中,各个输入数据对于揭露程序中的错误都是等效的。
 并合理地假定:测试某等价类的代表值就等于对这一类其它值的测试,因此每个等价类取一个数据就行
有效等价类
- 是指对于程序的规格说明来说是合理的,有意义的输入数据构成的集合。
- 利用有效等价类可检验程序是否实现了规格说明中所规定的功能和性能。
- 一般只有规定输入数据的一组值且对每一个输入值分别处理的时候才会有N个有效等价类和一个无效等价类,其他规则一般都只有一个有效等价类
无效等价类
- 与有效等价类的定义恰巧相反。
- 无效等价类指对程序的规格说明是不合理的或无意义的输入数据所构成的集合。
- 对于具体的问题,无效等价类至少应有一个,也可能有多个。
示例:
 设有一个档案管理系统,要求用户输入以年月表示的日期。假设日期限定在1990年1月~2049年12月,并规定日期由6位数字字符组成,前4位表示年,后2位表示月。现用等价类划分法设计测试用例,来测试程序的“日期检查功能”。
 1)划分等价类并编号
 
 2)设计测试用例,以便覆盖所有的有效等价类在表中列出了3个有效等价类,编号分别为①、⑤、⑧,设计的测试用例如下:
 
 3)为每一个无效等价类设计一个测试用例,设计结果如下:

边界值分析法
- 是对等价类划分的补充
- 边界值分析不是从某等价类中随便挑一个作为代表,而是使这个等价类的每个边界都要作为测试条件。
- 边界值分析不仅考虑输入条件,还要考虑输出空间产生的测试情况
边界值分析法用例设计原则:
 1)如果输入条件规定了值的范围,则应取刚达到这个范围的边界的值,以及刚刚超越这个范围边界的值作为测试输入数据。
例如,如果程序的规格说明中规定:“重量在10公斤至50公斤范围内的邮件,其邮费计算公式为……”。作为测试用例,我们应取10及50,还应取10.01,49.99,9.99及50.01等。
2)如果输入条件规定了值的个数,则用最大个数,最小个数,比最小个数少一,比最大个数多一的数作为测试数据。
 比如,一个输入文件应包括1~255个记录,则测试用例可取1和255,还应取0及256等。
3)将规则1)和2)应用于输出条件,即设计测试用例使输出值达到边界值及其左右的值。
 例如,某程序的规格说明要求计算出“每月保险金扣除额为0至1165.25元”,其测试用例可取0.00及1165.24、还可取一0.01及1165.26等。
 再如一程序属于情报检索系统,要求每次”最少显示1条、最多显示4条情报摘要”,这时我们应考虑的测试用例包括1和4,还应包括0和5等。
4)如果程序的规格说明给出的输入域或输出域是有序集合,则应选取集合的第一个元素和最后一个元素作为测试用例。
 5)如果程序中使用了一个内部数据结构,则应当选择这个内部数据结构的边界上的值作为测试用例。
 6)分析规格说明,找出其它可能的边界条件。
例题:
 程序的输入文件由一些有80个字符的记录组成,如右图所示,所有记录分为3组:
 
① 标题:
 这一组只有一个记录,其内容为输出成绩报告的名字。
 ②试卷各题标准答案记录:
 每个记录均在第80个字符处标以数字“2”。该组的第一个记录的第1至第3个字符为题目编号(取值为1一999)。第10至第59个字符给出第1至第50题的答案(每个合法字符表示一个答案)。该组的第2,第3……个记录相应为第51至第100,第101至第150,…题的答案。
 ③每个学生的答卷描述:
 该组中每个记录的第80个字符均为数字“3”。每个学生的答卷在若干个记录中给出。如甲的首记录第1至第9字符给出学生姓名及学号,第10至第59字符列出的是甲所做的第1至第50题的答案。若试题数超过50,则第2,第3……记录分别给出他的第51至第100,第101至第150……题的解答。然后是学生乙的答卷记录
 学生人数不超过200,试题数不超过999
 程序的输出有4个报告:
 a)按学号排列的成绩单,列出每个学生的成绩、名次。
 b)按学生成绩排序的成绩单。
 c)平均分数及标准偏差的报告。
 d)试题分析报告。按试题号排序,列出各题学生答对的百分比。
 解答:分别考虑输入条件和输出条件,以及边界条件。给出下表所示的输入条件及相应的测试用例。

 
 
错误推测法
基于经验和直觉推测程序中所有可能存在的各种错误, 从而有针对性的设计测试用例的方法。比如输入数据为0
例如,针对例3,采用错误推测法还可补充设计一些测试用例:
 1、 程序是否把空格作为回答
 2、 在回答记录中混有标准答案记录
 3、 除了标题记录外,还有一些的记录最后一个字符即不是2也不是3
 4、 有两个学生的学号相同
 5、试题数是负数。
再如,测试一个对线性表(比如数组)进行排序的程序,可推测列出以下几项需要特别测试的情况:
 1)输入的线性表为空表;
 2)表中只含有一个元素;
 3)输入表中所有元素已排好序;
 4)输入表已按逆序排好;
 5)输入表中部分或全部元素相同。
因果图
- 前面介绍的等价类划分方法和边界值分析方法,都是着重考虑输入条件,但未考虑输入条件之间的联系, 相互组合等。
- 考虑输入条件之间的相互组合,可能会产生一些新的情况. 但要检查输入条件的组合不是一件容易的事情, 即使把所有输入条件划分成等价类,他们之间的组合情况也相当多. 因此必须考虑采用一种适合于描述对于多种条件的组合,相应产生多个动作的形式来考虑设计测试用例。这就需要利用因果图( Cause一Effect Graphics )方法。
- 采用因果图方法能够帮助我们按一定步骤,高效率地选择测试用例,同时还能为我们指出,程序规格说明描述中存在着什么问题。

 左结点表示输入状态(或称原因),右结点表示输出状态(或称结果)。
 Ci表示原因,通常置于图的左部; ei表示结果,通常在图的右部。 ci和ei均可取值0或1,0表示某状态不出现,1表示某状态出现
关系
 ①恒等:若ci是1,则ei也是1;否则ei为0。
 ②非:若ci是1,则ei是0;否则ei是1。
 ③或:若c1或c2或c3是1,则ei是1;否则ei为0。“或”可有任意个输入。
 ④与:若c1和c2都是1,则ei为1;否则ei为0。“与”也可有任意个输入。
例子:
 原因:
 1.售货机有零钱找 2.投入1元硬币
 3.投入5角硬币 4.押下橙汁按钮
 5.押下啤酒按钮
 结果:
 21. 售货机〖零钱找完〗灯亮 
 22. 退还1元硬币
 23. 退还5角硬币 
 24. 送出橙汁饮料
 25. 送出啤酒饮料

 
 因果图方法是一个非常有效的黑盒测试方法,它能够生成没有重复性的且发现错误能力强的测试用例,而且对输入、输出同时进行了分析。
 从因果图生成的测试用例(局部,组合关系下的)包括了所有输入数据的取TRUE与取FALSE的情况,构成的测试用例数目达到最少,且测试用例数目随输入数据数目的增加而线性地增加。
 如果哪个开发项目在设计阶段就采用了判定表,也就不必再画因果图,而是可以直接利用判定表设计测试用例了。
判定表
判定表通常由四个部分组成:
 条件桩(Condition Stub):列出了问题的所有条件,通常认为列出得条件的次序无关紧要。
 动作桩(Action Stub):列出了问题规定可能采取的操作,这些操作的排列顺序没有约束。
 条件项(Condition Entry):列出针对它左列条件的取值,在所有可能情况下的真假值。
 动作项(Action Entry):列出在条件项的各种取值情况下应该采取的动作。
例子:
 问题要求:”…… 对功率大于50马力的机器、维修记录不全或已运行10年以上的机器,应给予优先的维修处理……” 。 这里假定,“维修记录不全”和“优先维修处理”均已在别处有更严格的定义 。 请建立判定表。
 ①确定规则的个数:这里有3个条件,每个条件有两个取值,故应有222=8种规则。
 ②列出所有的条件茬和动作茬:
 ③填入条件项。可从最后1行条件项开始,逐行向上填满。如第三行是: Y N Y N Y N Y N第二行是: Y Y N N Y Y N N等等。
 ④填人动作桩和动作顶。这样便得到形如图的初始判定表。
 
 ⑤化简。合并相似规则后得到图
 
判定表例题
请根据判定表方法为以下a、b、c边的直角三角形问题设计测试用例。
 a、b和c应为1至100的正整数;
 如果任何一侧小于1或大于100,则输出为“无效输入”;
 如果任意两条边的和小于或等于第三条边,则输出为“非三角形”;
 如果任意两边的平方和等于第三边的平方,则输出为“直角三角形”;否则输出为“一般三角形”;
 1) 请绘制决策表。
 2) 请列出测试用例。
首先我们假设输入一定为整数,确定规则个数,这里有3个条件,其中第一个条件有3种取值,规则数量为322 = 12
这里列出所有条件茬和动作茬:
 
 判定表:
 
 
白盒测试
介绍
白盒测试也称结构测试或逻辑驱动测试,是一种测试用例设计方法,它从程序的控制结构导出测试用例。
 白盒测试使用被测单元内部如何工作的信息,允许测试人员对程序内部逻辑结构及有关信息来设计和选择测试用例,对程序进行测试。
基本要求:
 保证一个模块中的所有独立路径至少被执行一次;
 对所有的逻辑值均需要测试真、假两个分支;
 在上下边界及可操作范围内运行所有循环;
 检查内部数据结构以确保其有效性。
应用白盒法时,手头必须有程序的规格说明以及程序清单。
 白盒法考虑的是测试用例对程序内部逻辑的覆盖程度。
 最彻底的白盒法是覆盖程序中的每一条路径,但是由于程序中一般含有循环,所以路径的数目极大,要执行每一条路径是不可能的,只能希望覆盖的程度尽可能高些。
覆盖程度
从低到高:
语句覆盖:选择足够的测试用例,使得程序中每个语句至少都能被执行一次。
 判定覆盖(也称为分支覆盖):执行足够的测试用例,使得程序中的每一个分支至少都通过一次(仅要求取到每一个结果)。
 条件覆盖:执行足够的测试用例,使程序中每个判断的每个条件的每个可能取值至少执行一次;
 判定/条件覆盖:执行足够的测试用例,使得判定中每个条件取到各种可能的值,并使每个判定取到各种可能的结果(所有结果被取过)。
 条件组合覆盖:执行足够的例子,使得每个判定中条件的各种可能组合都至少出现一次。
 基本路径测试:设计足够多的测试用例,运行所测程序,要覆盖程序中所有可能的路径。这是最强的覆盖准则。但在路径数目很大时,真正做到完全覆盖是很困难的,必须把覆盖路径数目压缩到一定限度。
例子:
 
 语句覆盖:x=4、y=5、z=5 程序执行的路径是:abd
 分支覆盖:①x=4,z=0,y=6 (沿路径acd执行);
 ② x=5,z=5,y=2(沿路径abe执行)
 条件覆盖:
 对于第一个判断:
 条件x>3 取真值为T1,取假值为-T1
 条件z<10 取真值为T2,取假值为-T2
 对于第二个判断:
 条件x=4 取真值为T3,取假值为-T3
 条件y>5 取真值为T4,取假值为-T4
 
注意“条件覆盖”并不包含“分支覆盖”,
而“分支 /条件覆盖”,它的含义是:执行足够的测试用例,使得分支中每个条件取到各种可能的值,并使每个分支取到各种可能的结果。它才是包含前两者的覆盖

条件组合覆盖:
 1、x>3,z<10 记做T1 T2,第一个判断的取真分支
 2、x>3,z>=10 记做T1 -T2,第一个判断的取假分支
 3、x<=3,z<10 记做-T1 T2,第一个判断的取假分支
 4、x<=3,z>=10 记做-T1 -T2,第一个判断的取假分支
 5、x=4,y>5 记做T3 T4,第二个判断的取真分支
 6、x=4,y<=5 记做T3 -T4,第二个判断的取真分支
 7、x!=4,y>5 记做-T3 T4,第二个判断的取真分支
 8、x!=4,y<=5 记做-T3 -T4,第二个判断的取假分支
根据定义取4个测试用例,就可以覆盖上面8种条件取值的组合。上面的测试用例覆盖了所有条件的可能取值的组合,覆盖了所有判断的可取分支,但是却丢失了一条路径abe(路径组合可能丢失)
 
基本路径覆盖
步骤:
 程序的控制流图:描述程序控制流的一种图示方法
 程序圈复杂度:McCabe复杂性度量。从程序的环路复杂性可导出程序基本路径集合中的独立路径条数。
 导出测试用例:根据圈复杂度和程序结构设计用例数据输入和预期结果。
 准备测试用例:确保基本路径集中的每一条路径的执行
下面是基本路径覆盖的结果用例
 
程序流程图简化成控制流图

 在将程序流程图简化成控制流图时,应注意:
 在选择或多分支结构中,分支的汇聚处应有一个汇聚结点。
 边和结点圈定的区域叫做区域,当对区域计数时,图形外的区域也应记为一个区域。

 
 
计算圈复杂度
圈复杂度是一种为程序逻辑复杂性提供定量测度的软件度量,将该度量用于计算程序的基本的独立路径数目。
有以下三种方法计算圈复杂度:
- 流图中区域的数量对应于圈复杂度;
- 给定流图G的圈复杂度V(G),定义为V(G)=E-N+2,E是流图中边的数量,N是流图中结点的数量;
- 给定流图G的圈复杂度V(G),定义为V(G)=P+1,P是流图G中判定结点的数量。
对应上面图中的圈复杂度,计算如下:
 流图中有四个区域;
 V(G)=10条边-8结点+2=4;
 V(G)=3个判定结点+1=4。
 
导出测试用例
第三步:导出测试用例
 根据上面的计算方法,可得出四个独立的路径。(一条独立路径是指,和其他的独立路径相比,至少引入一个新处理语句或一个新判断的程序通路。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
 根据上面的独立路径,去设计输入数据,使程序分别执行到上面四条路径。
准备测试用例
路径1:4-14
 输入数据:iRecordNum=0,或者
 取iRecordNum<0的某一个值
 预期结果:x=0
 路径2:4-6-7-14
 输入数据:iRecordNum=1,iType=0
 预期结果:x=2
 路径3:4-6-8-10-13-4-14
 输入数据:iRecordNum=1,iType=1
 预期结果:x=10
 路径4:4-6-8-11-13-4-14
 输入数据:iRecordNum=1,iType=2
 预期结果:x=20
void  Sort(int iRecordNum,int iType)
 {  
   int x=0;
   int y=0;
   while (iRecordNum-- > 0)
   {
	   if(0==iType)
              {x=y+2; break;}
        else
	     if(1= =iType)
  		x=y+10;
           else
        	x=y+20;
    }
 }
例题
请使用以下白盒测试技术完成测试用例设计。
 1)请绘制控制流程图。
 2) 请列出所有决定及其条件分支。
 3) 请使用判定/条件覆盖测试方法来设计测试用例。
 4) 请使用条件组合测试方法来设计测试用例。
 5) 请使用路径覆盖方法来设计测试用例。
 6) 请使用基本路径测试方法来设计测试用例

1) 绘制控制流图
先画出程序流图再转为控制流图

2)列出所有决定及其条件分支
注意列出的时候利用字母进行标记

3) 使用判定/条件覆盖测试方法来设计测试用例

4) 请使用条件组合测试方法来设计测试用例

5) 请使用路径覆盖方法来设计测试用例

6) 请使用基本路径测试方法来设计测试用例



















