白盒测试软件技术课件_第1页
白盒测试软件技术课件_第2页
白盒测试软件技术课件_第3页
白盒测试软件技术课件_第4页
白盒测试软件技术课件_第5页
已阅读5页,还剩103页未读 继续免费阅读

下载本文档

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

文档简介

1,软件测试技术白盒测试,2,白盒测试(White Box Testing),软件测试人员可以访问 程序员的代码,并通过 检查代码来测试,可以 看到盒子里面以及里面 是如何运作的。,被测试的软件,3,贯穿程序的独立路径数是天文数字。但即使每条路径都测试了仍然可能有错误。 第一,穷举路径测试决不能查出程序违反了设计规范,即程序本身是个错误的程序。 第二,穷举路径测试不可能查出程序中因遗漏路径而出错。 第三,穷举路径测试可能发现不了一些与数据相关的错误。,4,讨论,白盒测试也通常被认为是单元测试与集成测试的统称,但这个概念是相对的,与当前项目遵循的研发流程有关,某些流程把白盒测试划分为单元测试与集成测试,而另一些流程,把白盒测试划分为模块单元测试、模块系统测试、多模块集成测试,还有一些流程把单元测试与集成测试混为一体,统称为持续集成测试。,5,采用白盒测试方法必须遵循以下几条原则,保证一个模块中的所有独立路径至少被使用一次 对所有逻辑值均需测试true和false 在上下边界及可操作范围内运行所有循环 检查内部数据结构以确保其有效性 在上下边界及可操作范围内运行所有循环,6,白盒测试的其它称呼,玻璃盒测试(Glass Box Testing) 透明盒测试(Clear Box Testing) 开放盒测试(Open Box Testing) 结构化测试(Structured Testing) 基于代码的测试(Code-Based Testing) 逻辑驱动测试(Logic-Driven Testing),7,本次课程的主要内容,为什么要进行白盒测试 静态白盒测试 动态白盒测试,8,从一个比喻开始,假设有一台的面包机,从上面倒入面粉与水,开动机器后从下面出来的就是烤好了的面包,这个机器的功能比较单一,接口很清晰,输入是面粉与水,输出是面包。现在假定这个面包机多年未用,内部都生锈了,现在要清洗它,类似于我们开发的软件,软件有Bug,那得通过测试来清理。 那如何更快速的清洗这台面包机呢?有两种洗法,一是拿水从上往下灌,这是系统测试的方法。另一种是拆开来洗,拆开机器后,拿抺布沾点清洁剂,把各零件的坑坑槽槽擦洗一遍,然后组装回来,再用水从上往下冲一遍,拆开来洗是白盒方法,组装回来用水冲是黑盒方式,相当于白盒测试之后再追加一次系统测试。,9,无疑,上面第二种方法是正确的,我们的前提是:清洗多年未用的面包机,铁锈够多,如果洗不干净,造出的面包都是致癌物质。当然,清洗面包机还只能算简单劳动,清理软件中的Bug要复杂得多,一个if语句有两条分支,一个while循环判断也是两条分支,还有break、continue、return等,想想看,一个1万行规模的软件能有多少个分支!一个分支就是一条坑坑槽槽,而且软件Bug还具备动态特性,不是静止的明摆在哪儿。 所以,软件的白盒测试不可或缺,因为遗留Bug的影响很大,就像面包机没洗净留铁锈会致癌,还因为软件系统远比面包机复杂,不拆开来怎么能洗干净!,10,白盒测试是高效测试,第一个误解:白盒测试太低效,不值得去做,针对一个功能点的测试,若将问题发现、定位与解决都计算进去,单元测试效率最高,是集成测试的2倍,是系统测试的3倍。,11,白盒测试是高效测试,第二个误解:决策者并未认清一个bug若遗留到下一阶段须多付出多少代价,12,白盒测试能彻底解决编码阶段引入的问题,一个案例,在某交换机产品的系统测试中,发现ISDN话机拨打某新业务号码时,在特定线路上,若一位一位的拨至18位,不会有问题,但如果先拨完号码再成组发送,会导致系统死机。这是一个导致死机的致命问题,最后定位出问题所在:呼叫处理的某段代码判断有误,本应小于18的判断,错写成小于等于18。,这个问题本该在单元测试去发现,由于单元测试没做,问题就遗留到系统测试,庆幸的是没把它遗留到网上,否则问题就大了。我们从另一个角度去反思,这个问题是特定线路下的特定终端,按特定方式拔打特定业务才暴露,在系统测试好不容易把它揪出来,但类似的其它问题呢?,13,不同阶段的测试发现问题的特点各不相同,单元测试阶段,容易发现逻辑问题、边界条件(如上例“小于18”的错误)、变量未初始化、内存越界等问题 集成测试容易发现接口错误、任务配合问题等 系统测试容易发现业务流程问题、界面操作问题等,14,V模型中软件开发过程与测试行为的对应关系,单元测试针对编码阶段引入的问题 集成测试与功能测试针对软件设计中引入的问题 验收测试针对需求与规格。,单元测试不要或缺的重要原因是:编码阶段引入的问题占很高比例,不进行单元测试就难以保证系统最终的稳定性。,15,本次课程的主要内容,为什么要进行白盒测试 静态白盒测试 动态白盒测试,16,静态白盒测试,静态白盒测试是在不执行的条件下有条理地仔细审查软件设计、体系结构和代码,从而找出软件缺陷的过程。 好处: 尽早发现软件缺陷。 为黑盒测试员提供思路。,17,审查 要审查的代码模块的准则 为什么要坚持编码标准和规范 国家和国际标准获得途径 通用代码审查清单 数据引用错误; 数据声明错误; 计算错误; 比较错误; 控制流程错误; 子程序参数错误; 输入/输出错误; 其他检查。,18,静态白盒测试-审查,审查是正式、严格、具有深度的技术评审, 以便尽可能准确地确定问题之所在。 审查过程的目的: 在软件开发过程中尽可能早地发现问题。 确保对需要重做部分达成一致意见。 验证任何重做部分满足预先定义的准则。,19,静态白盒测试,一次审查一般需要5人至7人,这些角色是: 主审员:协调本次审查并主持讨论。 责任人:负责被审查的产品。 讲解员:在审查会上讲解被审查的产品。 审查员:审查产品。 记录员:记录在审查会议上讨论的问题。 经 理:责任人的管理者。,20,静态白盒测试,选择要审查的代码模块的准则: 对于正确操作产品起关键作用的模块。 复杂度较高的模块 与过去发生错误率较高的模块功能类似的模块。 相对较新的或缺乏经验的软件程序师编写的模块。,21,静态白盒测试,为什么要坚持编码标准和规范? 可靠性。 可读性/维护性 移植性,22,静态白盒测试,大多数计算机语言和信息技术的国家和国际标准可 以通过以下途径获得: 国际工程协议(IEC): 国际标准化组织(ISO):www.iso.ch 信息技术标准国家委员会(NCITS): 计算机械联合会(ACM): 电子电气工程学会(IEEE):,23,静态白盒测试-通用代码审查清单,数据引用错误; 数据声明错误; 计算错误; 比较错误; 控制流程错误; 子程序参数错误; 输入/输出错误; 其他检查。,24,静态白盒测试-数据引用错误,是否引用了未初始化的变量? 数组和字符串的下标是整数值吗? 是否在应该使用常量的地方使用了变量? 变量是否被赋予不同类型的值? 为引用的指针分配内存了吗? 一个数据结构是否在多个函数或者子程序中引用,在每一个引用中明确定义结构了吗?,25,静态白盒测试-数据声明错误,所有变量都赋予正确的长度和类型了吗? 变量是否在声明的同时进行了初始化? 存在声明过、但从未引用或者只引用过一次的变量吗? 在特定模块中所有变量都显示声明了吗?,26,静态白盒测试-计算错误,计算中是否使用了不同数据类型的变量? 计算中是否了解和考虑到编译器对类型或长度不一致的变量的转换规则? 在数值计算过程中是否可能出现溢出? 除数/模是否可能为零? 变量的值是否超过有意义的范围? 对于包含多个操作数的表达式,求值的次序是否混乱,运算优先级对吗?,27,静态白盒测试-比较错误,比较得正确吗? 存在分数或者浮点值之间的比较吗?如果有,精确问题会影响比较吗? 每一个逻辑表达式都正确表达了吗?逻辑计算如期进行了吗?求值次序有疑问吗? 逻辑表达式的操作是逻辑值吗?,28,静态白盒测试-控制流程错误,如果程序包含beginend和 do while 等语句组,end是否对应? 程序、模块、子程序和循环能否终止? 可能存在永远不停的循环吗? 循环可能从不执行吗?,29,静态白盒测试-子程序参数错误,子程序接受的参数类型和大小与调用代码发送的匹配吗? 如果子程序有多个入口点,引用的参数是否与当前入口点没有关联? 常量是否当作形参传递,意外在子程序中改动?,30,静态白盒测试-输入/输出错误,软件是否严格遵守外部设备读写数据的专用格式? 文件或者外部不存在或者未准备好的错误情况有处理吗? 软件是否处理外部设备未连接、不可用,或者读写过程中存储空间占满等情况?,31,静态白盒测试-同行审查,仅在编写代码的程序员和充当审查者的其他一两个程序员和测试员之间进行。保证审查的高效率,注意审查的4个关键要素: 确定问题; 遵守规则; 审查准备; 编写报告。,32,静态白盒测试的小结,代码评审 同行审查 检查单,33,本次课程的主要内容,为什么要进行白盒测试 静态白盒测试 动态白盒测试 基本路径测试 逻辑覆盖(逻辑驱动) 语句覆盖 判定覆盖 条件覆盖 判定/条件覆盖 组合覆盖 路径覆盖,34,一些相关概念,语句覆盖:语句覆盖就是设计若干个测试用例,运行被测试程序,使得每一条可执行语句至少执行一次; 判定覆盖(也称为分支覆盖):设计若干个测试用例,运行所测程序,使程序中每个判断的取真分支和取假分支至少执行一次; 条件覆盖:设计足够多的测试用例,运行所测程序,使程序中每个判断的每个条件的每个可能取值至少执行一次; 判定-条件覆盖:设计足够多的测试用例,运行所测程序,使程序中每个判断的每个条件的所有可能取值至少执行一次,并且每个可能的判断结果也至少执行一次,换句话说,即是要求各个判断的所有可能的条件取值组合至少执行一次; 条件组合测试:设计足够多的测试用例,运行所测程序,使程序中每个判断的所有可能的条件取值组合至少执行一次; 路径测试:设计足够多的测试用例,运行所测程序,要覆盖程序中所有可能的路径。,35,下面以例子进行分析讲解,void DoWork(int x,int y,int z) int k=0,j=0; if(x3) /语句块3 ,36,画出上面函数的流程图如下:,37,语句覆盖,为了说明简略,分别对各个判断的取真、取假分支编号为b、c、d、e。 为了测试语句覆盖率只要设计一个测试用例就可以把三个执行语句块中的语句覆盖了。 测试用例输入为: x=4、y=5、z=5 程序执行的路径是:abd 该测试用例虽然覆盖了可执行语句,但并不能检查判断逻辑是否有问题,例如在第一个判断中把&错误的写成了|,则上面的测试用例仍可以覆盖所有的执行语句。可以说语句覆盖率是最弱的逻辑覆盖准则。,38,分支覆盖,对于上面的程序,如果设计两个测试用例则可以满足条件覆盖的要求。 测试用例的输入为: x=4、y=5、z=5 x=2、y=5、z=5 上面的两个测试用例虽然能够满足条件覆盖的要求,但是也不能对判断条件进行检查,例如把第二个条件y5错误的写成y5,、上面的测试用例同样满足了分支覆盖。,39,条件覆盖,条件覆盖就是设计若干个测试用例,运行被测试对象,使得程序中每个判断的每个条件的可能取值至少执行一次。 对例子中的所有条件取值加以标记。例如: 对于第一个判断: 条件x3 取真值为T1,取假值为-T1 条件z5 取真值为T4,取假值为-T4,40,则可以设计测试用例如下,上面的测试用例不但覆盖了所有分支的真假两个分支,而且覆盖了判断中的所有条件的可能值。,41,但是如果设计了下面的测试用例,则虽然满足了条件覆盖,但只覆盖了第一个条件的取假分支和第二个条件的取真分支,不满足分支覆盖的要求。,42,分支条件覆盖,分支条件覆盖就是设计足够的测试用例,使得判断中每个条件的所有可能取值至少执行一次,同时每个判断的所有可能判断结果至少执行,即要求各个判断的所有可能的条件取值组合至少执行一次。 根据定义只需设计以下两个测试用例便可以覆盖8个条件值以及4个判断分支。,43,分支条件覆盖从表面来看,它测试了所有条件的取值,但是实际上某些条件掩盖了另一些条件。 例如对于条件表达式(x3)&(z3)为假则一般的编译器不在判断是否z5)来说,若x=4测试结果为真,就认为表达式的结果为真,这时不再检查(y5)条件了。 因此,采用分支条件覆盖,逻辑表达式中的错误不一定能够查出来了。,分支条件覆盖,44,条件组合覆盖:,条件组合覆盖就是设计足够的测试用例,运行被测试对象,使得每一个判断的所有可能的条件取值组合至少执行一次。 现在对例子中的各个判断的条件取值组合加以标记如下: x3,z3,z=10 记做T1 -T2, 第一个判断的取假分支 x=10 记做-T1 -T2,第一个判断的取假分支 x=4,y5 记做T3 T4, 第二个判断的取真分支 x=4,y5 记做-T3 T4, 第二个判断的取真分支 x!=4,y=5 记做-T3 -T4,第二个判断的取假分支,45,根据定义取4个测试用例,就可以覆盖上面8种条件取值的组合。 测试用例如下表:,上面的测试用例覆盖了所有条件的可能取值的组合,覆盖了所有判断的可取分支,但是却丢失了一条路径abe。,46,路径测试,路径测试就是设计足够多的测试用例,覆盖被测试对象中的所有可能路径。 在上面的测试用例中再添加一个测试用例则可对程序进行了全部的路径覆盖。,47,基本路径测试,上面的例子是一个很简单的程序函数,只有四条路径。但在实践中,一个不太复杂的程序,其路径都是一个庞大的数字,要在测试中覆盖所有的路径是不现实的。为了解决这一难题,只得把覆盖的路径数压缩到一定限度内。 例如,程序中的循环体只执行一次。 下面介绍的基本路径测试就是这样一种测试方法,它在程序控制图的基础上,通过分析控制构造的环行复杂性,导出基本可执行路径集合,从而设计测试用例的方法。设计出的测试用例要保证在测试中程序的每一个可执行语句至少执行一次。,48,前提条件,测试进入的前提条件是在测试人员已经对被测试对象有了一定的了解,基本上明确了被测试软件的逻辑结构。过程是通过针对程序逻辑结构设计和加载测试用例,驱动程序执行,以对程序路径进行测试。测试结果是分析实际的测试结果与预期的结果是否一致。,基本路径测试,代码,49,白盒测试的基本概念,控制流图 环形复杂度 图矩阵,在程序控制流图的基础上,通过 分析控制构造的环路复杂性,导出 基本可执行路径集合,从而设计测 试用例。 包括以下4个步骤和一个工具方法,50,4个步骤和一个工具方法,程序的控制流图:描述程序控制流的一种图示方法。 程序圈复杂度:McCabe复杂性度量。从程序的环路复杂性可导出程序基本路径集合中的独立路径条数,这是确定程序中每个可执行语句至少执行一次所必须的测试用例数目的上界。 导出测试用例:根据圈复杂度和程序结构设计用例数据输入和预期结果。 准备测试用例:确保基本路径集中的每一条路径的执行。 工具方法: 图形矩阵:是在基本路径测试中起辅助作用的软件工具,利用它可以实现自动地确定一个基本路径集。,51,McCabe IQ是美国McCabe (2)McCabe QA为软件系统计算McCabe复杂度,并为它们提供一个易理解可视环境 (3)McCabe Reengineering模块支持各种软件的再工程包括对已有软件系统的维护,改变软件特性,或移植到新的平台或结构中。利用此软件可以帮助我们识别代码中的冗余代码,进行冒险(risk)分析。,52,4个步骤和一个工具方法,程序的控制流图 程序圈复杂度 导出测试用例 准备测试用例 工具方法图形矩阵,53,控制流图,控制流图(可简称流图)是对程序流程图进行简化后得到的,它可以更加突出的表示程序控制流的结构。 控制流图中包括两种图形符号:节点和控制流线。 节点由带标号的圆圈表示,可代表一个或多个语句、一个处理框序列和一个条件判定框(假设不包含复合条件) 控制流线由带箭头的弧或线表示,可称为边。它代表程序中的控制流。 对于复合条件,则可将其分解为多个单个条件,并映射成控制流图。,54,常见结构的控制流图,其中,包含条件的节点被称为判定节点(也叫谓词节点),由判定节点发出的边必须终止于某一个节点,由边和节点所限定的范围被称为区域。,55,例子,如下面的C函数: void Sort(int iRecordNum,int iType) 1 2 int x=0; 3 int y=0; 4 while (iRecordNum- 0) 5 6 if(0= =iType) 7 x=y+2; 8 else 9 if(1= =iType) 10 x=y+10; 11 else 12 x=y+20; 13 14 ,56,第一步:画出控制流图,c/c+语句中的控制语句表示含义如下: 图中的每一个圆称为流图的结点,代表一条或多条语句。流图中的箭头称为边或连接,代表控制流。 为了说明流图的用法,我们采用过程设计表示法,此处,流程图用来描述程序控制结构。可将流程图映射到一个相应的流图(假设流程图的菱形决定框中不包含复合条件)。在流图中,每一个圆,称为流图的结点,代表一个或多个语句。一个处理方框序列和一个菱形决测框可被映射为一个结点,流图中的箭头,称为边或连接,代表控制流,类似于流程图中的箭头。一条边必须终止于一个结点,即使该结点并不代表任何语句(例如:参见if-else-then结构的符号)。由边和结点限定的范围称为区域。计算区域时应包括图外部的范围。 任何过程设计都要被翻译成控制流图。,57,画出其程序流程图和对应的控制流图如下:,58,程序设计中遇到复合条件时,生成的流图变得更为复杂。当条件语句中用到一个或多个布尔运算符(逻辑OR,AND,NAND,NOR)时,就出现了复合条件。下图为语句IF a OR b中的每一个a和b创建了一个独立的结点,包含条件的结点被称为判定结点,从每一个判定结点发出两条或多条边。例如: 1 if a or b 2 x 3 else 4 y 对应的逻辑为:,59,4个步骤和一个工具方法,程序的控制流图 程序圈复杂度 导出测试用例 准备测试用例 工具方法图形矩阵,60,第二步:环形复杂度,环形复杂度也称为圈复杂度,它是一种为程序逻辑复杂度提供定量尺度的软件度量。 环形复杂度的应用可以将环形复杂度用于基本路径方法,它可以提供:程序基本集的独立路径数量;确保所有语句至少执行一次的测试数量的上界。 独立路径是指程序中至少引入了一个新的处理语句集合或一个新条件的程序通路。采用流图的术语,即独立路径必须至少包含一条在本次定义路径之前不曾用过的边。 测试可以被设计为基本路径集的执行过程,但基本路径集通常并不唯一。,61,计算环形复杂度的方法,环形复杂度以图论为基础,为我们提供了非常有用的软件度量。可用如下三种方法之一来计算环形复杂度: 控制流图中区域的数量对应于环形复杂度。 给定控制流图G的环形复杂度V(G),定义为 V(G) = E-N+2 其中,E是控制流图中边的数量,N是控制流图中的节点数量。 给定控制流图G的环形复杂度V(G),也可定义为 V(G) = P+1 其中,P是控制流图G中判定节点的数量。,62,对应上面图中的圈复杂度,计算如下: 流图中有四个区域; V(G)=10条边-8结点+2=4; V(G)=3个判定结点+1=4。,63,4个步骤和一个工具方法,程序的控制流图 程序圈复杂度 导出测试用例 准备测试用例 工具方法图形矩阵,64,第三步:导出测试用例,根据上面的计算方法,可得出四个独立的路径: 路径1:4-14 路径2:4-6-7-14 路径3:4-6-8-10-13-4-14 路径4:4-6-8-11-13-4-14 根据上面的独立路径, 去设计输入数据,使 程序分别执行到上面 四条路径。,65,4个步骤和一个工具方法,程序的控制流图 程序圈复杂度 导出测试用例 准备测试用例 工具方法图形矩阵,66,第四步:准备测试用例,为了确保基本路径集中的每一条路径的执行,根据判断结点给出的条件,选择适当的数据以保证某一条路径可以被测试到,满足上面例子基本路径集的测试用例是: 路径1:4-14 输入数据:iRecordNum0,或者取iRecordNum0的某一个值 预期结果:x0 路径2:4-6-7-14 输入数据:iRecordNum1,iType0 预期结果:x2 路径3:4-6-8-10-13-4-14 输入数据:iRecordNum1,iType1 预期结果:x10 路径4:4-6-8-11-13-4-14 输入数据:iRecordNum1,iType2 预期结果:x20,67,68,4个步骤和一个工具方法,程序的控制流图 程序圈复杂度 导出测试用例 准备测试用例 工具方法图形矩阵,69,工具方法:图矩阵,导出控制流图和决定基本测试路径的过程均需要机械化,为了开发辅助基本路径测试的软件工具,称为图形矩阵(graph matrix)的数据结构很有用。 图矩阵是控制流图的矩阵表示形式。 图矩阵是一个方形矩阵,其维数等于控制流图的节点数。矩阵中的每列和每行都对应于标识的节点,矩阵元素对应于节点间的边。 通常,控制流图中的结点用数字标识,边则用字母标识。如果在控制流图中从第 i 个结点到第 j 个结点有一个标识为 x 的边相连接,则在对应图矩阵的第 i 行第 j 列有一个非空的元素 x 。,70,对每个矩阵项加入连接权值(link weight),图矩阵就可以用于在测试中评估程序的控制结构,连接权值为控制流提供了另外的信息。最简单情况下,连接权值是 1(存在连接)或0(不存在连接),但是,连接权值可以赋予其他属性: 例如: 执行连接(边)的概率。 穿越连接的处理时间。 穿越连接时所需的内存。 穿越连接时所需的资源。,工具方法:图矩阵,71,根据上面的方法 对例子画出图形矩阵,连接权为“1”表示存在一个连接,在图中如果一行有两个或更多的元素“1”,则这行所代表的结点一定是一个判定结点,通过连接矩阵中有两个以上(包括两个)元素为“1”的个数,就可以得到确定该图圈复杂度的另一种算法。,72,PROCEDURE average INTERFACE RETURNS average,total.input,total.valid; INTERFACE ACCEPTS value,minimum,maximum; TYPE value1:100 IS SCALAR ARRAY TYPE average,total.input,total.valid, minimum,maximum,sum IS SCALAR; TYPE i IS INTEGE; . END average,声明部分,处理部分,接下页,例:计算100个数的平均值,并计算和,以及参算总数,73,i = 1; Total.input = total.valid = 0; Sum = 0; DO WHILE valuei -999 AND total.input = minimum AND valei 0 THEN average = sum / total.valid; ELSE average = -999; ENDIF ,以处理代码为基础,画流图,处理部分,74,确定流图的环复杂度,average 流图,2,3,4,5,6,1,8,7,9,10,11,12,13,V(G)= 6个区域 V(G)=17边-13个节点 + 2 = 6 V(G)=5个判定节点 + 1 = 6,75,确定线性独立路径的一个基本集,average 流图,2,3,4,5,6,1,8,7,9,10,11,12,13,路径1:1-2-10-11-13 路径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-8-9-2. 路径6:1-2-3-4-5-6-7-8-9-2.,根据环复杂度计算,6条路径足够覆盖所有的测试路径。选取独立路径6条:,76,准备测试案例,强制执行基本集中的每条路径,准备路径1:1-2-10-11-13 测试案例:,i = 1; Total.input = total.valid = 0; Sum = 0; DO WHILE valuei -999 AND total.input = minimum AND valei 0 THEN average = sum / total.valid; ELSE average = -999; ENDIF ,注意:满足(2)直接到(10)的条件是: valuei=-999 或者 total.input =100 但是,如果一次都没有执行 DO WHILE 则不会执行 (11),因为 total.valid = 0 ,所以路径1无法独立测试,需要结合其它路径的测试来完成,路径1测试案例: valuek=有效输入 valuei=-999 (其中ki) 预期结果:基于k的正确平均值和总和,77,准备测试案例,强制执行基本集中的每条路径,准备路径2:1-2-10-12-13 测试案例:,i = 1; Total.input = total.valid = 0; Sum = 0; DO WHILE valuei -999 AND total.input = minimum AND valei 0 THEN average = sum / total.valid; ELSE average = -999; ENDIF ,路径2测试案例: valuei=-999 预期结果:平均值=-999,78,准备测试案例,强制执行基本集中的每条路径,准备路径3:1-2-3-10-11-13 测试案例:,i = 1; Total.input = total.valid = 0; Sum = 0; DO WHILE valuei -999 AND total.input = minimum AND valei 0 THEN average = sum / total.valid; ELSE average = -999; ENDIF ,路径3测试案例: 前100个数值应该有效 预期结果:正确的100个数的平均值和总和,测试多于100个值的情况,79,准备测试案例,强制执行基本集中的每条路径,准备路径4:1-2-3-4-5-8-9-2. 测试案例:,i = 1; Total.input = total.valid = 0; Sum = 0; DO WHILE valuei -999 AND total.input = minimum AND valei 0 THEN average = sum / total.valid; ELSE average = -999; ENDIF ,路径4测试案例: valuek=有效输入 (其中k100) valuei 最小值 (其中ik) 预期结果:基于k-1的正确平均值和总数,80,准备测试案例,强制执行基本集中的每条路径,准备路径5:1-2-3-4-5-6-8-9-2. 测试案例:,i = 1; Total.input = total.valid = 0; Sum = 0; DO WHILE valuei -999 AND total.input = minimum AND valei 0 THEN average = sum / total.valid; ELSE average = -999; ENDIF ,路径5测试案例: valuek=有效输入 (其中k 最大值 (其中ik) 预期结果:基于k-1的正确平均值和总数,81,准备测试案例,强制执行基本集中的每条路径,准备路径6:1-2-3-4-5-6-7-8-9-2.测试案例:,i = 1; Total.input = total.valid = 0; Sum = 0; DO WHILE valuei -999 AND total.input = minimum AND valei 0 THEN average = sum / total.valid; ELSE average = -999; ENDIF ,路径6测试案例: valuek=有效输入 (其中k100) 预期结果:基于k的正确平均值和总数,82,前面所述的基本路径测试技术是控制结构测试技术之一。尽管基本路径测试简单高效,但是,其本身并不充分。下面讨论控制结构测试的其他变种,这些测试覆盖并提高了白盒测试的质量。 包括: 条件测试 数据流测试 循环测试。,83,条件测试,条件测试是检查程序模块中所包含逻辑条件的测试用例设计方法。一个简单条件是一个布尔变量或一个可能带有NOT(“!”)操作符的关系表达式。关系表达式的形式如: E1关系操作符E2 其中E1和E2是算术表达式,而关系操作符是下列之一:“”、“”、“=”、“”(“!=”)、“”、或“”。复杂条件由简单条件、布尔操作符和括弧组成。我们假定可用于复杂条件的布尔算子包括OR“|”,AND“”和NOT“!”,不含关系表达式的条件称为布尔表达式。所以条件的成分类型包括布尔操作符、布尔变量、布尔括弧(括住简单或复杂条件)、关系操作符或算术表达式。,84,如果条件不正确,则至少有一个条件成分不正确,这样,条件的错误类型如下: 布尔操作符错误(遗漏布尔操作符,布尔操作符多余或布尔操作符不正确); 布尔变量错误; 布尔括弧错误; 关系操作符错误; 算术表达式错误。 条件测试方法注重于测试程序中的条件。条件测试策略主要有两个优点: 首先,测度条件测试的覆盖率是简单的; 其次,程序的条件测试覆盖率为产生另外的程序测试提供了指导。,85,条件测试的目的,条件测试是测试程序条件错误和程序的其他错误。如果程序的测试集能够有效地检测程序中的条件错误,则该测试集可能也会有效地检测程序中的其他错误。此外,如果测试策略对检测条件错误有效,则它也可能有效地检测程序错误。,86,条件测试策略,分支测试可能是最简单的条件测试策略,对于复合条件C,C的真分支和假分支以及C中的每个简单条件都需要至少执行一次。 域测试(Domain testing)要求从有理表达式中导出三个或四个测试,有理表达式的形式如: E1关系操作符E2 需要三个测试分别用于计算E1的值是大于、等于或小于E2的值。如果关系操作符错误,而E1和E2正确,则这三个测试能够发现关系算子的错误。为了发现E1和E2的错误,计算E1小于或大于E2的测试应使两个值间的差别尽可能小。 有n个变量的布尔表达式需要2n个可能的测试(n0)。这种策略可以发现布尔操作符、变量和括弧的错误,但是只有在n很小时实用。,87,也可以派生出敏感布尔表达式错误的测试。对于有n个布尔变量(n0)的单布尔表达式(每个布尔变量只出现一次),可以很容易地产生测试数小于2n的测试集,该测试集能够发现多个布尔操作符错误和其他错误。 建议在上述技术之上建立条件测试策略,称为BRO (branch and relational)测试集。测试保证能发现布尔变量和关系操作符只出现一次而且没有公共变量的条件中的分支和条件操作符错误。,88,BRO策略利用条件C的条件约束。有n个简单条件的条件C的条件约束定义为(D1,D2,Dn),其中Di(0in)表示条件C中第i个简单条件的输出约束。如果C的执行过程中C的每个简单条件的输出都满足D中对应的约束,则称条件C的条件约束D由C的执行所覆盖。 对于布尔变量B,B输出的约束说明B必须是真(T)或假(F)。类似地,对于关系表达式,符号、=、用于指定表达式输出的约束。,89,考虑条件C1B1B2 其中B1和B2是布尔变量。C1的条件约束式如(D1,D2),其中D1和D2是“T”或“F”,值(T,F)是C1的条件约束,由使B1为真、B2为假的测试所覆盖。BRO测试策略要求约束集(T,T),(F,T),(T,F)由C1的执行所覆盖,如果C1由于布尔算子的错误而不正确,至少有一个约束强制C1失败。,例子,90,考虑 C2B1(E3=E4) 其中B1是布尔表达式,而E3和E4是算术表达式。C2的条件约束形式如(D1,D2),其中D1是“T”或“F”,D2是,=或。 除了C2的第二个简单条件是关系表达式以外,C2和C1相同,所以可以修改C1的约束集(T,T),(F,T),(T,F),得到C2的约束集,注意(E3=E4)的“T”意味着“=”,而(E3=E4)的“F”意味着“”或“”。分别用(T,=)和(F,=)替换(T,T)和(F,T),并用(T,)和(T,)替换(T,F),就得到C2的约束集(T,=),(F,=),(T,),(T,)。 上述条件约束集的覆盖率将保证检测C2的布尔和关系算子的错误。,第二个例子,91,C3(E1E2)(E3=E4) 其中E1、E2、E3和E4是算术表达式。C3的条件约束形式如(D1,D2),其中D1和D2是、=或。除了C3的第一个简单条件是关系表达式以外,C3和C2相同,所以可以修改C2的约束集得到C3的约束集,结果为 (,=),(=,=),(,=),(,),(,) 上述条件约束集能够保证检测C3的关系操作符的错误。,第三个例子,92,2、 数据流测试,数据流测试方法按照程序中的变量定义和使用的位置来选择程序的测试路径。 为了说明数据流测试方法,假设程序的每条语句都赋予了独特的语句号,而且每个函数都不改变其参数和全局变量。对于语句号为S的语句, DEF(S)=X语句S包含X的定义 USE(S)=X语句S包含X的使用 如果语句S是if或循环语句,它的DEF集为空,而USE集取决于S的条件。如果存在从S到S的路径,并且该路径不含X的其他定义,则称变量X在语句S处的定义在语句S仍有效。,93,变量X的定义使用链(或称DU链)形式如X,S,S,其中S和S是语句号,X在DEF(S)和USE(S)中,而且语句S定义的X在语句S有效。 一种简单的数据流测试策略是要求覆盖每个DU链至少一次。我们将这种策略称为DU测试策略。 已经证明DU测试并不能保证覆盖程序的所有分支,但是,DU测试不覆盖某个分支仅仅在于如下之类的情况:if-then-else中的then没有定义变量,而且不存在else部分。这种情况下,if语句的else分支并不需要由DU测试覆盖。 数据流测试策略可用于为包含嵌套if和循环语句的程序选择测试路径,为此,考虑使用DU测试为如下的PDL(语言工具)选择测试路径:,从变量的定义到变量的使用,94,proc x B1; do while C1 if C2 then if C4 then B4; else B5; endif; else if C3 then B2; else B3; endif; endif; enddo; B6; end proc;,为了用DU测试选择控制流图的测试路径,需要知道PDL条件或块中的变量定义和使用。 假设变量X定义在块B1,B2,B3,B4和B5的最后一条语句之中,并在块B2,B3,B4,B5和B6的第一条语句中使用。 DU测试策略要求执行从每个B(0i5)到Bj(0j6)的最短路径(这样的测试也覆盖了条件C1,C2,C3和C4中的变量使用)。 尽管有25条X的DU链,只需5条路径覆盖这些DU链。原因在于可用5条从Bi(0i5)到B6的路径覆盖X的链,而这5条链包含循环的迭代就可以覆盖其他的DU链。,95,注意 如果要用分支测试策略为上述的PDL选择测试路径,并不需要另外的信息。为了选择BRO测试的路径,只需知道每个条件和块的结构。(选择程序的路径之后,需要决定该路径是否实用于该程序,即是否存在执行该路径的至少一个输入)。 由于变量的定义和使用,程序中的语句都彼此相关,所以数据流测试方法能够有效地发现错误,但是,数据流测试的覆盖率测度和路径选择比条件测试更为困难。,96,3、循环测试,循环测试是一种白盒测试技术,注重于循环构造的有效性。 有四种循环:简单循环,串接循环,嵌套循环和不规则循环。,97,下列测试集用于简单循环,其中n是允许通过循环的最大次数。 整个跳过循环; 只有一次通过循环; 两次通过循环; m次通过循环,其中mn; n-1,n,n+1次通过循环。,简单循环:,98,如果将简单循环的测试方法用于嵌套循环,可能的测试数就会随嵌套层数成几何级增加,这会导致不实际的测试数目,下面是一种减少测试数的方法: 从最内层循环开始,将其它循环设置为最小值; 对最内层循环使用简单循环,而使外层循环的跌代参数 (即循环计数)最小,并为范围外或排除的值增加其它测 试; 由内向外构造下几个循环的测试,但其它的

温馨提示

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

最新文档

评论

0/150

提交评论