7章实现 西安电子科技大学 软件工程教学课件_第1页
7章实现 西安电子科技大学 软件工程教学课件_第2页
7章实现 西安电子科技大学 软件工程教学课件_第3页
7章实现 西安电子科技大学 软件工程教学课件_第4页
7章实现 西安电子科技大学 软件工程教学课件_第5页
已阅读5页,还剩120页未读 继续免费阅读

下载本文档

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

文档简介

第七章实现 西安电子科技大学网络学院课程 第七章编码 程序设计的语言翻译过程在编程步骤中 要把详细设计的表达式翻译成编程语言的构造 编译器接受作为输入的源代码 源代码生成作为输出并从属于机器的目标代码 然后编译器把输出目标代码进一步翻译成机器代码 它是真正指令 它的驱动放在CPU中的微代码 程序设计的语言分类 基础语言 BASIC FORTRAN COBOL ALGOL 结构语言 PL 1 PASCAL C ADA 专用语言 FORTH PROLOG LISP 系统实现语言 C 语言分类静态高级语言 COBOL FORTRAN 动态高级语言块结构高级语言 ALGOL PASCAL 可视化编程语言 VB VC PB BC C BUILDER 第七章编码 7 1 1程序设计语言特点与特性编程语言的特点心理学观点在编程中 人的因素极其重要 所以 语言的心理学特性对代码的翻译和实现的设计都有重要影响 1 一致性一致性是表示某种语言使用一致的符号 采用看似任意的限制和支持语法或语义例外规则的程度 例如 FORTRAN用圆括号用作数组下标的界限符 算术运算有限次序的修改符等 容易引起难以觉察的错误 2 多义性编程语言的多义性是程序员的理解 一般一条语句一个解释 有时却有多种解释 第七章编码 3 紧凑性紧凑性是一种面向代码信息量的表示 度量紧凑性的语言属性有 1 该语言支持结构化构造和逻辑 块 的程度 2 所用的关键字和缩写词的种类 3 数据类型和缺省特性的品种 4 算术运算和逻辑运算的数量4 局域性是编程语言的综合特性 当语句可以组合为程序块 结构化构造可以直接实现 设计代码和合成代码具有高的模块性和聚合时 局域性就高 5 线性 是一种心理特性 它与保持功能域的概念紧密联系 即当遇到一个逻辑运算线性序列时 人容易理解 外延分支和外延大的循环都违反处理的线性 而结构化构造的直接实现有助于编程语言的线性 第七章编码 工程观点是把重点放在具体的软件开发项目的需要上 虽然 可以对源代码提出许多要求 但常常为源代码建立一组工程特性 1 易于把设计翻译为代码 2 编译器效率 3 源代码可移植性 源代码不修改或很小修改 直接搬到另一编译器 环境变了 源码不变 4 开发工具的可用性 许多编程语言有调试工具 内部编辑 源码控制 浏览器 宏处理器 反向工程工具和其他工具 5 可维护性 源码必须可读 并能根据设计的变化进行修改等 第七章编码 选择一种语言语言选择的一般哲理是 从问题开始 判断它的需要是什么 以及它们相关的重要性 因为一种语言不可能同时满足各种需求 那么就应该对各种需求进行权衡 比较各种可用语言的适用程度 最后选择一种被认为是最适用的 用于评价语言的准则 1 一般的应用领域 2 算法和计算的复杂性 3 软件运行环境 4 性能考虑 5 数据结构的复杂性 6 软件开发人员的知识 7 一个好的编译器或交叉编译器的可使用性 第七章编码 7 1 2程序设计途径与编写程序的风格l程序设计方法论方法论 自上而下 程序可读性好 可靠性高 自下而上 局部优化 系统整体性差 但能及时发现算法是否可行 返工性好 编程人员的主要差别在于比前面介绍了二种人是如何编程的 但各有优缺点 可以采用 在软件预言和攻关 技术积累时采用自下而上 在紧迫工程时 采用自上而下 第七章编码 l程序设计工具1 编译程序它是最基本的程序设计工具 它可以诊断出程序中的错误 减少开发成本 生成高效率的机器代码2 代码管理系统l编码风格编码风格实际上是一种编码原则 编码对象是有两个 机器 编码要为机器所理解与执行人 能读懂 方便使用与维护编码风格最重要的有两条 简单和清晰 程序中与编码风格有关的因素有代码的文档化 数据说明方法 语句构造处理和I O技术 下面我们分别讨论这些因素 第七章编码 l代码文档化代码文档化是从选择标识符 变量 标号 的名字开始 接着是写程序和安排注释 最后是程序的整个组织形式的视觉 所有的编程语言都允许用自然语言在程序中进行注释 问题在于 1 多少注释才算够 2 注释应该放在什么位置 3 注释是否会使逻辑流不清楚 4 注释是否会使读者误解 5 注释是否会使程序不可维护 这些问题很难回答 但有一点很清楚 软件必须包含代码的内部说明 开发者可以用注释的方法对代码内部进行说明 第七章编码 l注释 注释范例 序言性注释 应该安排在每个模块的起始部分 其内容有 1 说明每个模块的用途 并指明它的功能 2 接口描述 应包括 调用序列 每个参数的描述 以及所有从属模块清单 3 有关数据的讨论 包括 重要的变量和它们的用途 限制或约束条件 以及其他必要的信息 4 开发历史 包括 模块设计人姓名 评审人姓名及日期 修改说明及日期 功能性注释 应嵌入在源代码体内 用来描述处理功能 书写这种注释的基本原则是 注释要解释程序代码 还应提供附加说明 此外 注释还应做到以下几点 1 注释是说明代码块 而不是注释每一行代码 2 使用空行或缩格 以便很容易的区分注释和代码 3 注释一定要正确 以免引起错误 造成误解 序言性注释 功能性注释 第七章编码 当使用PDL表示进行详细设计时 设计文档可以作为注释直接嵌入在源代码体内 它是十分有效 当修改设计或代码时 确保设计和代码都能维护 1 数据说明的次序应规范化 可使数据属性更容易寻找 有利于测试 纠错和维护 2 当多个变量名在一条语句说明时 变量名的次序应按字母序排列 3 如设计中 确定了一个复杂的数据结构 就应该用注释说明在编程语言实现时的特点 第七章编码 l语句构造软件逻辑构造也是在设计时确定的 而每个语句构造则是编码步骤中的一部分 语句构造应当遵守的原则是 每条语句应当简单而直接 同时也不应为了追求运行效率而使代码变得复杂化 而让人难以理解 为了提高代码的可读性 最好一行只写一条语句 因为许多编程语言允许一行写多条语句 还应采用缩排的方式 这样可以使程序段的逻辑结构和功能特征更加清晰 第七章编码 单条源代码 语句 的简化方法如下 1 避免使用复杂的条件测试 2 排除测试条件的 非 3 避免多重循环嵌套或条件嵌套 4 用括号的方法使逻辑表达式或算术表达式更加清晰 5 用空格或可读的符号使语句内容更加清晰 6 只使用国家标准 7 要时时想着 如果代码不是我编写的 我也能读懂它 总之 一句话 要力求直接了当 简单明了 第七章编码 lI OI O的风格不是在编码时确定的 而是在软件需求分析和实际中就确定了的 但是 在编码时 I O的实现方式决定了用户对系统特征的可接受程度 不管软件的性质是批处理 还是交互的 在设计和编码时 都应考虑下述有关I O风格原则 1 检查所有输入数据的有效性 2 检查输入项上的重要组合的合法性 3 保持简单的输入格式 4 使用数据结束说明符 而不应要求用户规定输入项目的数量 5 用标记标明交互的输入请求 应规定可以使用的选择值或边界值 6 当编程语言对格式有严格的要求时 应保持输入格式的一致性 7 给所有输出加标记 并设计所有输出报告 第七章编码 l效率有三条准则应该指出的 1 效率是一种性能要求 因此 应当在软件需求时规定 软件效率应按实际需要来要求 而不是越高越好 2 一个良好的设计可以提高效率 3 代码效率与代码的简单性紧密联系 第七章编码 代码效率源代码的效率与详细设计阶段所确定的算法效率直接相关 但编码风格也会影响运行速度和对内存的需要 一般可以使用以下准则 1 在进行编码以前 应简化算术表达式和逻辑表达式 2 要细心的评价嵌套循环 以确定能否把一些语句或表达式移到循环外边 3 应尽量避免使用多维数组 4 应尽量避免使用指针和复杂的列表 5 采用快的算术运算 6 即使语言允许 也不要采用混合数据类型 7 只要可能 就应当采用整型算术表达式和布尔表达式 第七章编码 内存效率在大型计算机和工作站领域中 内存限制大多已是过去的事了 低成本内存提供了大的物理地址空间 而虚存管理为应用软件提供了巨大的逻辑地址空间 对于这样的环境 内存效率不等于使用最小内存 倒不如说 内存效率必须注意考虑操作系统的分页特征 而代码局域性或通过结构化构造功能域的管理才是减少分页和提高效率的最好办法 尽管低成本 高密度内存芯片发展很快 但在嵌入式微处理器领域中 内存限制仍是一个非常实际非常重要的问题 如果系统需求 如高容量低成本产品 要求最小内存 那么为了内存的压缩性质 必须非常细心的对高级语言的编译程序进行估算 或作为最后的手段 也可以采用汇编语言 第七章编码 I O效率当讨论I O效率时 有两类I O要考虑 1 由人支配的I O 2 取决于其他设备的 如磁盘或另一台计算机 的I O 提高I O效率的简单原则 1 I O要求的数量应当减至最小 2 所有I O应当缓存 以减少过多的通信次数 3 对于辅存 如磁盘 应当选择和使用最简单的可接受的存取方法 4 辅存设备的I O 应当是块状的 终端和打印机的I O 应当考虑设备的特性 以提高质量和速度 5 要记住 如果超高效的I O不能被人们所理解 那么这样的I O是没有价值的 第七章编码 7 1 3保护性编程对于认为编写程序可以做到完全没有错误的人来说 在软件中建立检查的意义不大 相反 对于相信软件中总会有遗留错误的人来说 进行软件内部的错误检查则是一项重要策略 这种策略就是保护性编程 defensiveprogramming 保护性编程技术可分为主动和被动两种 主动保护技术周期性的或在空闲时间对整个程序或数据库进行搜索 用以发现异常情况 被动保护技术是在到达检查代码时 对程序的某些部分进行检查 第七章编码 某些反对保护性编程人员提出了许多逃避保护性编程的理由 1 我们的程序中即使有错误 也是很少的 所以不需要保护性编程 2 要求采用他人的程序来检查和发现我的程序错误 这是不公正的 3 错误检查降低了计算机系统的速度 而且还要求额外的内存 4 错误检查要占用很多编程时间 5 可以在我的程序中加入错误检查 不过一旦程序通过测试 就应把它撤去 第七章编码 对这些反对意见的回答 都直接或间接的与程序中预料的错误数及其潜在后果有关 如果相信错误无所不在 即有相当数量的错误在晚期发现是不可避免的 就必须采用保护性编程 如果这种保护在测试阶段对我们有帮助 则肯定要在程序操作使用时继续将其包括在内 如果承认错误会出现这一事实 则比起因出现错误所带来的责难来说 增加一些工作量是有意义的 第七章编码 另一方面 基于运行时间 存储空间和编程费用等方面的反对意见 仅当保护性编程要求设计增加的资源量相当大时才有意义 事实上 只有在极少数情况下 保护性编程所要求增加的资源量才会相当大 以致不得不放弃考虑这种技术 第七章编码 Yourdon曾提出过一个建设性意见 即在设计过程的早期就把保护性编程包括进去 在设计过程中 大多数设计在填充可用存储空间时 其规模都增加的很快 如果企图在设计过程的结尾再引入保护性编程 则肯定已没有剩余空间 而且在近乎完成的设计中 移动任何部分挤出空间的任何做法 都会招致强烈的反对 但如果在一开始就把保护性编程包括进来 在希望增加新的保护性特征时 就能容易的避开设计中的讨价还价 第七章编码 另一个要考虑的重要事项是检查哪些项目 尽管可以不受冗余编程概念的约束并检查不合理的情况 如果企图检查所有项目 实质上是实现冗余编程 关于这个问题 Shooman建议设计人员先准备以下列表 以利于做出正确的判断 1 可能需要检查的项目表 应附有对编程时间 运行时间及存储要求的开销估计 2 各种类型错误出现的期望数据表 应标出每种类型错误可能造成的后果 研究这些信息有助于设计者确定应进行的检查 第七章编码 保护性编程中的典型检查项目 1 来自外部设备的输入数据 范围 属性 2 由其他程序提供的数据 3 数据库 数组 文件 结构 记录 4 操作员的输入 性质 顺序 5 栈的深度 6 DOCASEI中的I范围 并计算GOTO 7 数组界限 8 表达式中出现零分母的可能性 9 所期望的程序版本是否在运行 最后系统重新组合的日期 10 通过其他程序或外部设备的输出 第七章编码 以上讨论的所有保护技术都是被动式保护技术 因为必须等到某个输入之后才能开始检查 而主动式保护技术则既可在处理输入信息期间使用 也可在系统空闲或等待下一次输入时使用 下面是几中应用主动式保护技术的例子 1 存储器范围检查如果只在存储器的某些块中存放了某种类型和范围的数据 则可经常检查这些条件 2 标志验证如果采用标志来指示系统的状态 则可经常对它们作独立的检查 3 逆翻译有时必须将数据或变量值从一种代码或系统翻译为另一种代码或系统 可以利用反变换来检查原始值的翻译是否正确 第七章编码 4 在多数情况下 复杂系统由多个操作状态 它们可以采用某些特定的存储值来表示 如果能够独立的验证这些状态 就可以进行检查 5 连接检查使用链表结构时 可以对其连接情况进行检查 6 时间溢出检查加入已知某个计算所需的最大时间 则可利用定时器来监视该计算 7 其他技术经常仔细的考虑所使用的数据结构 操作序列和定时 以及程序的功能 往往能启发我们提出其他主动式保护技术 第七章编码 7 1 4冗余编程冗余 redundant 是改善系统可靠性的一种重要技术 对于硬件 即提供额外的元件或系统 使其与原始系统并行工作 在某些情况下 其连接是使所有的元件并行工作 如果某一个硬件失效它就退出 由冗余元件维持系统的运转 在另外一些情况下 只有在线上的 最初 元件在工作 当出现故障时 由检测电路 有时是人 把开关拨向备用元件 前一种原理称并行冗余 后一种称备用冗余 有时也称热备用和冷备用或主动式冗余和被动式冗余 第七章编码 对于软件 某些概念是一致的 而另一些概念则必须修改 若采用两个具有同样程序文本的计算机来实现软件冗余 得到的仅仅是冗余的硬件 而非冗余的软件 如果在两台计算机上程序是一样的 则软件上的任何错误都会在两台机器上导致同样的故障 要想采用冗余软件 就必须设计出两个不同的程序 不仅采用不同的算法和设计来实现同一个计算 而且编程人员也应该不同 第七章编码 假设要计算二次方程的实根 则可以在一个程序中使用二次求根公式 而在第二个程序中采用牛顿 拉菲逊 Newton Raphson 数值逼近法 如果两个结果在额定的 计算误差 范围内是一致的 则可以采用任何一个结果或两个结果的平均值作为答案 并且打印出来 若结果不一致 而且不知道那一个正确 则可采用错误监测系统来纠正 如果采用三种以上的计算 则可采纳多数答案 这种技术称为多数逻辑或多数表决 第七章编码 把一个程序制成两个冗余拷贝的开发费用表面上似乎应为单个文本的两倍 但实际费用可能还不到1 5倍 因为软件的描述 设计和大部分测试以及文档编制的费用由两个文本分担了 冗余编程的副作用是由于文本增加而带来的存储空间的增加 以及运行时间的延长 为此可以采用海量存储器和覆盖技术 并仅仅在关键部分采用冗余计算 这样可使附加费用减到最小 第七章软件测试 7 2 基本概念 测试的目的 是尽可能多的发现并排除软件中的错误 国际上惯用 测试和 测试 测试的目标和定义 在G J Myers的经典著作 软件测试之艺术 中给出了测试的定义 程序测试是为了发现错误而执行程序的过程 这个定义 被业界所认可 经常被引用 除此之外 G J Myers还给出了与测试相关的三个重要观点 那就是 测试是为了证明程序有错 而不是证明程序无错误 一个好的测试用例是在于它能发现至今未发现的错误 一个成功的测试是发现了至今未发现的错误的测试 实际上 这里暗示了 软件测试 在不同侧面上的含义 也就决定了对软件测试不同的定义和不同的理解 第七章软件测试 7 2 1黑盒测试和白盒测试黑盒测试 又称为功能测试 典型的 测试 完全不考虑程序内部结构和处理过程 具体是在程序接口进行测试 它只检查程序功能是否按照规格说明书的规定进行 程序能否适当地接受输入数据 产生正确的输出信息并且保持外部信息 数据库 文件 的完整性 白盒测试 由称为结构测试 典型的 测试 进行逻辑测试 它完全了解结构及处理过程 按照程序内部的逻辑测试程序 检查程序中每条通路是否都能按预定要求正确工作 第七章软件测试 7 2 2软件测试的原则 Myer提出以下原则 1 程序员或程序设计机构不应该测试自己设计的程序 采用客观态度比较难 自己测效率低 2 测试用例的设计不仅要有确定的输入数据 而且要有确定预期输出的详细数据 第七章软件测试 3 测试用例的设计不仅要有合理的输入数据 还要有不合理的输入数据 4 除了检查程序是否做完了它应作的事之外 还要检查它是否做了不应该做的事 5 保留全部测试用例 并作为软件的组成部分之一 6 程序中存在错误的概率与在该程序中已发现的错误数成正比 例如 用户的错误有47 集中在4 的模块中 但这些现象告诉我们 为了提高测试效率 要集中对付那些容易出错的程序段 第七章软件测试 测试阶段的信息流 第七章软件测试 7 3单元测试单元测试是针对模块 它不是一个独立的程序 因此 模块自己不能运行 要靠其它部分来调动和驱动 这样就要为每个单元测试开发两个软件 驱动程序和连接程序 7 3 1单元测试内容主要对模块的五个基本特性进行评价1 模块接口其它测试之前 首先要对穿过模块接口的数据流进行测试 若数据不能正确的输入 输出 其它测试将无法进行 Myers的接口测试要点 实在参数与形式参数的个数是否相等 实在参数与形式参数的属性是否匹配 第七章软件测试 实在参数与形式参数的单位是否匹配 传送给所调用的模块的实在参数与形式参数的个数 属性和单位是否相符 调用内部函数所用参数的个数 属性和次序是否正确 是否引用了与当前入口无关的参数 输入是否仅改变形式参数 全程变量在各模块中的定义是否一致 常数是否当变量传送 第七章软件测试 模块实现外部I O时 必须进行附加的接口测试 Myers同时提出 文件属性是否正确 OPEN语句是否正确 格式说明与I O语句是否匹配 缓冲器大小与记录长度是否匹配 文件是否先打开后使用 文件结束的条件是否处理过 I O的错误是否处理过 输出信息中是否有正文的错误 第七章软件测试 2 局部数据结构对一个模块而言 局部数据结构是错误的主要来源 不正确或不一致的说明 错误的初始化或错误的缺省值 拼写错误或截短的变量名 上溢 下溢错误 不一致的数据类型有可能时也应确定全程数据对模块的影响 第七章软件测试 3 重要的的执行路径选择测试路径是一项基本的任务 设计各种测试用例 用来发现由于不正确的计算 错误的比较或不适当的控制流而造成的错误 计算中比较常见的错误 算术运算优先次序不正确或理解错误 运算方式不正确 初始化不正确 精度不够 表达式符号表示错误 第七章软件测试 比较与控制流向中常见的错误 即通常在比较之后会改变控制流向 不同的数据类型的比较 逻辑与运算符不正确或优先次序错误 因精度误差造成成本应相等的量不相等 比较不正确或变量不正确 循环不终止或循环终止不正确 当遇到分支循环时 出口错误 错误的修改循环变量良好的设计要求能够预测错误的条件 并且设置处理错误路径 第七章软件测试 现在计算机可以直接显示出错误信息的内容 不用再去查找 但往往有下面这样的情况 错误描述难以理解 错误提示与实际错误不符 在错误处理前 错误条件已引起系统干预 联机条件处理不正确 错误描述所提供的信息不足以确定造成错误的位置 另外 考虑联机条件 即人 机对话 交互处理等问题 第七章软件测试 5 边界测试软件通常容易在边界上出错 比如一个n位数组 当处理数组的第n个元素时 或M次循环在遇到第M次重复时 都常常发生错误 就是说使用数据流 控制流 当刚好等于 小于 或大于最大值或最小值的数据时 非常可能发生错误 第七章软件测试 7 3 3计算机测试模块并不是一个独立的程序 因此必须为每个单元开发驱动程序或存根程序 软件 驱动程序它实际上相当于一个程序 它接受不同的测试用例的数据 并把这些数据传送给测试模块 最后打印结果 即通常所讲设计一个测试路径 第七章软件测试 连接程序连接程序用来代替被测模块所调用的模块 l单元测试相当于分调 组装测试相当于联调l确认测试相当于黑盒测试 相当于考机系统测试考察软件功能是否符合要求及性能要求 例如 导弹跟踪系统 要将雷达与计算机相连 考察软件正确性 单元测试在单元测试之前 应必须通过编译器进行的词法 语法的检错 然后用详细设计描述做指南 对重要的执行通路进行测试 以便发现错误 第七章软件测试 单元测试过程1 代码审查编者本人 非正式 人工测试审查小组代码审查比计算机测试优越点 一次可以发现多处错误 采用代码审查可减少系统验证的总工作量 第七章软件测试 第七章软件测试 2 测试软件驱动 存根程序是单元测试必须编写的测试软件 是开销 但不交给用户 模块的内聚程度高可以简化单元测试过程 集成测试 又成组装测试 集成测试是组装软件的系统技术 第七章软件测试 7 4集成测试 自顶而下集成 称为渐增测试 一个要测模块与已测试好的结合测试 自底向上集成 非渐增测试 分别测试每个模块 再把所有模块按设计要求结合 自顶而下结合自顶而下结合是从主模块 主程序 开始 沿控制层次向下移动 逐步结合每个模块 第七章软件测试 自顶而下集成自底向上集成 第七章软件测试 自顶向下综合测试的具体步骤为 1以主控模块作为测试驱动模块 把对主控模块进行单元测试时引入的所有桩模块用实际模块替代 2依据所选的集成策略 深度优先或广度优先 每次只替代一个桩模块 3每集成一个模块立即测试一遍 4只有每组测试完成后 才着手替换下一个桩模块 5为避免引入新错误 须不断地进行回归测试 即全部或部分地重复已做过的测试 第七章软件测试 不同集成测试策略的比较自顶向下集成的优点在于能尽早地对程序的主要控制和决策机制进行检验 因此较早地发现错误 缺点是在测试较高层模块时 低层处理采用桩模块替代 不能反映真实情况 重要数据不能及时回送到上层模块 因此测试并不充分 自底向上集成方法不用桩模块 测试用例的设计亦相对简单 但缺点是程序最后一个模块加入时才具有整体形象 它与自顶向综合测试方法优缺点正好相反 因此 在测试软件系统时 应根据软件的特点和工程的进度 选用适当的测试策略 有时混和使用两种策略更为有效 上层模块用自顶向下的方法 下层模块用自底向上的方法 各有优缺点 采用混合法比较合适 第七章软件测试 自底向上结合自底向上测试是从 原子 模块 即软件结构最低层的模块 开始组装测试 因测试到较高层模块时 所需的下层模块功能均已具备 所以不再需要桩模块 自底向上综合测试的步骤分为 1把低层模块组织成实现某个子功能的模块群 cluster 2开发一个测试驱动模块 控制测试数据的输入和测试结果的输出 3对每个模块群进行测试 4删除测试使用的驱动模块 用较高层模块把模块群组织成为完成更大功能的新模块群 第七章软件测试 7 5确认测试 验收测试 确认测试的目的是向用户表明系统能满足要求 测试范围与系统测试范围类似 确认测试是黑盒测试 验收测试有两种结果1 用户接受2 有差距 占多数 注意 搞好关系 切记不要互相推托责任 单位内部矛盾不要在用户面前互相描述 铁的纪律 软件配置复查设计测试方案设计测试方案是测试阶段的关键技术问题 第七章软件测试 设计目标 确定一组最可能发现某个错误或某类错误的测试数据设计技术主要有 适用于黑盒测试的等价划分 边界值分析以及错误推测法 适用于白盒测试的逻辑覆盖法通常做法 用黑盒法设计基本测试方案 再用白盒测补充一些方案 7 6白盒测试所谓白盒测试是对一系列测试过程的总称 这组测试过程逐渐进行越来越完整的通路测试 大致有以下一些不同的覆盖标准 具体做法是确定一组最可能发现某类错误的测试数据 作到尽可能完备的测试 第七章软件测试 语句覆盖 至少每个语句应执行一次测试路径sacbed 仅测了条件为 T 因此 语句覆盖时程序的逻辑覆盖很少 是较弱的逻辑覆盖 判定覆盖 称为分支覆盖每个判定的每个分支都至少执行一次 A 3 B 0 X 3 覆盖sacbd A 1 B 0 A 2 B 1 X 1 覆盖sabed A 1或B 0 X 1 两组设定输入数据 第七章软件测试 被测试模块的流程图 第七章软件测试 条件覆盖不仅每个语句至少执行一次 而且判定表达式中每个条件都取得各种可能的结果 条件覆盖通常比判定覆盖强 它使判定表达式中每个条件都取得到两个不同的结果 判定覆盖却只关心整个判定表达式的值 判定 条件覆盖同时满足判定覆盖与条件覆盖含义是 选取足够多地测试数据 使得判定表达式中的每个条件都取到各种可能的值 而且每个判定表达式也都取到各种可能的结果 第七章软件测试 条件覆盖应选取的数据使得a点有下述结果出现 A 1 A 1 B 0 B 0b点有下述结果出现 A 2 A 2 X 1 X 1条件覆盖中选的数据A 2 B 0 X 4 满足A 1 B 0 A 2 X 1 覆盖sacbed A 1 B 1 X 1 满足A 1 B 0 A 2 X 1 覆盖sabd 第七章软件测试 判定覆盖和条件覆盖区别 条件覆盖比判定覆盖强 因为它使得判定表达式中每个条件都取到了两个不同的结果 而判定覆盖只关心整个判定表达式的值 但也有例外 虽然每个表达式取到了两个不同的结果 判定表达式却始终只取一个值 只满足条件覆盖不满足判定覆盖 A 2 B 0 X 1 满足A 1 B 0 A 2 X 1 覆盖sacbed A 1 B 1 X 2 满足A 1 B 0 A 2 X 1 覆盖sabed 第七章软件测试 判定覆盖中选的数据A 3 B 0 X 1A 2 B 1 X 3判定 条件覆盖中选的数据A 2 B 0 X 4A 1 B 1 X 1 条件组合覆盖选取足够多的数据 使每个判定表达式中的条件的各种可能组合都至少出现一次 上例中 应满足八种组合 A 1 B 0 A 2 X 1 A 1 B 0 X 2 X 1 A 1 B 0 A 2 X 1 A 1 B 0 A 2 X 1 第七章软件测试 测试八种组合 可采用的四组数据 A 2 B 0 X 4覆盖 sacbed A 2 B 1 X 1 sabed A 1 B 0 X 1 sabed A 1 B 1 X 1 sabd 实际上有四条路经 这里有四种测试是一种巧合 这四组数据并没有覆盖每一条路径 如sacbd则未能走过 条件组合覆盖使最强的 满足条件组合的测试数据并不一定每条路都走到 根据图论的概念 点覆盖 如果连通图G的子图G 是连通的 且包含G的所有节点 则称G 为G的点覆盖 边覆盖 如果连通图G的子图G 是连通的 且包含G的所有边 则称G 为G的边覆盖 路径覆盖 每一条可能的路径都至少执行一次 第七章软件测试 3 循环测试循环测试也是一种白盒测试技术 主要用来检查循环构造的有效性 循环种类 单循环嵌套循环串联循环非结构化循环 第七章软件测试 单循环测试其中n是可允许通过循环的最大次数 1 跳过整个循环 2 只通过循环一次 3 通过循环一次 4 通过循环m次 m n 5 通过循环m 1 n n 1次嵌套循环测试 提出 1 从最内层的循环开始 将其他循环设为最小值 2 保持外层循环处于它的最小重复参数 即循环技术器 值 对最内曾进行单循环测试 3 进行下一层的循环测试 但仍保持所有外层处于最小值 而其他嵌套循环处于 一般 值 4 照此进行 直至全部循环测试完毕 第七章软件测试 串联循环测试若串联循环的每个循环独立 则采用上面单循环的方法 若两个循环串联 而且循环1的循环计数器是循环2的初值 则它们是非独立的 则应采用嵌套循环测试法 第七章软件测试 7 6 2控制结构测试基本路径测试方法1 流图符号下面介绍一种简单的控制流表示方法 流图 每一种结构化构成元素有一个相应的流图符号 第七章软件测试 将一个程序流程图映射到一个相应的流图 假设流程图的菱形决定框中不包含复合条件 第七章软件测试 任何过程设计表示方法都可以被翻译成流图 下图显示了一个程序设计语言 PDL 片段及其对应的流图 第七章软件测试 程序设计中遇到复合条件时 生成的流图变得更为复杂 当条件语句中用到一个或多个布尔运算符 逻辑OR AND NAND NOR 时 就出现了复合条件 注意 为语句IFaORb中的每一个a和b创建了一个独立的节点 包含条件的节点被称为判定节点 从每一个判定节点发出两条或多条边 导出测试用例基本路径测试方法可用于过程设计和源码生产 我们以PDL所描述的过程 求平均值 将被用于阐明测试用例设计方法中的各个步骤 1 以设计或代码为基础 画出相应的流图 创建流图时 要对将被映射为流图节点的PDL语句进行标号 下面我们将给出 求平均值 过程的对应的PDL语句和流图 2 确定结果流图的环型复杂性 可采用教材中介绍的任意一种算法来计算环形复杂性 V G 应该注意到 计算V G 并不一定要画出流图 计算PDL中的所有条件语句数量 过程求平均值中复合条件语句为2 然后加1即可得到环形复杂性 第七章软件测试 第七章软件测试 第七章软件测试 第七章软件测试 3 确定线性独立的路径的一个基本集 V G 的值提供了程序控制结构中线性独立的路径的数量 在过程求平均值中 我们指定六条路径 路径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 4 准备测试用例 强制执行基本集中每条路径 测试人员可选择数据以便在测试每条路径时适当设置判定节点的条件 满足上述基本集的测试用例如下 第七章软件测试 路径1测试用例 value k 有效输入 其中k ivalue i 999 其中2 i 100期望结果 基于k的正确平均值和总数路径2测试用例 value 1 999期望结果 求平均值 999 其他按初值汇总路径3测试用例 试图处理101或更大的值前100个数值应该有效期望结果 与测试用例1相同路径4测试用例 value i 有效输入 其中i 100value k 最小值 其中k i期望结果 基于k的正确平均值和总数 第七章软件测试 路径5测试用例 value i 有效输入 其中ii期望结果 基于k的正确平均值和总数路径6测试用例 value i 有效输入 其中i 100期望结果 基于k的正确平均值和总数执行每个测试用例 并和期望值比较 一旦完成所有测试用例 测试者可以确定在程序中的所有语句至少被执行一次 第七章软件测试 图矩阵图矩阵是一个正方形矩阵 其大小 即行列数 等于流图的节点数 每列和每行都对应于表识的节点 矩阵项对应于节点间的连接 边 下图显示了一个简单的流图和对应的图矩阵 其中流图的节点用数字表示 边以字母表示 矩阵中的字母项对应于节点的连接 第七章软件测试 图矩阵只是流图的表格表示 然而 对每个矩阵加入连接权值 图矩阵就可以用于在测试中评估程序的控制结构 连接权值为控制流提供了另外的信息 最简单情况下 连接权值是1 存在连接 或0 不存在连接 但是 连接权值可以赋予更有趣的属性 1 执行连接 边 的概率 2 穿越连接的处理时间 3 穿越连接时所需的内存 4 穿越连接时所需的资源 7 7黑盒测试黑盒测试着重测试软件功能 黑盒测试试图发现下述类型错误 功能不正确或遗漏了功能 界面错误 数据结构错误或外部数据库访问错误 性能错误 初始化错误和终止错误 设计黑盒测试方案应考虑下述问题 1 怎样测试功能的有效性2 哪些类型的输入可构成好测试用例3 系统是否对特定的输入值特别敏感4 怎样化定数据类的边界5 系统能够承受什么样的数据率和数据量6 数据的特定组合将对系统运行产生什么影响 第七章软件测试 7 7 1等价划分等价划分使用黑盒子设计测试方案的一种技术 穷尽的测试是不现实的 因此 只能选取少量最有代表性的输入数据 以期用较少的代价暴露出较多的程序错误 若把所有可能的输入数据划分若干个等价类 则可以合理的得出下面假定 每类中的一个典型值在测试中的作用与这类中所有其它值的作用相同 等价划分法设计测试方案首先的出从划分输入数据等价类入手 为此需要研究程序功能说明 从而确定输入数据的有效等价类和无效等价类 然后再分析出输出数据的等价类 参见教材p163页中等价划分的几条启发式规则 它可以帮助如何划分 第七章软件测试 划分等价类是一项探索性的工作过程 1 若某个输入条件规定了输入值的范围 数值为1 999 此时可划分为一个合理等价类 大于等于1 而小与等于999 和二个不合理等价类 999 2 假定某个输入条件规定了输入数据个数 如一个学生一学期内只能修课1至3门 自合理等价类 选课1 3门 不合理等价类 补选和选修超3门 第七章软件测试 3 假定某输入条件规定了一组值 而且程序可以对每个输入值分别进行处理 如出差交通工具的类型必须是火车 汽车或轮船 那末 合理等价类 火车 汽车 轮船 不合理 飞机 4 如果某输入条件规定了必须成立的条件 比如表示符的第一个字符必须是字母 合理等价类 第一个字符是字母 不合理等价类 第一个字符不是字母 5 若某等价类中的各值在程序中的处理方式不同 那么应将等价类划分为更小的等价类 第七章软件测试 2 确定测试用例根据等价类来设计用例 其过程如下 1 给每个等价类规定一个唯一编号 2 设计一个新的测试用例 使其覆盖一个 且仅一个未被覆盖过的不合理等价类 此项工作同样进行到所有的不合理等价类都被覆盖为止 这里这样做是因为某些程序 对某一输入错误的检查会屏蔽检查其他输入错误 因此 涉及不合理等价类测试用例适应改进包括一个未被覆盖的不合理等价类 第七章软件测试 3 设计一个新的测试用例 使其尽可能多地覆盖未被覆盖的合理等价类 此项工作重复进行 直到所有的合理等价类都被覆盖为止 7 7 2边界值分析边界值测试也是一种黑盒测试技术 它与等价划分测试区别 1 边界值分析不是从等价类中随便选一数据做代表 而是选一个或几个特定值 使这个等价类的每个边界都作为测试的目标 2 边界值分析不仅要考虑输入条件 还要考虑输出情况 即输出等价类 第七章软件测试 边界值分析技术并不简单 下面几条加以说明 1 若某输入条件规定了数据大小 可选正好等于边界值的数据作为合理测试用例 同时还要选择正好越过边界值的数据作为不合理的测试用例 如输入值的范围为 1 0 1 0 即可选 1 0 1 0 1 00 1 001等值作为测试数据 2 若某输入规定了数据个数 则可分别设计边界值和超过边界值的测试用例 如输入文件有1 256个纪录 可选0个 1个 256个纪录 第七章软件测试 3 对每个输出条件是用第 1 条如设计每月工资的扣除程序 最小额为0元 最大额为560 78元 这时可选0 00元 560 78元 负值和大于560 78元 这里要注意 输入值边界有时与输出值边界值并不对应 如y sin x 计算程序 所以直接应用输入边界值不一定能够得到输出边界值 同样要想超出输出边界值也不一定能办到 但分析是有益的 4 对每个输出条件使用第 2 条某情报检索系统 根据一输入的请求 要求显示几项最新报道 但不能多于4条 测试用例显示0 1 4条 还要显示第5条错误测试用例 5 若程序的输入或输出是有序集合 如顺序文件 线性表 则应把注意力放在集合的第一个和最后一个元素上 第七章软件测试 7 7 3错误推测错误推测则很大程度上靠直觉和经验进行 是列举出程序中可能有的错误和容易发生错误的特殊情况 1 输入 输出数据为零时 容易出错 2 输入 输出数目允许变化 如被检测或生成表的项数 则输入 输出数目为0或1时 表为空表或只有一项内容 容易出错 3 等价划分法和边界分析法都只考虑各个输入数据的测试效率 而没有考虑多个输入数据的组合效率 可能会遗漏了输入数据易出错的组合情况 7 8调试 也可称为纠错技术 测试的目的是发现错误 纠错 debugging 是确定错误在程序中的确切位置和性质 并改正它 而纠错的困难主要在于错误的定位 目前常见的三种方法 第七章软件测试 一 蛮干 bruteforce 它是效率最低的一种方法 有三种形式 1 主存信息转储方法 将存在计算机内的全部内容打印出来 在数以万计的数据中找错 结果 白白浪费机时 纸张 2 在程序各点设置打印语句 此方法也好不了多少 3 使用自动纠错工具纠错 它也是碰运气 无关的数据量也很大 二 消去原因 causeelimination 又分为归纳法或演绎法通过思考列出可能的原因 逐个排除最后找出问题的所在 第七章软件测试 归纳法 induction 从对个别事例的认识中 概括共同特性点 得出一般规律性 1 设置相应的数据第一步应列出所有已知信息 即程序能正确完成什麽 它能出现什麽错误 即确定错误的征兆 另外一些类似的 但不相同的测试用例 虽不直接导致这些征兆的产生 但也提供了一些有价值的线索 第七章软件测试 2 组织这些数据将数据结构化 使人们能够观察到它的模式 最重要的是搜寻矛盾 3 设置假设目的是研究线索和设置之间的关系 在线索的结构中使用可见的模式 提出一个或多个假设的错误原因 如果做不出任何假设 即意味着需要更多数据 这些数据可以通过设置和执行附加的测试用例得到 若存在集中可能性 则首先选择概率最大的一个 第七章软件测试 4 证明假设常犯的错误是跳过这一步 企图确定错误所在 这时纠错中经常发生的问题 首先检查假设的合理性 忽视这一点 将导致只能确定问题的一个征兆或一部分征兆 假设的证明是靠比较它与原来的线索和数据 并确定这个假设完全解释了存在的线索 如果比较结果不能令人满意 则说明该假设不适用 不完全或存在着错误 第七章软件测试 2 演绎法演绎法 deduction 的过程就是从一般到特殊 从一些总的推测或前提出发 运用排除和推理过程做出结论 1 列举可能的错误原因和假设把所有可能的错误原因列表 不需要完全的解释 仅仅是一些可能因素或假定 通过它们 能够组织和分析这些错误 第七章软件测试 2 使用第 1 步所列举的可能的错误原因 消去次要原因仔细分析产生这些错误原因的数据 寻找矛盾 力图排除所有无关的因素 找出主要原因 若全部原因均被排除的话 则需要附加数据 通过设计附加的测试用例来设置新的假设 如果剩下一个以上的可能原因 则首先选择概率最大的 3 进一步完善留下的假设至此 确定的原因可能是正确的 但尚不足以明确地指出该错误 所以 此适应例用可靠的线索完善该假设 是之更加具体 4 证明假设的正确性本步骤同归纳法第4步 三 回溯 backtracking 它是从发现错误征兆的位置开始 人工追溯源程序代码 直到找到错误的原因为止 但是如果源程序代码行为不断增加 回溯是可能经过的路径数目变得很大 以至实际上无法进行工作 第七章软件测试 强度测试白盒与黑盒测试技术是使得正常的程序功能和性能得到充分的评价 强度测试则是对付那些非正常的情况 强度测试是在一个非正常的数量 频率或容量资源方式下运行一个系统 例如 1 当平均速率有一种或两种时 可以设计每秒产生十个中断的特殊测试 2 输入数据的速率 可以按大小递增的顺序来决定输入功能怎样响应 3 可以运行要求大内存或其他资源的测试用例 第七章软件测试 4 在虚拟操作系统中 可以设计产生多次反复的测试用例 5 对磁盘驻留数据 可以设计产生过度搜索的测试用例 强度测试实际上是一种叫做敏感测试技术 在某些情况下 一个包含在程序有效数据边界内的非常小范围的数据变动也可能导致极端的 甚至错误的处理或使性能严重下降 强度测试主要用来发现可能导致不稳定或不正确的处理有效输入类中的数据组合 第七章软件测试 应用题 判定三角形类别的测试范例1 一 采用等价划分划分等价类并编号输入条件合理等价类不合理等价类是否为三角形a 任意两边之和b 任意两边之和小于第三边大于第三边c 任意两边之和小于第三边e 多于三个正整数d 三个正整数f 少于三个正整数g 含有负数h 含有非数字字符I 等边三角形判断三角形j 等腰三角形k 一般三角形 第七章软件测试 2 为合理等价类设计测试用例测试数据期望结果覆盖范围3 4 5有效数据a d k3 3 3有效数据a d i3 3 5有效数据a d j3 为每个不合理等价类至少设计一个测试用例测试数据期望结果覆盖范围2 4 7输入无效b2 4 6输入无效c2 4 7 8输入无效e2 4输入无效f2 3 4输入无效gA C 7输入无效h 二 采用边界值分析法 第七章软件测试 测试用例设计的范例请按右面给出的用例流程图 设计实现路径覆盖的测试用例 第七章软件测试 路径覆盖用例 a 2 b 0 x 2 覆盖路径 1 2 3 4 5 a 2 b 1 x 2 覆盖路径 1 3 4 5 a 1 b 1 x 1 覆盖路径 1 3 5 a 3 b 0 x 1 覆盖路径 1 2 3 5 问题答案 第七章软件测试 第七章软件测试 第七章软件测试 实时系统测试许多实时应用的异步性质与时间有关 测试时增加了新的和潜在的困难因素 即测试时 不仅要虑白盒 黑盒测试用例 还要考虑数据的定时和处理该数据任务 进程 间的并行性 许多情况 当系统在某种状态下 提供的测试数据会产生正确的处理 而当这种系统在不同的状态 提供同样的测试数据可能会导致错误 另外 存在于实时软件与硬件环境之间的紧密关系也会使测试发生困难 目前 实时系统的综合测试的设计方法尚处研究阶段 但一般采用以下四种策略 第七章软件测试 一 任务测试实时软件测试第一步 是对每个任务 看做是接受输入 并产生输出的单个程序 一个任务可有多个模块组成 进行单独测试 即为每个任务设计和运行黑盒与白盒测试 二 行为测试用case工具创建应用系统模型 它可以模拟实时系统行为 还可作为系统外部事件结果的检查 使用类似等价划分的技术 各种事件 如中断 控制信号 数据 可按类测试 第七章软件测试 例如 用户中断 复位计数器 照相扩印机的事件机械中断 如相纸塞满 系统中断 如调色剂温度过高 调试测试的本身的目的是尽可能多地暴露程序中的错误 进一步诊断和改正程序中的错误是调试的任务 调试是软件开发过程中最艰巨的脑力劳动 在组成程序的数以万计的元素 语句 数据结构等 中 每一个都可能是错误的根源 如何找出错误是调试过程中最关键的技术问题 第七章软件测试 第七章软件测试 第六章作业1 在项目开发时 选择程序设计语言通常考虑哪些因素 2 为了具有良好的设计风格 应注意哪些方面的问题 3 什么是注释 有那些内容 4 应掌握给程序添加注释的方法 第七章作业1 什么是黑盒测试 什么是白盒测试 2 采用黑盒测试技术设计测试用例有哪几种方法 各有什么特点 3 简要说明如何划分等价类 4 软件测试的目的是什么 软件测试的步骤是什么 5 软件测试的原则是什么 第七章软件测试 6 单元测试的内容是什么 7 黑盒测试主要发现那些类型的错误 8 有一个判断构成三角形的程序 程序的功能是输入3个正整数 a b c 作为三角形的边长 判断a b c能否构成三角形 以及所构成的形状 现在用等价划分和边界值分析法设计测试用例 并给出路径覆盖测试用例 9 对于程序中的循环部分 将采用什么方法进行测试 为什么说它是可靠和严谨的 第六章部分作业的答案1 在项目开发时 选择程序设计语言通常考虑哪些因素 答 为开发

温馨提示

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

评论

0/150

提交评论