实现数据库原理_第1页
实现数据库原理_第2页
实现数据库原理_第3页
实现数据库原理_第4页
实现数据库原理_第5页
已阅读5页,还剩125页未读 继续免费阅读

下载本文档

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

文档简介

第一页,共一百三十二页,编辑于2023年,星期五软件测试基础本章内容7.2单元测试7.3集成测试7.4确认测试7.5白盒测试技术7.67.1编码7.7黑盒测试技术7.8调试第二页,共一百三十二页,编辑于2023年,星期五编码通常把编码和测试统称为实现?编码就是把软件设计结果翻译成用某种程序设计语言书写的程序编码是对设计的进一步具体化程序的质量主要取决于软件设计的质量程序设计语言的特点及编码风格将影响程序的可靠性、可读性、可测试性和可维护性编码过程中还不可避免地会引入新的错误测试主要是准对编码进行的,测试和编码反复进行,而且单元测试和编码还是同一个人完成的第三页,共一百三十二页,编辑于2023年,星期五测试测试是在软件投入生产性运行之前,尽可能多地发现软件中的错误,调试的目:诊断并改正测试发现的错误是保证软件质量的关键步骤对软件规格说明、设计和编码的最后复审软件测试包括单元测试和整体测试两个阶段测试的工作量占软件开发总工作量的40%以上第四页,共一百三十二页,编辑于2023年,星期五7.1.1选择程序设计语言编码之前第一步要做的事情就是选择程序设计语言通常用高级语言写的程序容易阅读,容易测试,容易调试,容易维护。(效率高)第五页,共一百三十二页,编辑于2023年,星期五7.1.1选择程序设计语言选择程序设计语言的标准:1、系统用户的要求:由用户负责维护的时候2、可以使用的编译程序3、可以得到的软件工具(开发工具和数据库)4、工程规模5、程序员的知识6、软件可移植性要求7、软件的应用领域Fortran合适科学计算,cobol合适商业领域,lisp合适组合问题,prolog合适人工智能第六页,共一百三十二页,编辑于2023年,星期五7.1.2编码风格源代码质量标准:逻辑简明清晰、易读易懂,为了做到这点应该遵循的规则:程序内部的文档:数据说明:次序应该标准化、字母顺序语句构造规则不要为了节省空间而把多个语句写在同一行;尽量避免复杂的条件判断;尽量减少对“非”条件的判断;避免大量使用循环嵌套和条件嵌套;利用括号使逻辑表达式或算术表达式的运算次序清晰直观。标识符、注解、程序视角组织第七页,共一百三十二页,编辑于2023年,星期五编码风格4.

输入输出风格的规则对所有输入数据都进行检验;检查输入项重要组合的合法性;保持输入格式简单;使用数据结束标记,不要要求用户指定数据的数目;明确提示交互式输入的请求,详细说明可用的选择或边界数值;当程序设计语言对格式有严格要求时,应保持输入格式一致;设计良好的输出报表;给所有输出数据加标志。如果有多个输入组合的话第八页,共一百三十二页,编辑于2023年,星期五编码风格5.效率:处理机时间和存储器容量和输入输出效率是性能要求,在需求分析阶段确定效率是靠好设计来提高的不要牺牲程序的清晰性和可读性来提高效率(1)程序运行时间1、算法的复杂度2、写程序的规则:第九页,共一百三十二页,编辑于2023年,星期五编码风格(2)存储器效率使用结构化控制结构、适当的编译程序和语言(3)输入输出的效率1、使用缓冲减少通信开销;2、二级存储器(硬盘)选用最简单的访问方法3、二级存储器(硬盘)数据传送以组为单位4、如果高效率输入输出不好被理解,则放弃第十页,共一百三十二页,编辑于2023年,星期五7.2软件测试基础

7.2.1软件测试的目标软件测试和其他阶段的思路区别:“建设性”和“破坏性”。测试阶段的根本目标:是尽可能多地发现并排除软件中潜藏的错误,最终把一个高质量的软件系统交给用户使用。(1)测试是为了发现程序中的错误而执行程序的过程;(2)好的测试方案是极可能发现迄今为止尚未发现的错误的测试方案;(3)成功的测试是发现了至今为止尚未发现的错误的测试。通常由第三方或测试机构来完成测试工作测试决不能证明程序是正确的第十一页,共一百三十二页,编辑于2023年,星期五7.2.2软件测试准则(1)所有测试都应该能追溯到用户需求。 对需求进行确认(p56)(2)应该远在测试开始之前就制定出测试计划。 设计阶段制定详细的测试方案(p93)(3)Pareto错误集聚现象:测试发现的错误中的80%很可能是由程序中20%的模块造成的。(4)先进行“小规模”测试,并逐步进行“大规模”测试。(5)穷举测试是不可能的。(6)由独立的第三方从事测试工作。对所有的执行路径都检查一遍的测试第十二页,共一百三十二页,编辑于2023年,星期五例:Windows95有1000万行代码

Windows2000有5000万行代码Exchange2000和Windows2000开发人员结构Exchange2000Windows2000项目经理25人约250人开发人员140人约1700人测试人员350人约3200人第十三页,共一百三十二页,编辑于2023年,星期五7.2.3测试方法黑盒测试法(功能测试):完全不考虑程序的内部结构和处理过程。只在程序接口进行的测试,只检查程序功能是否能按照规格说明书的规定正常使用,程序是否能适当地接收输入数据并产生正确的输出信息,程序运行过程中能否保持外部信息的完整性。白盒测试法(结构测试):把程序看成装在一个透明的白盒子里,程序的结构和处理算法完全可见。按照程序内部的逻辑测试程序,检测程序中的主要执行通路是否都能按预定要求正确工作。第十四页,共一百三十二页,编辑于2023年,星期五7.2.4测试步骤大型软件系统的测试过程由以下步骤组成:1.模块测试模块测试的目的是保证每个模块作为一个单元能正确运行,所以模块测试通常又称为单元测试该步骤中通常发现编码和详细设计的错误2.子系统测试子系统测试是把经过单元测试的模块放在一起形成一个子系统来测试着重测试模块接口间的协调和通信第十五页,共一百三十二页,编辑于2023年,星期五测试步骤3.系统测试系统测试是把经过测试的子系统装配成一个完整的系统来测试应该验证系统确实能提供需求说明书中指定的功能、性能、可靠性等要求往往发现软件设计或需求说明中的错误集成测试:子系统测试与系统测试第十六页,共一百三十二页,编辑于2023年,星期五测试步骤4.验收测试(确认测试)把软件系统作为单一的实体进行测试,测试内容与系统测试基本类似在用户积极参与下,使用实际数据(系统将来要处理的信息)进行测试验收测试的目的是验证系统确实能够满足用户的需要往往发现系统需求说明书中的错误第十七页,共一百三十二页,编辑于2023年,星期五测试步骤5.平行运行同时运行新开发出来的系统和将被它取代的旧系统,以便比较新旧两个系统的处理结果。具体目的有如下几点:(1)可以在准生产环境中运行新系统而又不冒风险;(2)用户能有一段熟悉新系统的时间;(3)可以验证用户指南和使用手册之类的文档;(4)能够以准生产模式对新系统进行全负荷测试,可以用测试结果验证性能指标。第十八页,共一百三十二页,编辑于2023年,星期五测试步骤第十九页,共一百三十二页,编辑于2023年,星期五测试步骤第二十页,共一百三十二页,编辑于2023年,星期五7.2.5测试阶段的信息流测试阶段输入信息的信息流有两类:(1)软件配置,包括需求说明书、设计说明书和源程序清单等;(2)测试配置,包括测试计划和测试方案。测试方案包括测试时使用的输入数据(称为测试用例)、每组输入数据预定要检验的功能以及每组输入数据预期的正确输出。最终提交的软件配置应该包括测试配置、测试的实际结果和调试的记录第二十一页,共一百三十二页,编辑于2023年,星期五测试阶段的信息流第二十二页,共一百三十二页,编辑于2023年,星期五经验如果测试经常出现要修改设计,那软件质量和可靠性值得怀疑,不出现这样的情况,则还有两种可能:(1)软件的可靠性是可以接受的;(2)所进行的测试尚不足以发现严重的错误。若测试没有发现错误,则很可能是因为测试不充分,无法暴露潜藏的错误。隐藏的错误最终将被用户发现,在维护阶段改正它们,要付出高出许多倍的代价。第二十三页,共一百三十二页,编辑于2023年,星期五7.3单元测试集中检测软件设计的最小单元——模块单元测试和编码属于软件过程的同一个阶段可以应用人工测试和计算机测试这样两种不同类型的测试方法,完成单元测试工作单元测试主要使用白盒测试技术并行地进行第二十四页,共一百三十二页,编辑于2023年,星期五7.3.1测试重点1.模块接口检查参数的数目、次序、属性或单位系统与变元是否一致;是否修改了只作输入用的变元;全局变量的定义和用法在各个模块中是否一致。2.局部数据结构主要发现局部数据说明、初始化、默认值等方面的错误。3.重要的执行通路选择最有代表性、最可能发现错误的执行通路进行测试,用来发现由于错误的计算、不正确的比较或不适当的控制流而造成的错误。数据库中最小存储和处理单位数据库中最小存储和处理单位第二十五页,共一百三十二页,编辑于2023年,星期五测试重点4.出错处理通路好的设计应该能预见出现错误的条件,设置适当的处理错误的通路。程序中应包含出错处理通路,并认真测试这种通路。评价出错处理通路时,着重测试下述可能发生的错误:(1)对错误的描述是难以理解的;(2)记下的错误与实际遇到的错误不同;(3)在对错误进行处理之前,错误条件已经引起系统干预;(4)对错误的处理不正确;(5)描述错误的信息不足以帮助确定造成错误的位置。第二十六页,共一百三十二页,编辑于2023年,星期五测试重点5.边界条件边界测试是单元测试中最后的也可能是最重要的任务。什么是边界?软件常常在它的边界上失效。如:数组的循环使用刚好小于、刚好等于和刚好大于最大值或最小值的数据结构、控制量和数据值的测试方案,容易发现错误。第二十七页,共一百三十二页,编辑于2023年,星期五7.3.2代码审查由审查小组正式进行人工测试源程序。是一种非常有效的程序验证技术,通常可以查出30%~70%的逻辑设计错误和编码错误。审查小组最好由下述4人组成:(1)组长,应该是一个很有能力的程序员,而且没有直接参与这项工程;(2)程序的设计者;(3)程序的编写者;(4)程序的测试者。第二十八页,共一百三十二页,编辑于2023年,星期五审查会1、小组成员先研究设计说明书,力求理解这个设计。2、审查会上先由设计者扼要地介绍他的设计。3、由程序的编写者逐句解释他是怎样用程序代码实现这个设计的逻辑,小组其他成员仔细倾听他的讲解,并力图发现其中的错误。4、对照程序设计常见错误清单,分析审查这个程序。5、当发现错误时由组长记录下来,审查会继续进行(审查小组的任务是发现错误而不是改正错误)。代码审查可以发现许多错误,减少系统验证的总工作量。应与计算机测试配合使用,提高查找错误的效率。第二十九页,共一百三十二页,编辑于2023年,星期五7.3.3计算机测试辅助模块:驱动软件和(或)存根软件。驱动程序就是一个“主程序”,它接收测试数据,把这些数据传送给被测试的模块,并且印出有关的结果。存根程序代替被测试的模块所调用的模块,也称为“虚拟子程序”、“桩模块”。做最少量的数据操作,印出对入口的检验或操作结果,并且把控制归还给调用它的模块。不作为软件产品的一部分交给用户第三十页,共一百三十二页,编辑于2023年,星期五驱动模块和桩模块第三十一页,共一百三十二页,编辑于2023年,星期五驱动模块和桩模块例如,要测试其中编号为3.0的关键模块——正文编辑模块。需要有一个测试驱动程序来调用它,说明必要的变量,接收测试数据——字符串,并且设置正文编辑模块的编辑功能;正文编辑模块3.0通过调用存根程序模拟下层模块来完成简化的编辑功能。可以设置的编辑功能只有修改(CHANGE)和添加(APPEND)两种,用控制变量CFUNCT标记要求的编辑功能。以下是用伪码书写的存根程序和驱动程序。第三十二页,共一百三十二页,编辑于2023年,星期五图7.2正文加工系统的层次图第三十三页,共一百三十二页,编辑于2023年,星期五存根程序TESTSTUB(*测试正文编辑模块用的存根程序*) 初始化; 输出信息“进入了正文编辑程序”; 输出“输入的控制信息是”CFUNCT; 输出缓冲区中的字符串;

IFCFUNCT=CHANGE THEN 把缓冲区中第二个字改为***//测试修改

ELSE 在缓冲区的尾部加???//测试添加

END IF; 输出缓冲区中的新字符串;ENDTESTSTUB第三十四页,共一百三十二页,编辑于2023年,星期五驱动程序TESTDRIVER(*测试正文编辑模块用的驱动程序*) 说明长度为2500个字符的一个缓冲区; 把CFUNCT置为希望测试的状态; 输入字符串; 调用正文编辑模块; 停止或再次初启;ENDTESTDRIVER第三十五页,共一百三十二页,编辑于2023年,星期五7.4集成测试集成测试是测试和组装软件的系统化技术目标是发现与接口有关的问题发现问题:数据穿过接口时可能丢失;把子功能组合起来可能不产生预期的主功能;个别看来是可以接受的误差可能积累到不能接受的程度;全程数据结构可能有问题。。。。。。第三十六页,共一百三十二页,编辑于2023年,星期五组装策略模块组装成程序有两种方法:1、非渐增式测试:先分别测试每个模块,再把所有模块按设计要求放在一起结合成所要的程序;2、渐增式测试:把下一个要测试的模块同已经测试好的那些模块结合起来进行测试,测试完以后再把下一个应该测试的模块结合进来测试。同时完成单元测试和集成测试。渐增方式下有自顶向下和自底向上两种集成策略。第三十七页,共一百三十二页,编辑于2023年,星期五非渐增式测试第三十八页,共一百三十二页,编辑于2023年,星期五渐增式测试——自顶向下第三十九页,共一百三十二页,编辑于2023年,星期五渐增式测试——自底向上第四十页,共一百三十二页,编辑于2023年,星期五两种集成策略优缺点非渐增式测试一下子把所有模块放在一起,并把庞大的程序作为一个整体来测试,难于诊断定位一个错误;一旦改正一个错误之后,马上又会遇到新的错误。渐增式测试把程序划分成小段来构造和测试,比较容易定位和改正错误;对接口可以进行更彻底的测试;可以使用系统化的测试方法。目前普遍采用渐增式测试方法。第四十一页,共一百三十二页,编辑于2023年,星期五7.4.1自顶向下集成自顶向下集成方法:从主控制模块开始,沿着程序的控制层次向下移动,逐渐把各个模块结合起来。在把主控制模块的附属模块组装到程序结构中去时,它包括深度优先和宽度优先两种组装策略。深度优先的结合方法先组装在软件结构的一条主控制通路上的所有模块。宽度优先的结合方法是沿软件结构水平地移动,把处于同一个控制层次上的所有模块组装起来。第四十二页,共一百三十二页,编辑于2023年,星期五自顶向下结合第四十三页,共一百三十二页,编辑于2023年,星期五具体集成过程第一步,对主控制模块进行测试,测试时用存根程序代替所有直接附属于主控制模块的模块;第二步,根据选定的结合策略(深度优先或宽度优先),每次用一个实际模块代换一个存根程序(新结合进来的模块往往又需要新的存根程序);第三步,在结合进一个模块的同时进行测试;第四步,为了保证加入模块没有引进新的错误,可能需要进行回归测试(即,全部或部分地重复以前做过的测试)。从第二步开始不断地重复进行上述过程,直到构造起完整的软件结构为止。第四十四页,共一百三十二页,编辑于2023年,星期五7.4.2自底向上集成这种组装的方式是从程序模块结构的最底层的模块开始组装和测试。因为模块是自底向上进行组装,对于一个给定层次的模块,它的子模块(包括子模块的所有下属模块)已经组装并测试完成,所以不再需要桩模块。在模块的测试过程中需要从子模块得到的信息可以直接运行子模块得到。第四十五页,共一百三十二页,编辑于2023年,星期五自底向上集成的过程第一步,把低层模块组合成实现某个特定软件子功能的族;第二步,写一个驱动程序(用于测试的控制程序),协调测试数据的输入和输出;第三步,对由模块组成的子功能族进行测试;第四步,去掉驱动程序,沿软件结构自下向上移动,把子功能族组合起来形成更大的子功能族。上述第二步到第四步实质上构成了一个循环。第四十六页,共一百三十二页,编辑于2023年,星期五自底向上结合第四十七页,共一百三十二页,编辑于2023年,星期五7.4.3不同集成测试策略的比较自顶向下测试方法的主要优点是不需要测试驱动程序,能够在测试阶段的早期实现并验证系统的主要功能,及早发现上层模块的接口错误。自顶向下测试方法的主要缺点是需要存根程序,可能产生测试困难,低层关键模块中的错误发现较晚,在早期不能充分展开人力。两种方法的优缺点刚好相反。第四十八页,共一百三十二页,编辑于2023年,星期五混合集成策略改进的自顶向下测试方法。

基本上使用自顶向下的测试方法,但是在早期使用自底向上的方法测试软件中的少数关键模块。具有自顶向下方法的优点,而且能在测试的早期发现关键模块中的错误;它的缺点是测试关键模块时需要驱动程序。(2)混合法。对软件结构中较上层使用的自顶向下方法与对软件结构中较下层使用的自底向上方法相结合。兼有两种方法的优点和缺点,当关键模块比较多时是最好的折衷方法。第四十九页,共一百三十二页,编辑于2023年,星期五回归测试集回归测试是指重新执行已经做过的测试的某个子集,以保证最新变化没有带来非预期的副作用。为限制回归测试用例的数量,应该把回归测试集设计成只包括可以检测程序每个主要功能中的一类或多类错误的那样一些测试用例。第五十页,共一百三十二页,编辑于2023年,星期五7.5确认测试确认测试(验收测试),它的目标是验证软件的有效性。确认(validation)指的是为了保证软件确实满足了用户需求而进行的一系列活动。验证(verification)指的是保证软件正确地实现了某个特定要求的一系列活动。第五十一页,共一百三十二页,编辑于2023年,星期五软件有效性软件有效性的简单定义:如果软件的功能和性能如同用户所合理期待的那样,软件就是有效的。需求分析阶段产生的软件需求规格说明书,准确地描述了用户对软件的合理期望,因此是软件有效性的标准,也是进行确认测试的基础。第五十二页,共一百三十二页,编辑于2023年,星期五7.5.1确认测试的范围确认测试必须有用户积极参与,或者以用户为主进行。用户参与设计测试方案,使用用户界面输入测试数据并且分析评价测试的输出结果。确认测试通常使用黑盒测试法。应该仔细设计测试计划和测试过程通过测试和调试要确认软件能满足所有功能和性能要求,文档资料是准确而完整的,还应该保证软件能满足其他预定的要求(例如,安全性、可移植性、兼容性和可维护性等)。第五十三页,共一百三十二页,编辑于2023年,星期五7.5.2软件配置复查是确认测试的一个重要内容目的是保证软件配置的所有成分都齐全,质量符合要求,文档与程序完全一致,具有完成软件维护所必须的细节,而且已经编好目录。还应该检验用户指南及其他操作程序的完整性和正确性记录发现的遗漏或错误,并且适当地补充和改正。第五十四页,共一百三十二页,编辑于2023年,星期五7.5.3Alpha和Beta测试验收测试是由最终用户进行,能够发现随着时间流逝降低系统质量的累积错误。产品软件通常使用Alpha测试和Beta测试。Alpha测试由用户在开发现场,在开发者的“指导”下进行测试(受控环境)。开发者负责记录发现的错误和使用中遇到的问题。Beta测试由软件的用户在实际使用环境中进行。开发者不在现场。用户把遇到的一切问题记录并定期报告。开发者根据报告的问题对软件进行修改,发布最终的软件产品。第五十五页,共一百三十二页,编辑于2023年,星期五7.6白盒测试技术设计测试方案是测试阶段的关键技术问题。测试方案包括具体的测试目的(要测试的具体功能),应该输入的测试数据和预期的结果。通常又把测试数据和预期的输出结果称为测试用例。关键问题是设计测试用的输入数据。选用少量“最有效的”测试数据,做到尽可能完备的测试。第五十六页,共一百三十二页,编辑于2023年,星期五7.6.1逻辑覆盖测试选择执行程序中最有代表性的通路替代穷尽测试。逻辑覆盖是对一系列测试过程的总称,根据测试数据执行(覆盖)程序逻辑的程度划分等级,进行越来越完整的通路测试。根据流程图,分析下不同的覆盖标准。第五十七页,共一百三十二页,编辑于2023年,星期五例(A>1)

and

(B=0)(A=2)

or

(X>1)X=X/AX=X+1TTFFabdce第五十八页,共一百三十二页,编辑于2023年,星期五L1(ace)={(A>1)and(B=0)}and{(A=2)or(X/A>1)}=(A>1)and(B=0)and(A=2)or(A>1)and(B=0)and(X/A>1)=(A=2)and(B=0)

or

(A>1)and(B=0)and(X/A>1)

逻辑路径第五十九页,共一百三十二页,编辑于2023年,星期五L2(abd)=not{(A>1)and(B=0)}

andnot{(A=2)or(X>1)}={not(A>1)ornot(B=0)}and

{not(A=2)andnot(X>1)}=

not(A>1)andnot(A=2)andnot(X>1)

or

not(B=0)and

not(A=2)andnot(X>1)逻辑路径第六十页,共一百三十二页,编辑于2023年,星期五L3(abe)=not{(A>1)and(B=0)}and

{(A=2)or(X>1)}={not(A>1)ornot(B=0)}and

{(A=2)or(X>1)}=not(A>1)and(A=2)

or

not(A>1)and

(X>1)

or

not(B=0)and(A=2)

or

not(B=0)and(X>1)逻辑路径第六十一页,共一百三十二页,编辑于2023年,星期五L4(acd)={(A>1)and(B=0)}

andnot

{(A=2)or(X/A>1)}=(A>1)and(B=0)andnot(A=2)and

not(X/A>1)逻辑路径第六十二页,共一百三十二页,编辑于2023年,星期五1.语句覆盖

语句覆盖就是设计若干个测试用例,运行被测程序,使得每一可执行语句至少执行一次。在图例中,选择路径L1设计测试用例,就可以覆盖所有的可执行语句。为图例设计满足语句覆盖的测试用例是:

【(2,0,4),(2,0,3)】覆盖ace【L1】第六十三页,共一百三十二页,编辑于2023年,星期五语句覆盖的缺点语句覆盖是很弱的逻辑覆盖标准。例如:intfoo(inta,intb)

{

returna/b;

}假如我们的测试人员编写如下测试案例:TeseCase:a=10,b=5测试人员的测试结果会告诉你,他的代码覆盖率达到了100%,并且所有测试案例都通过了。然而遗憾的是,我们的语句覆盖率达到了所谓的100%,但是却没有发现最简单的Bug,比如,当我让b=0时,会抛出一个除零异常。第六十四页,共一百三十二页,编辑于2023年,星期五判定覆盖就是设计若干个测试用例,运行被测程序,使得程序中每个判断的取真分支和取假分支至少经历测试一次。对于图例,如果选择路径L1和L2,就可得满足要求的测试用例:2.判定覆盖(分支覆盖)【(2,0,4),(2,0,3)】覆盖ace【L1】

【(1,1,1),(1,1,1)】覆盖abd【L2】(A=2)and(B=0)

or

(A>1)and(B=0)and(X/A>1)

not(A>1)andnot(A=2)andnot(X>1)

ornot(B=0)and

not(A=2)andnot(X>1)第六十五页,共一百三十二页,编辑于2023年,星期五如果选择路径L3和L4,还可得另一组可用的测试用例:

【(2,1,1),(2,1,2)】覆盖abe【L3】

【(3,0,3),(3,0,1)】覆盖acd【L4】not(A>1)and(X>1)

ornot(B=0)and

(A=2)

ornot(B=0)and(X>1)(A>1)and(B=0)andnot(A=2)and

not(X/A>1)判定覆盖(分支覆盖)没有对每一个条件进行检查,如果判定2中的条件X>1误写成X>2,不一定能被发现。第六十六页,共一百三十二页,编辑于2023年,星期五3.条件覆盖条件覆盖就是设计若干个测试用例,运行被测程序,使得程序中每个判断的每个条件的可能取值至少执行一次。在图例中,事先可对所有条件的取值加以标记。对于第一个判断:条件A>1取真,取假

条件B=0取真,取假对于第二个判断:条件A=2取真,取假

条件X>1取真,取假第六十七页,共一百三十二页,编辑于2023年,星期五测试用例

覆盖分支

条件取值【(2,0,4),(2,0,3)】L1(c,e)

【(1,0,1),(1,0,1)】L2(b,d)【(2,1,1),(2,1,2)】L3(b,e)或【(1,0,3),(1,0,4)】L3(b,e)

【(2,1,1),(2,1,2)】L3(b,e)

满足条件覆盖,却不一定满足判定覆盖。条件覆盖第六十八页,共一百三十二页,编辑于2023年,星期五判定-条件覆盖就是设计足够的测试用例,使得判断中每个条件的所有可能取值至少执行一次,每个判断中的每个分支至少执行一次。

测试用例

覆盖分支

条件取值【(2,0,4),(2,0,3)】L1(c,e)【(1,1,1),(1,1,1)】L2(b,d)4、判定/条件覆盖(A=2)and(B=0)

or

(A>1)and(B=0)and(X/A>1)

not(A>1)andnot(A=2)andnot(X>1)

ornot(B=0)and

not(A=2)andnot(X>1)第六十九页,共一百三十二页,编辑于2023年,星期五5、条件组合覆盖条件组合覆盖就是设计足够的测试用例,运行被测程序,使得每个判断的所有可能的条件取值组合至少执行一次。记①A>1,B=0作

②A>1,B≠0作③A≯1,B=0作④A≯1,B≠0作

⑤A=2,X>1作

⑥A=2,X≯1作

⑦A≠2,X>1作

⑧A≠2,X≯1作第七十页,共一百三十二页,编辑于2023年,星期五

测试用例

路径

覆盖条件

覆盖组合【(2,0,4),(2,0,3)】(L1) ①,⑤【(2,1,1),(2,1,2)】(L3) ②,⑥【(1,0,3),(1,0,4)】(L3) ③,⑦【(1,1,1),(1,1,1)】(L2) ④,⑧是前述几种覆盖标准中最强的。满足条件组合覆盖标准的测试数据并不一定能使程序中的每条路径都执行到。5、条件组合覆盖第七十一页,共一百三十二页,编辑于2023年,星期五6.点覆盖点覆盖定义:如果连通图G的子图G′是连通的,而且包含G的所有结点,则称G′是G的点覆盖。满足点覆盖标准要求选取足够多的测试数据,使得程序执行路径至少经过流图(连通的有向图)的每个结点(若干条语句)一次,显然,点覆盖标准和语句覆盖标准是相同的。第七十二页,共一百三十二页,编辑于2023年,星期五7.边覆盖边覆盖定义:如果连通图G的子图G″是连通的,而且包含G的所有边,则称G″是G的边覆盖。为了满足边覆盖的测试标准,要求选取足够多测试数据,使得程序执行路径至少经过流图中每条边一次。通常边覆盖和判定覆盖是一致的。第七十三页,共一百三十二页,编辑于2023年,星期五8.路径覆盖路径测试就是设计足够的测试用例,覆盖程序中所有可能的路径。

测试用例

通过路径

覆盖条件【(2,0,4),(2,0,3)】ace(L1)

【(1,1,1),(1,1,1)】abd

(L2)

【(1,1,2),(1,1,3)】abe

(L3)

【(3,0,3),(3,0,1)】acd

(L4)

满足路径覆盖,未必满足条件组合覆盖,通常把两种覆盖结合起来测试。 第七十四页,共一百三十二页,编辑于2023年,星期五7.6.2控制结构测试1.基本路径测试基本思想:在程序控制流图的基础上,首先计算程序的环形复杂度,并用该复杂度为指南定义基本可执行路径集合,从该基本集合导出的测试用例可以保证程序中的每条语句至少执行一次,而且每个条件在执行时都将分别取真、假两种值。第七十五页,共一百三十二页,编辑于2023年,星期五基本路径测试的步骤设计测试用例的步骤如下:第一步,根据过程设计结果画出相应的流图。第二步,计算流图的环形复杂度。环形复杂度定量度量程序的逻辑复杂性。可以用3种方法之一计算环形复杂度。图7.6所示流图的环形复杂度为6。第三步,确定线性独立路径的基本集合。第七十六页,共一百三十二页,编辑于2023年,星期五第七十七页,共一百三十二页,编辑于2023年,星期五独立路径是指至少引入程序的一个新处理语句集合或一个新条件的路径,即独立路径至少包含一条在定义该路径之前不曾用过的边。程序的环形复杂度决定了程序中独立路径的数量,这个数是确保程序中所有语句至少被执行一次所需的测试数量的上界。图7.6所描述的求平均值过程共有6条独立路径。Path1:1-2-10-11-13Path2:1-2-10-12-13Path3:1-2-3-10-11-13Path4:1-2-3-4-5-8-9-2-…Path5:1-2-3-4-5-6-8-9-2-…Path6:1-2-3-4-5-6-7-8-9-2-…独立路径第七十八页,共一百三十二页,编辑于2023年,星期五第四步,设计可强制执行基本集合中每条路径的测试用例。某些独立路径不能以独立的方式测试(程序的正常流程不能形成独立执行该路径所需要的数据组合),这些路径必须作为另一个路径的一部分来测试。基本路径测试的步骤第七十九页,共一百三十二页,编辑于2023年,星期五为每一条独立路径设计测试用例。假设:n=5;minimum=0;maximum=100。路径1:1-2-10-11-13测试数据:value=[90,-999,0,0,0]预期结果:Average=90,total.input=1,total.valid=1路径2:1-2-10-12-13测试数据:value=[-999,0,0,0,0]预期结果:Average=-999,total.input=0,total.valid=0第八十页,共一百三十二页,编辑于2023年,星期五路径3:1-2-3-10-11-13测试数据:value=[-1,90,70,-1,80]预期结果:Average=80,total.input=5,total.valid=3路径4:1-2-3-4-5-8-9-2-10-12-13测试数据:value=[-1,-2,-3,-4,-999]预期结果:Average=-999,total.input=4,total.valid=0第八十一页,共一百三十二页,编辑于2023年,星期五路径5:1-2-3-4-5-6-8-9-2-10-12-13测试数据:value=[120,110,101,-999,0]预期结果:Average=-999,total.input=3,total.valid=0路径6:1-2-3-4-5-6-7-8-9-2-10-11-13测试数据:value=[95,90,70,65,-999]预期结果:Average=80,total.input=4,total.valid=4第八十二页,共一百三十二页,编辑于2023年,星期五2.条件测试测试用例能够检查程序模块中包含的逻辑条件。条件成分的类型包括布尔算符、布尔变量、布尔括弧(括住简单条件或复合条件)、关系算符及算术表达式。如果条件不正确,则至少条件的一个成分不正确。1、布尔算符错2、布尔变量错3、布尔括弧错4、关系算符错5、算术表达式错第八十三页,共一百三十二页,编辑于2023年,星期五条件测试策略1、分支测试:复合条件C的真分支和假分支中的每个简单条件都至少执行一次;2、域测试:每个关系表达式执行3或4个测试,如果E1<关系算符>E2要执行大于、等于和小于;3、布尔变量测试:有n个变量的布尔表达式要测试2n

个测试;4、BRO测试:利用条件C的条件约束来设计测试用例,如果布尔运算符和关系运算符只出现一次而且没有公共变的条件下,BRO测试可以发现布尔运算符和关系运算符错误。包括n个简单条件的条件C的约束条件定义为(D1,D2,…DN),其中Di表示第i个简单条件的输出约束第八十四页,共一百三十二页,编辑于2023年,星期五BRO测试举例:例1:C1:B1&B2B1,B2为布尔变量。C1的条件约束形如(D1,D2),其中D1和D2的值是t或f。BRO测试策略要求约束集{(t,t),(f,t),(t,f)}由C1的执行所覆盖,如果C1由于布尔运算符错误而不正确,该约束集中至少有一个约束强制C1失败。例2:C2:B1&(E3=E4){(t,=),(f,=),(t,<),(t,>)},此约束集的覆盖率将保证检测C2的布尔运算符和关系运算符错误。例3:C3:(E1>E2)&(E3=E4){(>,=),(=,=),(<,=),(>,<),(>,>)}编程者经常混淆两组运算符:(&&,||,!)和(&,|,^)。第一组是逻辑运算符,它的操作数是布尔型,而第二组则是位运算符,其操作数是位序列。第八十五页,共一百三十二页,编辑于2023年,星期五3.循环测试重点测试循环结构的有效性。在结构化的程序中通常只有3种循环,即简单循环、串接循环和嵌套循环第八十六页,共一百三十二页,编辑于2023年,星期五测试简单循环(1)测试简单循环:其中n是允许通过循环的最大次数。测试一下内容:跳过循环。只通过循环一次。通过循环两次。通过循环m次,其中m<n-1。通过循环n-1,n,n+1次。第八十七页,共一百三十二页,编辑于2023年,星期五测试嵌套循环(2)嵌套循环(直接应用简单循环测试方法,测试数会随嵌套层数的增加按几何级数增长)从最内层循环开始测试,使用简单循环测试方法,使外层循环的迭代参数(循环计数器)取最小值(为越界值或非法值进行额外的测试)。由内向外,对下一个循环进行测试,但保持所有其他外层循环为最小值,其他嵌套循环为“典型”值。继续进行下去,直到测试完所有循环。第八十八页,共一百三十二页,编辑于2023年,星期五测试串接循环(3)串接循环:如果串接循环的各个循环都彼此独立,则可以使用前述的测试简单循环的方法来测试串接循环。如果两个循环串接,而且第一个循环的循环计数器值是第二个循环的初始值,则这两个循环并不是独立的。当循环不独立时,建议使用测试嵌套循环的方法来测试串接循环。第八十九页,共一百三十二页,编辑于2023年,星期五7.7黑盒测试技术黑盒测试着重测试软件功能。白盒测试在测试过程的早期进行,而黑盒测试主要用于测试过程的后期。二者是互补的测试方法。力图发现下述类型的错误:①功能不正确或遗漏了功能;②界面错误;③数据结构错误或外部数据库访问错误;④性能错误;⑤初始化和终止错误。白盒测试也称结构测试或逻辑驱动测试,它是按照程序内部的结构测试程序,通过测试来检测产品内部动作是否按照设计规格说明书的规定正常进行,检验程序中的每条通路是否都能按预定要求正确工作。第九十页,共一百三十二页,编辑于2023年,星期五黑盒测试用见方法等价类划分边界值分析错误推测第九十一页,共一百三十二页,编辑于2023年,星期五如何划分等价类?有效等价类(合理等价类)无效等价类(不合理等价类)

划分等价类的标准:覆盖不相交代表性7.7.1等价划分第九十二页,共一百三十二页,编辑于2023年,星期五划分等价类的规则

(1)如果输入条件规定了一个范围,可定义一个有效等价类和两个无效等价类。例

输入值是学生成绩,范围是0~100第九十三页,共一百三十二页,编辑于2023年,星期五划分等价类的规则(2)如果输入条件规定了输入数据值的集合或必须遵循的规则,则可以确定出一个有效的等价类和若干个无效的等价类;例如:Pascal语言规定“一个语句必须以分号‘;’结束”。这时,可以确定一个有效等价类“以‘;’结束”,若干个无效等价类“以‘:’结束”、“以‘,’结束”、“以‘’结束”、“以LF结束”等。例如:在Pascal语言中对变量标识符规定为“以字母打头的……串”。那么所有以字母打头的构成有效等价类,而不在此集合内(不以字母打头)的归于无效等价类。(3)如果输入条件是一个布尔量,则可以确定一个有效等价类和一个无效等价类。

第九十四页,共一百三十二页,编辑于2023年,星期五划分等价类的规则(4)如果规定了输入数据的一组值,而且程序要对每个输入值分别进行处理。这时可为每一个输入值确立一个有效等价类,此外针对这组值确立一个无效等价类,它是所有不允许的输入值的集合。例如,在教师上岗方案中规定对教授、副教授、讲师和助教分别计算分数,做相应的处理。因此可以确定4个有效等价类为教授、副教授、讲师和助教;一个无效等价类,它是所有不符合以上身分的人员的输入值的集合,如工程师、技术员、科长等。第九十五页,共一百三十二页,编辑于2023年,星期五确立测试用例的原则建立等价类表,列出所有划分出的等价类。再从划分出的等价类中按以下原则选择测试用例:

(1)

设计一个新的测试用例,使其尽可能多地覆盖尚未被覆盖的有效等价类,重复这一步,直到所有的有效等价类都被覆盖为止;

(2)

设计一个新的测试用例,使其仅覆盖一个尚未被覆盖的无效等价类,重复这一步,直到所有的无效等价类都被覆盖为止。第九十六页,共一百三十二页,编辑于2023年,星期五

例:用在某一PASCAL语言版本中规定:“标识符是由字母开头,后跟字母或数字的任意组合构成。有效字符数为8个,最大字符数为80个。” 并且规定:“标识符必须先说明,再使用。”“在同一说明语句中,标识符至少必须有一个。”

等价类划分法实例第九十七页,共一百三十二页,编辑于2023年,星期五建立输入等价类表第九十八页,共一百三十二页,编辑于2023年,星期五下面选取了9个测试用例,它们覆盖了所有的等价类。

①VARx,T1234567:REAL;

BEGINx:=3.414;

T1234567:=2.732;

...…(1),(2),(4),(8),(9),(12),(14)

②VAR:REAL;(3)

③VARx,:REAL;(5)

④VART12345678:REAL;(6)⑤VART12345......:REAL;(7)

多于80个字符⑥VART$:CHAR;(10)⑦VARGOTO:INTEGER;(11)⑧VAR2T:REAL;(13)⑨VARPAR:REAL;(15)

BEGIN......

PAP:=SIN(3.14*0.8)/6;等价类划分法实例第九十九页,共一百三十二页,编辑于2023年,星期五

例如:某一报表处理系统,要求用户输入处理报表的日期。假设日期限制在1990年1月至1999年12月,即系统只能对该段时期内的报表进行处理。如果用户输入的日期不在此范围内,则显示输入错误信息。该系统规定日期由年、月的6位数字字符组成,前4位代表年,后两位代表月。现用等价类划分法设计测试用例,来测试程序的“日期检查功能”。等价类划分法实例第一百页,共一百三十二页,编辑于2023年,星期五①划分等价类并编号:划分成3个有效等价类,7个无效等价类,如表5-3所示。②为合理等价类设计测试用例,对于表中编号为1,5,8对应的3个合理等价类,用一个测试用例覆盖。等价类划分法实例第一百零一页,共一百三十二页,编辑于2023年,星期五③为每一个不合理等价类至少设计一个测试用例:

测试数据期望结果覆盖范围

99MAY输入无效219995输入无效31999005输入无效4198912输入无效6200001输入无效7199900输入无效9199913输入无效10等价类划分法实例第一百零二页,共一百三十二页,编辑于2023年,星期五7.7.2边界值分析人们从长期的测试工作经验得知,大量的错误是发生在输入或输出范围的边界上,而不是在输入范围的内部。如:下标、循环的边界设计使程序运行在边界情况附近的测试方案,暴露出程序错误的可能性更大一些。第一百零三页,共一百三十二页,编辑于2023年,星期五三角形的边长例如:在做三角形计算时,要输入三角形的三个边长:A、B和C。我们应注意到这三个数值应当满足

A>0、B>0、C>0、

A+B>C、A+C>B、B+C>A,才能构成三角形。但如果把六个不等式中的任何一个大于号“>”错写成大于等于号“≥”,那就不能构成三角形。问题恰出现在容易被疏忽的边界附近。第一百零四页,共一百三十二页,编辑于2023年,星期五边界值分析法测试方案首先确定边界情况,通常输入等价类和输出等价类的边界,就是应该着重测试的程序边界情况。选取刚好等于、稍小于和稍大于等价类边界值的数据作为测试数据。通常联合使用等价划分和边界值分析两种技术。第一百零五页,共一百三十二页,编辑于2023年,星期五

例如:若输入值的范围是[1,100],可取0,1,100,101等值作为测试数据。若一个输入文件可包括1~255个记录,则分别设计有1个记录、255个记录,以及0个记录和256个记录的输入文件的测试用例。若只能查询05~09级大学生的各科成绩,测试用例应查询范围内的某一届或五届学生的学生成绩,还需设计查询04级、10级学生成绩的测试用例(不合理输出等价类)。

边界值分析法测试方案第一百零六页,共一百三十二页,编辑于2023年,星期五错误推测法主要靠直觉和经验进行。依据常见错误的清单,列出可能有的错误和容易发生错误的特殊情况,选择测试方案。输入或输出数据为零个时往往容易发生错误数据库操作输出结果为空时,容易出错7.7.3错误推测第一百零七页,共一百三十二页,编辑于2023年,星期五例如,测试一个排序子程序,可考虑如下情况:输入表为空;输入表只有一个元素;输入表的所有元素都相同;输入表已排序。又如,测试二分法检索子程序,可考虑如下情况:表中只有一个元素;表长为2n;表长为2n-1;表长为2n+1第一百零八页,共一百三十二页,编辑于2023年,星期五其它方法判定表或判定树:适合多个输入数据组合的情况,列出输入数据各种组合与程序应作的动作(及相应的输出结果)之间的对应关系,然后为判定表的每一列至少设计一个测试用例。因果图:适合描述在测试时必须考虑对于多种输入条件的组合,相应产生多个动作的形式来设计测试用例,最终生成判定表。可以把计算机测试和人工检查代码结合起来选择输入组合。第一百零九页,共一百三十二页,编辑于2023年,星期五第一百一十页,共一百三十二页,编辑于2023年,星期五系统测试(SystemTesting)系统测试是对整个基于计算机的系统进行的一系列测试。系统测试的种类很多,每种测试都有不同的目的,它们从不同的角度测试计算机系统是否被正常地集成,并完成相应的功能。常用的系统测试包括:恢复测试(recoverytesting)安全测试(securitytesting)压力测试(stresstesting)性能测试(performancetesting)第一百一十一页,共一百三十二页,编辑于2023年,星期五恢复测试(recoverytesting)恢复测试是通过各种手段,强制软件发生故障,然后来验证系统能否在指定的时间间隔内恢复正常,包括修正错误并重新启动系统。如果恢复是由系统自身来完成的,那么,需验证重新初始化、检查点机制、数据恢复和重启动等的正确性。如果恢复需要人工干预,那么要估算平均修复时间MTTR(meantimetorepair)是否在用户可以接受的范围内。第一百一十二页,共一百三十二页,编辑于2023年,星期五安全测试(securitytesting)安全测试用来验证集成在系统中的保护机制能否实际保护系统不受非法侵入。在安全测试过程中,测试者扮演一个试图攻击系统的角色,采用各种方式攻击系统。例如,截取或码译密码;借助特殊软件攻击系统;“制服”系统,使他人无法访问;故意导致系统失效,企图在系统恢复之机侵入系统;通过浏览非保密数据,从中找出进入系统的钥匙等等。一般来说,只要有足够的时间和资源,好的完全测试一定能最终侵入系统。系统设计者的任务是把系统设计成:攻破系统所付出的代价大于攻破系统后得到信息的价值。第一百一十三页,共一百三十二页,编辑于2023年,星期五压力测试(stresstesting)压力测试也称强度测试,它是在一种需要非正常数量、频率或容量的方式下执行系统,其目的是检查系统对非正常情况的承受程度。例如:当系统的中断频率是每秒1或2个时,执行每秒10个中断的测试用例将输入数据的数量提高一个数量级来测试输入功能如何响应执行需要最大内存或其它资源的测试用例执行可能导致大量磁盘驻留数据的测试用例第一百一十四页,共一百三十二页,编辑于2023年,星期五性能测试(performancetesting)性能测试用来测试软件在集成的系统中的运行性能。它对实时系统和嵌入式系统尤为重要。性能测试可以发生在测试过程的所有步骤中单元测试时,主要测试一个独立模块的性能,如算法的执行速度。软件集成后,进行软件整体的性能测试。计算机系统集成后,进行整个计算机系统的性能测试。性能测试常常需要与压力测试结合起来进行,而且常常需要一些硬件和软件测试设备,以监测系统的运行情况。第一百一十五页,共一百三十二页,编辑于2023年,星期五7.8调试(纠错)调试是在测试发现错误之后排除错误的过程。调试过程有两种结果:①找到了问题的原因并改正和排除了问题;②没找出问题的原因。猜想原因,设计测试用例来验证假设,重复此过程直至找到原因并改正了错误。是把软件错误的症状和内在原因联系起来的智力过程,很大程度上依赖于软件工程师的经验和技巧。第一百一十六页,共一百三十二页,编辑于2023年,星期五7.8.1调试过程第一百一十七页,共一百三十二页,编辑于2023年,星期五软件错误的特征(1)症状所在的模块和产生症状的原因模块可能在程序中相距甚远。紧耦合时更加典型。(2)当改正了另一个错误之后,症状可能暂时消失。(3)症状可能实际上并不是由错误引起的(如误差)。(4)症状可能是由不易跟踪的人为错误引起的。(5)症状可能是由定时问题而不是由处理问题引起的。(6)可能很难重新产生完全一样的输入条件(例如,输入顺序不确定的实时应用系统)。(7)症状可能时有时无。在嵌入式系统中特别常见。(8)症状可能是由分布运行在不同的处理机上的任务中的原因引起的。第一百一十八页,共一百三十二页,编辑于2023年,星期五调试的困难调试是软件开发过程中最艰巨的脑力劳动。确定发生错误的内在原因和位置占整个调试工作量的90%左右。为什么调试这么困难?1、软件错误本身的特征2、心理方面的原因多于技术方面的原因3、与测试比较,调试技术缺乏系统的理论研究,调试方法多是实践中的经验积累。4、错误的后果越严重,查找错误原因的压力也越大。导致软件开发人员在改正一个错误的同时引入两个甚至更多个错误。第一百一十九页,共一百三十二页,编辑于2023年,星期五7.8.2调试途径经验:在调试之前,首先进行周密的思考,明确目的,尽量减少无关信息的数量。1.蛮干法1)在程序中插入打印语句比较容易检查源程序的有关信息,但低效率,有偶然性。2)运行部分程序把不需要执行的语句段前和后加上注释符,使这段程序不再执行。调试过后,再将注释符去掉。在不需要执行的语句段前加判定值为“假”的IF语句或者加GOTO语句,使该程序不执行。调试结束后,再撤销这些语句,使程序复原。3)借助于调试工具追踪子程序调用、循环与分支执行路径、特定变量的变化情况;利用“置断点”可以执行特定语句或改变特定变量值引起的程序中断,以便检查程序的当前状态。第一百二十页,共一百三十二页,编辑于2023年,星期五调试途径2.回溯法是一种相当常用的调试方法,当调试小程序时这种方法是有效的。从发现症状的地方开始,人

温馨提示

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

评论

0/150

提交评论