第七章--实现

上传人:仙*** 文档编号:167731973 上传时间:2022-11-04 格式:PPT 页数:109 大小:1.13MB
收藏 版权申诉 举报 下载
第七章--实现_第1页
第1页 / 共109页
第七章--实现_第2页
第2页 / 共109页
第七章--实现_第3页
第3页 / 共109页
资源描述:

《第七章--实现》由会员分享,可在线阅读,更多相关《第七章--实现(109页珍藏版)》请在装配图网上搜索。

1、第七章第七章 实现实现 概要设计概要设计详细设计详细设计实实 现现软件开发软件开发v软件实现软件实现l把编码和测试统称为实现l编码就是把软件设计的结果翻译成用某种程序设计语言书写的程序 所选用的程序设计语言的特点及编码风格将对程序的可靠性、可读性、可测试性和可维护性产生深远的影响v软件实现软件实现l软件测试在软件生命周期中横跨两个阶段在软件生命周期中横跨两个阶段 编码和单元测试属于软件生命周期的同一个阶段 对软件系统还应该进行各种综合测试,这是软件生命周期中的另一个独立的阶段 软件测试的工作量往往占软件开发总工作量的40以上v 程序设计语言程序设计语言l 是人和计算机通信的基本工具是人和计算机

2、通信的基本工具l 程序设计语言的特点程序设计语言的特点 影响人的思维和解题方法 影响人和计算机通信的方式和质量 影响人阅读和理解程序的难易程度l 由于软件大部分成本在由于软件大部分成本在测试和和维护,所以程序容易测试和容易,所以程序容易测试和容易维护极端重要维护极端重要l 程序员在相同时间内可以写出的高级语言语句数和汇编语言指程序员在相同时间内可以写出的高级语言语句数和汇编语言指令数大体相同令数大体相同l 因此用高级语言写程序比用汇编语言写程序生产率可以提高好因此用高级语言写程序比用汇编语言写程序生产率可以提高好几倍几倍l 用高级语言写的程序易测试、易阅读和维护用高级语言写的程序易测试、易阅读

3、和维护v选择程序设计语言的理想标准选择程序设计语言的理想标准 l应该有理想的应该有理想的模块化机制模块化机制,以及可读性好的控制结构,以及可读性好的控制结构和数据结构和数据结构l语言特点语言特点应该使编译程序能够尽可能多地发现程序中应该使编译程序能够尽可能多地发现程序中的错误的错误l选用的高级语言应该有良好的选用的高级语言应该有良好的独立编译机制独立编译机制 v选择程序设计语言的实用标准选择程序设计语言的实用标准系统用户的要求系统用户的要求 如果所开发的系统由用户负责维护,用户通常要求用他们熟悉的语言书写程序可以使用的编译程序可以使用的编译程序 运行目标系统的环境中可以提供的编译程序往往限制了

4、可以选用的语言的范围可以得到的软件工具可以得到的软件工具 如果某种语言有支持程序开发的软件工具可以利用,则目标系统的实现和验证都变得比较容易4.4.工程规模工程规模 如果工程规模很庞大,现有的语言又不完全适用,那么设计并实现一种提供这个工程项目专用的程序设计语言,可能是一个正确的选择5.5.程序员的知识程序员的知识 如果和其他标准不矛盾,那么应该选择一种已经为程序员所熟悉的语言v选择程序设计语言的实用标准选择程序设计语言的实用标准6.6.软件可移植性要求软件可移植性要求如果目标系统将在几台不同的计算机上运行,或者预期的使用寿命很长,那么选择一种标准化程度高、程序可移植性好的语言就是很重要的7.

5、7.软件的应用领域软件的应用领域FORTRAN语言特别适合于工程和科学计算COBOL语言适合于商业领域应用C语言和Ada语言适用于系统和实时应用领域LISP语言适用于组合问题领域PROLOG语言适于表达知识和推理v 编码风格编码风格 l“好好”程序的标准程序的标准 源程序代码的逻辑简明清晰、易读易懂l为写出为写出“好好”程序应遵循的原则程序应遵循的原则1 1 程序内部的文档程序内部的文档 程序内部的文档包括:选取含义鲜明的名字,对帮助阅读程序很重要;不必要的长标识符提供了出错的潜在可能性;如果使用缩写,缩写规则在整个程序设计过程中应保持一致,必要时应给缩写名字加注解v 编码风格编码风格 1 1

6、 程序内部的文档程序内部的文档 程序中的注解分为两类程序中的注解分为两类 程序清单的程序清单的布局对于程序的可读性布局对于程序的可读性有很大影响有很大影响v编码风格编码风格 2 2 数据说明数据说明 数据说明的次序应该标准化 当多个变量名在一个语句中说明时,应该按字母顺序排列这些当多个变量名在一个语句中说明时,应该按字母顺序排列这些变量变量 如果设计时使用了一个复杂的数据结构,则应该用注解说明用如果设计时使用了一个复杂的数据结构,则应该用注解说明用程序设计语言实现这个数据结构的方法和特点程序设计语言实现这个数据结构的方法和特点v 编码风格编码风格 3 3 语句构造语句构造 构造语句时应该遵循的

7、原则是:不要为了节省空间而把多个语句写在同一行 尽量避免复杂的条件测试 尽量减少对“非”条件的测试 避免大量使用循环嵌套和条件嵌套 用括号使逻辑或算术表达式的运算次序清晰直观v 编码风格编码风格 4 4 输入输出风格的规则输入输出风格的规则 对所有输入数据都进行检验对所有输入数据都进行检验 检查输入项重要组合的合法性检查输入项重要组合的合法性 保持输入格式简单保持输入格式简单 使用数据结束标记,不要要求用户指定数据的数目使用数据结束标记,不要要求用户指定数据的数目 提示交互式输入的请求,说明可用的选择或边界数提示交互式输入的请求,说明可用的选择或边界数值值 程序语言对格式有严格要求时,应保持输

8、入格式一程序语言对格式有严格要求时,应保持输入格式一致致 设计良好的输出报表设计良好的输出报表v 编码风格编码风格 5 5 效率效率 效率主要指处理机时间和存储器容量两个方面 关于效率的三条原则v 编码风格编码风格 5 5 效率效率 程序运行时间细设计阶段确定的算法的效率写程序的风格 使用执行时间短的算术运算使用执行时间短的算术运算 不要混合使用不同的数据类型不要混合使用不同的数据类型 尽量使用整数运算和布尔表达式尽量使用整数运算和布尔表达式v 编码风格编码风格 5 5 效率效率 存储器效率存储器效率占用存储单元少,存取时间短高执行效率v 编码风格编码风格 5 5 效率效率 输人输出的效率简单

9、清晰有缓冲二级存储器(超高效的”输入输出v 防不胜防的软件错误防不胜防的软件错误 l 案例案例 1963年,美国飞往火星的火箭爆炸,损失损失1000万美元.原因:原因:FORTRAN FORTRAN 循环 DO 5 i=1,3 DO 5 i=1,3 误写为误写为 DO 5 i=1.3DO 5 i=1.3 1967年苏联“联盟一号”宇宙飞船返回时因忽略一个小数点,在进入大气层时打不开降落伞而烧毁。联通2001年某市话费核算系统平均100元话费误差0.20元 v 软件测试的必要性软件测试的必要性l 软件的复杂性l 成员之间的沟通和配合l 技术评审的不完整性l 编码引入新的错误v 软件测试的目的软件

10、测试的目的l软件测试的目的与软件工程其他阶段的目的都相反软件测试的目的与软件工程其他阶段的目的都相反 软件工程的其他阶段都是“建设性”的 在测试阶段测试人员努力设计一系列测试方案,目的却是为了“破坏”已经建造好的软件系统l测试阶段的根本目的测试阶段的根本目的是尽可能多地发现并排除软件中是尽可能多地发现并排除软件中潜藏的错误潜藏的错误,最终把一个高质量的软件系统交给用户,最终把一个高质量的软件系统交给用户使用使用v 软件测试的目标软件测试的目标l什么是测试什么是测试?它的目标是什么它的目标是什么?lG GMyersMyers给出了关于测试的一些规则给出了关于测试的一些规则:(1)测试是为了发现程

11、序中的错误而执行程序的过程;(2)好的测试方案是极可能发现迄今为止尚未发现的错误的测试方案;(3)成功的测试是发现了至今为止尚未发现的错误的测试。v 软件测试准则软件测试准则(1)(1)所有测试都应该能追溯到用户需求(2)应该在测试开始之前就制定出测试计划;完成了需求模型就可以着手制定测试计划;在建立了设计模型后就可以立即开始设计详细的测试方案(3)测试发现的错误中的80很可能是由程序中20的模块造成的。问题是怎样找出这些可疑的模块并彻底地测试它们(4)应该从“小规模”测试开始,并逐步进行“大规模”测试通常,首先重点测试单个程序模块,然后把测试重点转向在集成的模块簇中寻找错误,最后在整个系统中

12、寻找错误(5)穷举测试是不可能的所谓穷举测试就是把程序所有可能的执行路径都检查一遍的测试,例1,例2(6)为了达到最佳的测试效果,应该由独立的第三方从事测试工作v 测试方法测试方法l有关概念 测试用例测试用例 测试方案测试方案 测试计划测试计划v 测试方法测试方法l黑盒测试法黑盒测试法 把程序看作一个黑盒子,完全不考虑程序的内部结构和处理过程 黑盒测试是在程序接口进行的测试 黑盒测试又称为功能测试 测试过程后期使用的方法测试过程后期使用的方法v 测试方法测试方法l白盒测试法白盒测试法 把程序看成装在一个透明的白盒子,测试者完全知道程序的结构和处理算法 这种方法按照程序内部的逻辑测试程序,检测程

13、序中主要执行通路是否都能按预定要求正确工作 白盒测试又称为结构测试 测试过程早期使用的方法测试过程早期使用的方法v 测试步骤测试步骤1 1模块测试模块测试 模块测试的目的是保证每个模块作为一个单元能正确运行模块测试的目的是保证每个模块作为一个单元能正确运行 模块测试通常又称为模块测试通常又称为单元测试单元测试 在这个测试步骤中所发现的往往是编码和详细设计的错误在这个测试步骤中所发现的往往是编码和详细设计的错误2 2子系统测试子系统测试 子系统测试是把经过单元测试的模块放在一起形成一个子系统来测试子系统测试是把经过单元测试的模块放在一起形成一个子系统来测试 模块相互间的协调和通信是这个测试过程中

14、的主要问题模块相互间的协调和通信是这个测试过程中的主要问题 这个步骤着重测试模块的接口这个步骤着重测试模块的接口v 测试步骤测试步骤3 3系统测试系统测试 把经过测试的子系统装配成一个完整的系统来测试把经过测试的子系统装配成一个完整的系统来测试 发现的往往是软件设计中的错误,也可能发现需求说明中的错误发现的往往是软件设计中的错误,也可能发现需求说明中的错误 兼有兼有检测检测和和组装组装两重含义,通常称为两重含义,通常称为集成测试集成测试4 4验收测试验收测试 验收测试把软件系统作为单一的实体进行测试,测试内容与系统测试基验收测试把软件系统作为单一的实体进行测试,测试内容与系统测试基本类似,但是

15、它是在用户积极参与下进行的,而且可能主要使用实际数本类似,但是它是在用户积极参与下进行的,而且可能主要使用实际数据据(系统将来要处理的信息系统将来要处理的信息)进行测试进行测试 验收测试的目的是验证系统确实能够满足用户的需要,在这个测试步骤验收测试的目的是验证系统确实能够满足用户的需要,在这个测试步骤中发现的往往是系统需求说明书中的错误中发现的往往是系统需求说明书中的错误 验收测试也称为验收测试也称为确认测试确认测试v 测试步骤测试步骤5 5平行运行平行运行 所谓平行运行就是同时运行新开发出来的系统和将被它取代的旧系统,以便比较新旧两个系统的处理结果。这样做的具体目的有如下几点:v 测试阶段的

16、信息流测试阶段的信息流l软件配置软件配置:包括需求说明书、设计说明书和源程序清单包括需求说明书、设计说明书和源程序清单l测试配置测试配置:包括测试计划和测试方案包括测试计划和测试方案测试测试评价评价调试调试可靠性可靠性模型模型软件配置软件配置测试配置测试配置测试测试结果结果预期结果预期结果错误错误正确正确错误率数据错误率数据可靠性可靠性测试测试v 单元测试集中检测程序单元测试集中检测程序“模块模块”l单元测试主要使用白盒测试技术单元测试主要使用白盒测试技术l对多个模块的测试可以并行地进行对多个模块的测试可以并行地进行l在编写出源程序代码并通过了编译程序的语法检查后,在编写出源程序代码并通过了编

17、译程序的语法检查后,就可以用详细设计描述作指南,对重要的执行通路进就可以用详细设计描述作指南,对重要的执行通路进行测试行测试l单元测试工作可用单元测试工作可用人工测试人工测试和和计算机测试计算机测试v 测试重点测试重点1 1 模块接口模块接口 参数的数目、次序、属性或单位系统与变元是否一致参数的数目、次序、属性或单位系统与变元是否一致 是否修改了只作输入用的变元是否修改了只作输入用的变元 全局变量的定义和用法在各个模块中是否一致全局变量的定义和用法在各个模块中是否一致2 2 局部数据结构局部数据结构 发现局部数据说明、初始化、默认值等方面的错误发现局部数据说明、初始化、默认值等方面的错误3 3

18、 重要的执行通路重要的执行通路 选择最有代表性、最可能发现错误的执行通路进行测试选择最有代表性、最可能发现错误的执行通路进行测试 应该设计测试方案用来发现由于错误的计算、不正确的比较或不适当应该设计测试方案用来发现由于错误的计算、不正确的比较或不适当的控制流而造成的错误的控制流而造成的错误v 测试重点测试重点4 4 出错处理通路出错处理通路 好的设计应该能预见出现错误的条件,并且设置适当的处理错误的通路,以便在真的出现错误时执行相应的出错处理通路或干净地结束处理 应该着重测试下述一些可能发生的错误:v 测试重点测试重点5 5 边界条件边界条件 边界测试是单元测试中最后的也是最重要的任务。边界测

19、试是单元测试中最后的也是最重要的任务。软件常常在它的边界上失效软件常常在它的边界上失效v 代码审查代码审查l 一种非常有效的程序验证技术,对典型的程序来说,可查出30-70的逻辑设计错误和编码错误l 审查小组最好由下述4人组成:组长:一个很有能力的程序员,没有直接参与这项工程 程序的设计者 程序的编写者 程序的测试者l 预演:由人模拟计算机执行程序l 人工测试和计算机测试是互相补充,相辅相成的v 计算机测试计算机测试l 驱动程序(Driver)和存根程序(Stub)l 通常驱动程序也就是一个“主程序”,它接收测试数据,把这些数据传送给被测试的模块,并且印出有关的结果l“存根”程序代替被测试的模

20、块所调用的模块 存根程序也可以称为“虚拟子程序”它使用被它代替的模块的接口,做最少的数据操作,印出对入口的检验或操作结果,并把控制归还给调用它的模块l 驱动程序和存根程序代表开销v 集成测试集成测试是测试和组装软件的系统化技术是测试和组装软件的系统化技术v 由模块组装成程序的两种方法由模块组装成程序的两种方法l 非渐增式测试方法 先分别测试每个模块,再把所有模块按设计要求放在一起结合成所要的程序,这种方法称为非渐增式测试方法l 渐增式测试方法 把下一个要测试的模块同已经测试好的那些模块结合起来进行测试,测试完以后再把下一个应该测试的模块结合进来测试。这种每次增加一个模块的方法称为渐增式测试,这

21、种方法实际上同时完成单元测试和集成测试v集成测试集成测试v 两种方法的比较两种方法的比较l非渐增式测试非渐增式测试 一下子把所有模块放在一起,并把庞大的程序作为一个整体来测试,一下子把所有模块放在一起,并把庞大的程序作为一个整体来测试,测试者面对的情况十分复杂测试者面对的情况十分复杂 改正错误是极端困难的改正错误是极端困难的 想要诊断定位一个错误是非常困难的想要诊断定位一个错误是非常困难的 错误会连续不断,没有尽头错误会连续不断,没有尽头l渐增式测试渐增式测试 与与“一步到位一步到位”的非渐增式测试相反,它把程序划分成小段来构造和的非渐增式测试相反,它把程序划分成小段来构造和测试测试 易定位和

22、改正错误易定位和改正错误 对接口可以进行更彻底的测试对接口可以进行更彻底的测试 可以使用系统化的测试方法可以使用系统化的测试方法v 渐增测试的两种集成策略渐增测试的两种集成策略l自顶向下集成自顶向下集成 从主控制模块开始,沿着程序的控制层次向下移动,逐渐把各个模块结合起来 可使用深度优先的策略,或宽度优先的策略M1 M2M3S4M5M6S7M8深度优先策略深度优先策略n例如,选取左通路,首先结合模块Ml、M2和M5;其次,M8或M6n然后构造中央的和右侧的控制通路M1M2M3S4M5M6S7M8宽度优先策略宽度优先策略n例如,首先结合模块M2、M3和M4(代替存根程序S4),然后结合下一个控制

23、层次中的模块M5、M6和M7n如此继续进行下去,直到所有模块都被结合进来为止自顶向下集成测试的步骤:自顶向下集成测试的步骤:第第1 1步:测试顶端模块,用存根程序步:测试顶端模块,用存根程序(stub)(stub)代替直接附代替直接附属的下层模块属的下层模块Stub:Stub:模拟未测试模块的活动模拟未测试模块的活动.MS1S2第2步:根据深度优先或宽度优先的策略,每次 用一个实际模块代换一个stub。第3步:在结合进一个模块的同时进行测试。M MS S1 1S S2 2M M1 1S S3 3S S4 4M M2 2S S2 2第4步:回归测试 全部或部分地重复以前做过的测试。优点:在早期即

24、对主要控制及关键的抉择进行检验优点:在早期即对主要控制及关键的抉择进行检验问题:问题:StubStub只是对低层模块的模拟,测试时没有重要的数只是对低层模块的模拟,测试时没有重要的数据自下往上流,许多重要的测试须推迟进行,而且据自下往上流,许多重要的测试须推迟进行,而且在早期不能充分展开人力在早期不能充分展开人力v自顶向下集成测试的优缺点:自顶向下集成测试的优缺点:自底向上集成测试步骤自底向上集成测试步骤:第第1 1步:把低层模块组合成族,每族实现一个子功能步:把低层模块组合成族,每族实现一个子功能 第第2 2步:用驱动程序步:用驱动程序(Driver)(Driver)协调测试数据的协调测试数

25、据的IOIO,测试子功,测试子功能族。能族。Driver:调用模块细节逐个进行测试调用模块细节逐个进行测试.DM1M2第第3 3步:去掉步:去掉DriverDriver,自下而上把子功能族合成更大的子功能族。,自下而上把子功能族合成更大的子功能族。MMMMMMMMMMMMDDDDDD注意:注意:两种策略的优、缺点刚好互补,但单用其中任一种两种策略的优、缺点刚好互补,但单用其中任一种都不实际,通常根据软件的特点将二者混用。都不实际,通常根据软件的特点将二者混用。D1D2D3MaMbMcv 不同集成测试策略的比较不同集成测试策略的比较l在测试实际的软件系统时,选用适当的测试策略,纯在测试实际的软件

26、系统时,选用适当的测试策略,纯粹自顶向下或纯粹自底向上的策略可能都不实用粹自顶向下或纯粹自底向上的策略可能都不实用l实践中创造出许多混合策略:实践中创造出许多混合策略:改进的自顶向下测试方法改进的自顶向下测试方法 混合法混合法v 回归测试回归测试l回归测试是指重新执行已做过的测试的某个子集,保回归测试是指重新执行已做过的测试的某个子集,保证由于调试引起的变化,不会导致非预期的软件行为证由于调试引起的变化,不会导致非预期的软件行为或额外错误的测试活动或额外错误的测试活动,带来非预期的副作用。带来非预期的副作用。l 回归测试集包括下述回归测试集包括下述3 3类不同的测试用例:类不同的测试用例:检测

27、软件全部功能的代表性测试用例检测软件全部功能的代表性测试用例 针对可能受修改影响的软件功能的附加测试针对可能受修改影响的软件功能的附加测试 针对被修改过的软件成分的测试针对被修改过的软件成分的测试v 确认测试确认测试l 也称为验收测试,它的目标是验证软件的有效性 l 验证 指的是保证软件正确地实现了某个特定要求的一系列活动l 确认 指的是为了保证软件确实满足了用户需求而进行的一系列活动l 软件有效性的简单定义是:如果软件的功能和性能如同用户所合理期待的那样,软件就是有效的v 确认测试的范围确认测试的范围l确认测试必须有用户参加,或以用户为主l确认测试通常使用黑盒测试法 应该仔细设计测试计划和测

28、试过程 测试计划包括要进行的测试的种类及进度安排 测试过程规定了用来检测软件是否与需求一致的测试方案 通过测试和调试要保证软件能满足所有功能要求,能达到每个性能要求,文档资料准确而完整、安全性、可移植性、兼容性和可维护性等l确认测试有下述两种可能的结果:(1)功能和性能与用户要求一致,软件是可以接受的(2)功能和性能与用户要求有差距。发现的软件缺陷或错误的策略,通常需要和用户充分协商v 软件配置复查软件配置复查l目的是保证软件配置的所有成分都齐全目的是保证软件配置的所有成分都齐全l质量符合要求质量符合要求l文档与程序完全一致文档与程序完全一致l具有完成软件维护所必须的细节具有完成软件维护所必须

29、的细节l已经编好目录已经编好目录v AlphaAlpha和和BetaBeta测试(面向多个客户的产品测试)测试(面向多个客户的产品测试)l Alpha测试 由用户在开发者的场所进行,并且在开发者对用户的“指导”下进行测试 开发者负责记录发现的错误和使用中遇到的问题 Alpha是在“受控”状态下进行的测试活动l Beta测试 由软件的最终用户们在一个或多个客户场所进行 用户记录在Beta测试过程中遇到的一切问题,并且定期把这些问题报告给开发者 开发者对软件产品进行必要的修改,并准备向全体客户发布最终的软件产品 Beta测试是在“不受控”的状态下进行的测试活动v 设计测试方案设计测试方案l 测试方

30、案包括具体的测试目的(例如,预定要测试的具体功能),应该输入的测试数据和预期的结果l 测试数据和预期的输出结果称为测试用例 l 因为不可能进行穷尽的测试,选用少量“最有效的”测试数据,做到尽可能完备的测试就更重要了l 已研究出许多设计测试数据的技术,这些技术各有优缺点,通常需联合使用多种设计测试数据的技术 白盒法又称为逻辑覆盖法,其测试用例选择,是按照不同覆盖标准确定的。v 逻辑覆盖逻辑覆盖l逻辑覆盖是对一系列测试过程的总称,这组测试过程逻辑覆盖是对一系列测试过程的总称,这组测试过程逐渐进行越来越完整的通路测试逐渐进行越来越完整的通路测试l适合于白盒测试覆盖程度由弱到强次序是适合于白盒测试覆盖

31、程度由弱到强次序是 语句覆盖语句覆盖-判定判定-条件条件-判定判定/条件条件-条件组合条件组合v 逻辑覆盖逻辑覆盖1 1 语句覆盖语句覆盖 语句覆盖的含义:语句覆盖的含义:语句覆盖只关心判定表达式的值,而没有分别测试判定表达式语句覆盖只关心判定表达式的值,而没有分别测试判定表达式中每个条件取不同值时的情况中每个条件取不同值时的情况入口入口A 1AND B=0TA=2OR X 1TX=X/AX=X+1返回返回FFSabcdev 为了使每个语句都执行为了使每个语句都执行一次,程序的执行路径一次,程序的执行路径应该是应该是sabcdesabcdev 为此只需要输入下面的为此只需要输入下面的测试数据测

32、试数据(实际上实际上X X可以可以是任意实数是任意实数):v A=2,B=0,X=4v 逻辑覆盖逻辑覆盖2 2 判定覆盖判定覆盖 判定覆盖又叫判定覆盖又叫分支覆盖分支覆盖 判定覆盖的含义:判定覆盖的含义:Sabcdev 能够分别覆盖路径:能够分别覆盖路径:sabcdesabcde和和sacesace的两组测试数据,或的两组测试数据,或者可以分别覆盖路径者可以分别覆盖路径sacdesacde和和sabcesabce的两组测试数据,都满的两组测试数据,都满足判定覆盖标准足判定覆盖标准v I IA A3 3,B B0 0,X X1 (1 (覆覆盖盖sabce)sabce)v A A2 2,B B1

33、1,X X1(1(覆覆盖盖sacde)sacde)入口入口A 1AND B=0TA=2OR X 1TX=X/AX=X+1返回返回FF问题:若问题:若X1X1错写为错写为X1X1A1,A1A1,B B0 0,B0B0v c c点有下述各种结果出现点有下述各种结果出现l A A2 2,A2A2,X1X1,X1X1v 只需要使用下面两组测试数只需要使用下面两组测试数据就可以达到上述覆盖标准:据就可以达到上述覆盖标准:I IA A2 2,B B0 0,X X4 4 (执行路径执行路径sabcdesabcde,满足,满足A1,A1,B=0;A=2,X1)B=0;A=2,X1)A Al l,B B1 1,

34、X X1 1 (执行路径执行路径sacesace,满足,满足A A 1,1,B B 0;A 0;A 2,X2,X 1 1)入口入口A 1AND B=0TA=2OR X 1TX=X/AX=X+1返回返回FFv 逻辑覆盖逻辑覆盖4 4判定条件覆盖判定条件覆盖 它的含义是它的含义是v 逻辑覆盖逻辑覆盖5 5条件组合覆盖条件组合覆盖 条件组合覆盖的含义条件组合覆盖的含义SabcdIA2,B0,X4(l,5两种组合,路径两种组合,路径sabcde)A2,Bl,X1(2,6两种组合,执行路径两种组合,执行路径sacde)A1,B0,X2(3,7两种组合,执行路径两种组合,执行路径sacde)A1,B1,X

35、1(4,8两种组合,执行路径两种组合,执行路径sace)入口入口A 1AND B=0TA=2OR X 1TX=X/AX=X+1返回返回FF全部可能的条件组合为:全部可能的条件组合为:A1,B=0 A1,B 0 A 1,B=0 A 1,B 0 A=2,X1 A=2,X 1 A 2,X1 A 2,X 1 e从考察从考察控制流控制流或或流图流图的角度,还可考虑下述覆盖:的角度,还可考虑下述覆盖:6 点覆盖7 边覆盖=语句覆盖语句覆盖8 路径覆盖 每条可能的路径都至少执行一次,若图中有环,每条可能的路径都至少执行一次,若图中有环,则每个环至少经过一次。则每个环至少经过一次。=判定覆盖判定覆盖v逻辑覆盖

36、逻辑覆盖控制结构测试控制结构测试v基本路径测试基本路径测试l基本路径测试是基本路径测试是Tom McCabe提出的一种白盒测试技术。提出的一种白盒测试技术。l用该程序的环形复杂度定义执行路径的基本集合,导用该程序的环形复杂度定义执行路径的基本集合,导出的测试用例可以保证程序中的每条语句至少执行一出的测试用例可以保证程序中的每条语句至少执行一次,而且每个条件在执行时都将分别取真、假两种值。次,而且每个条件在执行时都将分别取真、假两种值。v步骤如下:步骤如下:l第一步,根据过程设计结果画出相应的流图。l第二步,计算流图的环形复杂度。l第三步,确定线性独立路径的基本集合。l第四步,设计可强制执行基本

37、集合中每条路径的测试用例。基本路径测试基本路径测试例如:用例如:用PDL描述的求平均值过程,描述的求平均值过程,PROCEDURE average;/*这个过程计算不超过这个过程计算不超过100个在规定值域内的有效数字的平个在规定值域内的有效数字的平均值;同时计算有效数字的总和及个数。均值;同时计算有效数字的总和及个数。*/INTERFACE RETURNS average,total.input,total.valid;INTERFACE ACCEPTS value,minimum,maximum;TYPE value1100 IS SCALAR ARRAY;TYPE average,tot

38、al.input,total.valid;minimum,maximum,sum IS SCALAR;TYPE i IS INTEGER;1:i=1;total.input=total.valid=0;sum=0;基本路径测试基本路径测试2:DO WHILE valuei -9993:AND total.input=minimum6:AND valuei011:THEN average=sum/total.valid;12:ELSE average=-999;13:ENDIF END average求平均值过程的流图基本路径测试基本路径测试v 第二步,计算流图的环形复杂度。第二步,计算流图的环

39、形复杂度。可以用第小节讲述的3种方法之一计算环形复杂度。图7.6所示流图的环形复杂度为6。v 第三步,确定线性独立路径的基本集合。第三步,确定线性独立路径的基本集合。用流图术语描述,独立路径至少包含一条在定义该路径之前不曾用过的边。程序的环形复杂度决定了程序中独立路径的数量,而且这个数是确保程序中所有语句至少被执行一次所需的测试数量的上界。对于求平均值过程来说,由于环形复杂度为6,因此共有6条独立路径。路径路径3:1-2-3-10-11-13路径路径2:1-2-10-12-13路径路径1:1-2-10-11-13路径路径4:1-2-3-4-5-8-9-2-路径路径5:1-2-3-4-5-6-8

40、-9-2-路径路径6:1-2-3-4-5-6-7-8-9-2-识别出判定结点。本识别出判定结点。本例中结点例中结点2 2、3 3、5 5、6 6和和1010是判定结点。是判定结点。基本路径测试基本路径测试v 第四步,设计可强制执行基本集合中每条路径的测试用第四步,设计可强制执行基本集合中每条路径的测试用例。例。应该选取测试数据使得在测试每条路径时都适当地设置好了各个判定结点的条件。在测试过程中,执行每个测试用例并把实际输出结果与预期结果相比较。一旦执行完所有测试用例,就可以确保程序中所有语句都至少被执行了一次,而且每个条件都分别取过true值和false值。v 黑盒测试着重测试软件功能黑盒测试

41、着重测试软件功能l 黑盒测试并不能取代白盒测试,它是与白盒测试互补的测试方法l 它很可能发现白盒测试不易发现的其他类型的错误v 黑盒测试力图发现下述类型的错误:黑盒测试力图发现下述类型的错误:l 功能不正确或遗漏了功能l 界面错误l 数据结构错误或外部数据库访问错误l 性能错误l 初始化和终止错误v 白盒测试在测试过程的早期阶段进行白盒测试在测试过程的早期阶段进行,而黑盒测试主要用而黑盒测试主要用于测试过程的后期于测试过程的后期v 设计黑盒测试方案时,应该考虑下述问题:设计黑盒测试方案时,应该考虑下述问题:(1)怎样测试功能的有效性?(2)哪些类型的输入可构成好测试用例?(3)系统是否对特定的

42、输入值特别敏感?(4)怎样划定数据类的边界?(5)系统能够承受什么样的数据率和数据量?(6)数据的特定组合将对系统运行产生什么影响?v 应用黑盒测试技术,能够设计出满足下述标准的测试用例应用黑盒测试技术,能够设计出满足下述标准的测试用例集:集:l(1)(1)所设计出的测试用例能够减少为达到合理测试所需所设计出的测试用例能够减少为达到合理测试所需要设计的测试用例的总数;要设计的测试用例的总数;l(2)(2)所设计出的测试用例能够告诉我们,是否存在某些所设计出的测试用例能够告诉我们,是否存在某些类型的错误,而不是仅仅指出与特定测试相关的错误类型的错误,而不是仅仅指出与特定测试相关的错误是否存在。是

43、否存在。v 等价划分等价划分l 等价划分测试是根据等价类设计测试用例的一种技术。是黑盒测试的典型方法之一。l 通过把被测试程序所有可能的输入数据域划分成若干部分。从每一部分中选取少数有代表性的数据作为测试用例,可有效减少测试次数,极大提高软件测试效率,缩短软件开发周期l 每类中的一个典型值在测试中的作用与这一类中所有其他值的作用相同,据此导出测试用例l 划分一组 等价类 描绘一组输入条件的有效或无效条件,测试程序是否有设计方案中该有的输出结果.v 划分等价类的启发式规则:划分等价类的启发式规则:1 如果规定了输入值的范围 则可划分出一个有效的等价类则可划分出一个有效的等价类(输入值在此范围内输

44、入值在此范围内)两个无效的等价类两个无效的等价类(输入值小于最小值或大于最大值输入值小于最小值或大于最大值)2 如果规定了输入数据的个数 则类似地也可以划分出一个有效的等价类和两个无效的等价类;则类似地也可以划分出一个有效的等价类和两个无效的等价类;3 如果规定了输入数据的一组值,而程序对不同输入值做不同处理 则每个允许的输入值是一个有效的等价类则每个允许的输入值是一个有效的等价类 此外还有一个无效的等价类此外还有一个无效的等价类(任一个不允许的输入值任一个不允许的输入值)v 划分等价类的启发式规则:划分等价类的启发式规则:4 4 如果规定了输入数据必须遵循的规则如果规定了输入数据必须遵循的规

45、则 则可以划分出一个有效的等价类则可以划分出一个有效的等价类(符合规则符合规则)和若干个无效的等价类和若干个无效的等价类(从各种不同角度违反规则从各种不同角度违反规则)5 5 如果规定了输入数据为整型如果规定了输入数据为整型 则可以划分出正整数、零和负整数等则可以划分出正整数、零和负整数等3 3个有效类;个有效类;6 6 如果程序的处理对象是表格如果程序的处理对象是表格 则应该使用空表,以及含一项或多项的表则应该使用空表,以及含一项或多项的表v 根据等价类设计测试方案时使用下面两个步骤根据等价类设计测试方案时使用下面两个步骤l设计一个新方案以设计一个新方案以尽可能多尽可能多地覆盖尚未被覆盖的地

46、覆盖尚未被覆盖的有效有效等价类等价类;重复这一步骤直到所有;重复这一步骤直到所有有效类有效类都被覆盖为止。都被覆盖为止。l设计一个新方案以覆盖设计一个新方案以覆盖一个且仅一个一个且仅一个尚未被覆盖的尚未被覆盖的无无效等价类效等价类;重复这一步骤直到所有;重复这一步骤直到所有无效类无效类都被覆盖为都被覆盖为止。(通常程序执行一个错误后即不继续检测其它错止。(通常程序执行一个错误后即不继续检测其它错误,故每次只测一个无效类)。误,故每次只测一个无效类)。v例:假设有一个把数字串转变成整数的函数。运行程序假设有一个把数字串转变成整数的函数。运行程序的计算机字长的计算机字长1616位,用二进制补码表示

47、整数位,用二进制补码表示整数.v 分析这个程序的规格说明,划分出如下等价类分析这个程序的规格说明,划分出如下等价类:l 有效输入的等价类有:(1)l-6(1)l-6个数字字符组成的数字串;个数字字符组成的数字串;123456123456(2)(2)最高位数字是零的数字串;最高位数字是零的数字串;000001000001(3)(3)最高位数字左邻是负号的数字串;最高位数字左邻是负号的数字串;-12345-12345l 无效输入的等价类有:(4)(4)空字符串空字符串(全是空格全是空格);(5)(5)左部填充的字符既不是零也不是空格;左部填充的字符既不是零也不是空格;XXXXX1XXXXX1(6)

48、(6)最高位数字右面由数字和空格混合组成;最高位数字右面由数字和空格混合组成;1 2 1 2 (7)(7)最高位数字右面由数字和其他字符混合组成;最高位数字右面由数字和其他字符混合组成;13 XX13 XX(8)(8)负号与最高位数字之间有空格;负号与最高位数字之间有空格;-1234-1234l 合法输出的等价类有(9)(9)在计算机能表示的最小负整数和零之间的负整数在计算机能表示的最小负整数和零之间的负整数(10)(10)零;零;0 0(11)(11)在零和计算机能表示的最大正整数之间的正整数在零和计算机能表示的最大正整数之间的正整数l 非法输出的等价类有(12)(12)比计算机能表示的最小

49、负整数还小的负整数比计算机能表示的最小负整数还小的负整数-32769-32769(13)(13)比计算机能表示的最大正整数还大的正整数比计算机能表示的最大正整数还大的正整数3276832768v 边界值分析边界值分析l就是对输入或输出的边界值进行测试的一种黑盒测试就是对输入或输出的边界值进行测试的一种黑盒测试方法方法l处理边界情况时程序最容易发生错误处理边界情况时程序最容易发生错误l设计使程序运行在边界情况附近的测试方案,暴露出设计使程序运行在边界情况附近的测试方案,暴露出程序错误的可能性更大一些程序错误的可能性更大一些l边界值分析法,应该选取刚好等于、稍小于和稍大于边界值分析法,应该选取刚好

50、等于、稍小于和稍大于等价类边界值的数据作为测试数据等价类边界值的数据作为测试数据l通常设计测试方案时总是通常设计测试方案时总是联合联合使用使用等价划分等价划分和和边界值边界值分析分析两种技术两种技术v 边界值分析边界值分析l 例如,为了测试前述的把数字串转变成整数的程序,除了上一小节已经用等价划分法设计出的测试方案外,还应该用边界值分析法再补充下述测试方案:(12)使输出刚好等于最小的负整数 输入:-32768 预期的输出为:-32768 (13)使输出刚好等于最大的正整数 输入:32767 预期的输出:32767(14)使输出刚刚小于最小的负整数 输入:-32769 预期的输出;“错误无效输

51、入”(15)使输出刚刚大于最大的正整数 输入:32768 预期的输出:“错误无效输入”v 错误推测错误推测l错误推测法在很大程度上错误推测法在很大程度上靠直觉和经验靠直觉和经验进行。进行。l基本想法基本想法 是列举出程序中可能有的错误和容易发生错误的特殊情况,是列举出程序中可能有的错误和容易发生错误的特殊情况,并且根据它们选择测试方案。并且根据它们选择测试方案。l经验表明,在一段程序中已经发现的错误数目往往经验表明,在一段程序中已经发现的错误数目往往和尚未发现的错误数成正比和尚未发现的错误数成正比l因此,在进一步测试时要着重测试那些已发现了较因此,在进一步测试时要着重测试那些已发现了较多错误的

52、程序段多错误的程序段v 错误推测错误推测l思路 列出可能有的错误 列出容易发生错误的特殊情况 以此为基础设计测试方案l根据 直觉、经验l工具 常见错误清单、判定表等v 实用策略实用策略 :黑盒设计黑盒设计 +白盒补充白盒补充l 在任何情况下都应该使用边界值分析的方法;l 必要时用等价划分法补充;l 必要时再用错误推测法补充;l 对照程序逻辑,检查测试方案。可根据对程序可靠性的要求采用不同的逻辑覆盖标准,必要时可根据对程序可靠性的要求采用不同的逻辑覆盖标准,必要时补充一些测试方案。补充一些测试方案。注:即使用上述综合策略设计测试方案,仍不能保证发现一切错误。例如Lucent公司经过包括逐行检查源

53、代码在内的多方面测试之后,其软件能达标运行的成功率为80%v 调试调试l 是在测试发现错误之后排除错误的过程l 软件错误的外部表现和它的内在原因之间可能并没有明显的联系,调试就是把症状和原因联系起来的尚未被人深入认识的智力过程。v 调试过程调试过程l 调试过程从执行一个测试用例开始l 评估测试结果,如果发现实际结果与预期结果不一致,则这种不一致就是一个症状,它表明在软件中存在着隐藏的问题l 调试过程试图找出产生症状的原因,以便改正错误执行测试执行测试用例用例测试测试用例用例结果结果Debugging附加测试附加测试被怀疑的被怀疑的原因原因已识别的已识别的原因原因纠正纠正回归测试回归测试Debu

54、ggingv 调试过程总会有以下两种结果之一:调试过程总会有以下两种结果之一:l 找到了问题的原因并把问题改正和排除掉找到了问题的原因并把问题改正和排除掉l 没找出问题的原因没找出问题的原因 猜测一个原因猜测一个原因 用例验证假设用例验证假设 重复重复.v 调试困难与软件错误的特征:调试困难与软件错误的特征:1、症状和产生症状的原因可能在程序中相距甚远,紧耦合的程序结构更加剧了这种情况2、当改正了另一个错误之后,症状可能暂时消失了。3、症状可能实际上并不是由错误引起的(例,舍入误差)v 调试困难与软件错误的特征:调试困难与软件错误的特征:4、症状可能是由不易跟踪的人为错误引起的5、症状可能是由

55、定时问题而不是由处理问题引起的。6、可能很难重新产生完全一样的输入条件(例如,输入顺序不确定的实时应用系统)7、症状可能时有时无,这种情况在硬件和软件紧密地耦合在一起的嵌入式系统中特别常见8、症状可能是由分布在许多任务中的原因引起的,这些任务运行在不同的处理机上v 调试途径调试途径l 调试的目标都是寻找软件错误的原因并改正错误l 调试途径主要有:1 1、蛮干法:、蛮干法:凭经验猜测,写输出语句来观察结果。凭经验猜测,写输出语句来观察结果。2 2、回溯法:、回溯法:由症状最先出现的地方,沿控制流向回检查。适用由症状最先出现的地方,沿控制流向回检查。适用于小型程序。于小型程序。3 3、对分查找法:

56、、对分查找法:在关键点插入变量的正确值在关键点插入变量的正确值 输出正确输出正确错误在前半段错误在前半段错误在后半段错误在后半段NY收集数据收集数据组织数据组织数据研究数据研究数据间的关系间的关系提出假设提出假设证明假设证明假设纠正错误纠正错误能能能能不能不能4 4、归纳法:归纳法:从错误症状中找出规律,推断根源从错误症状中找出规律,推断根源列举可能列举可能的原因的原因排除不正确排除不正确的假设的假设精化余下精化余下的假设的假设证明证明假设假设收集更多数据收集更多数据纠正纠正错误错误有剩余有剩余能能不能不能无剩余无剩余5 5、演绎法:、演绎法:普通普通 特殊特殊 从假设中逐步排除、精化,从而导

57、出错误根源。从假设中逐步排除、精化,从而导出错误根源。v 在动手改正错误之前,软件工程师应该仔细考虑下述在动手改正错误之前,软件工程师应该仔细考虑下述3个问题:个问题:l 是否同样的错误也在程序其他地方存在?一个程序错误是由错误的逻辑思维模式造成的一个程序错误是由错误的逻辑思维模式造成的 而这种逻辑思维模式也可能用在别的地方而这种逻辑思维模式也可能用在别的地方 仔细分析这种逻辑模式,有可能发现其他错误仔细分析这种逻辑模式,有可能发现其他错误l 要进行的修改可能引入的“下一个错误”是什么?在改正错误之前应该仔细研究源程序在改正错误之前应该仔细研究源程序(最好也研究设计文档最好也研究设计文档),以

58、评,以评估逻辑和数据结构的耦合程度估逻辑和数据结构的耦合程度 如果所要做的修改位于程序的高耦合段中,则修改时必须特别小心如果所要做的修改位于程序的高耦合段中,则修改时必须特别小心谨慎谨慎l 为防止今后出现类似的错误,应该做什么?v 基本概念基本概念l软件可靠性定义:软件可靠性定义:软件可靠性是程序在给定的时间间隔内,按照规格说明书软件可靠性是程序在给定的时间间隔内,按照规格说明书的规定成功地运行的概率。的规定成功地运行的概率。l按照按照IEEEIEEE的规定的规定 术语术语“错误错误”的含义是由开发人员造成的软件的含义是由开发人员造成的软件差错差错(bug)(bug)术语术语“故障故障”的含义

59、是由错误引起的软件的的含义是由错误引起的软件的不正确行为不正确行为v 基本概念基本概念l可靠性:可靠性:程序在给定的程序在给定的时间间隔时间间隔内,按照说明书的内,按照说明书的规定,成功地运行的概率。规定,成功地运行的概率。l可用性:可用性:程序在给定的程序在给定的时间点时间点,按照说明书的规定,按照说明书的规定,成功地运行的概率。成功地运行的概率。l正确性正确性:程序的功能正确。:程序的功能正确。设系统错误停机时间为设系统错误停机时间为t td1d1,t,td2d2,;,;正常运行时正常运行时间为间为t tu1u1,t,tu2u2,;,;则系统的则系统的“稳态可用性稳态可用性”为为Avail

60、ability=其中其中 MTTF=平均无故障时间平均无故障时间=MTTR=平均维修时间平均维修时间=MTTR MTTFMTTFn1iuitn1n1iditn1换个角度看问题换个角度看问题MTTFKIE)(ETTCE ET T-测试之前程序中错误总数;测试之前程序中错误总数;I IT T-程序长度;程序长度;E EC C-改正的错误数;改正的错误数;K K-是一常数,典型值为是一常数,典型值为200200还有一个问题还有一个问题 E ET T=?=?估算错误总数的方法:估算错误总数的方法:植入错误法:植入错误法:人为植入人为植入N NS S个错误,测后发现个错误,测后发现n ns s个植入错误

61、和个植入错误和n n个原有错个原有错误,则设误,则设TSSSEnnNNnNnNs 分别测试法:分别测试法:二人(组)分别独立测试同一程序,甲测得错误总二人(组)分别独立测试同一程序,甲测得错误总数为数为B B1 1,乙测得为,乙测得为B B2 2,其中有,其中有b bc c是两人发现相同的错语,是两人发现相同的错语,设以甲的测试结果为基准(即相当于设以甲的测试结果为基准(即相当于中的植入错误),中的植入错误),则设则设T1c221cEBbBBBBBb一般多测几个一般多测几个 取平均取平均。B小结小结1、实现的两个阶段(编码与测试)、实现的两个阶段(编码与测试)2、测试是保证软件可靠性的主要手段

62、、测试是保证软件可靠性的主要手段3、常用的测试方法:白盒测试与黑盒测试、常用的测试方法:白盒测试与黑盒测试4、软件测试阶段至少有:单元测试、集成测试与、软件测试阶段至少有:单元测试、集成测试与验收测试。验收测试。作业作业vP184 4大题的(大题的(1)()(3)小题。)小题。主要问题:穷尽测试通常是不可能的。主要问题:穷尽测试通常是不可能的。例:例:(Black-box)(Black-box)程序要求输入程序要求输入3 3个整形数据。若字个整形数据。若字长长1616位,则各种可能输入的排列组合共有位,则各种可能输入的排列组合共有 (种)(种)141416161616161610103 32 22 22 2若程序执行需若程序执行需1010-3-3秒,则对于所有合法输入秒,则对于所有合法输入的测试大约需用一万年,而且还应测试输入非法的测试大约需用一万年,而且还应测试输入非法数据的情况。数据的情况。例:下图所示的程序中共有例:下图所示的程序中共有 5 52020 10101414条可能的执行通路,条可能的执行通路,显然,每条通路都执行一遍是不现实的。显然,每条通路都执行一遍是不现实的。循环20次

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

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!