已阅读5页,还剩60页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Unit4面向对象测试 OO软件的测试用例设计 类间测试用例设计 4 1预备知识 1 对象对象是现实世界中存在的一个事物 对象可以是物理的 如一张桌子 也可以是抽象的 如一个开发项目或一个计划 在面向对象开发中 对象就是模块 它是把数据结构和操作这些数据的方法紧密地结合在一起而构成的模块 4 1 1面向对象的基本概念 2 类和实例具有相同特征和行为的所有对象构成一个类 属于某个类的对象称为该类的实例 Instance 类抽象地描述了属于该类的全部对象的属性 用数据结构表示 和操作 也称为服务或方法 在C 中即成员函数 可将类看作一个抽象数据类型 AbstractDataType 简称ADT 的实现 3 继承继承是子类 也称派生类 自动共享其父类和祖先类属性和操作 即共性部分 的机制 子类在继承共性部分的基础上 还可有增加或修改自身特有的属性和操作 子类只继承一个父类的属性和操作 称为单重继承 子类若继承了多个父类的属性和操作 则称为多重继承 继承是面向对象开发方法独有的机制 继承机制的好处是 使共有的属性和操作能够共享 避免了类中的重复定义 增加了代码的可重用性 由于代码重用性高 因而缩短了代码的总长度 使程序简短 结构清晰 易于理解 对于具有继承关系的父类和多个子类的相同部分的修改 只需在父类中进行即可 4 消息两个对象之间的通信单元称为消息 它是要求接收消息的对象执行类中定义的某操作的规格说明 消息机制类似于面向过程开发中的函数调用 5 封装封装 Encapsulation 也可理解为信息隐藏 对象是封装的最基本单位 类定义将其说明 用户可见的外部接口 与实现 用户不可见的内部实现 显式地分开 其内部实现按其具体定义的作用域提供保护 封装机制具有如下优点 简化了对对象的使用 外部程序仅通过接口访问对象 而不必知道对象内部的具体实现 为软件模块的安全性提供了强有力的保障 因为对象内部数据结构是不能被外界访问的 减小了类之间的相互依赖性 使程序结构更为紧凑 清晰 提高了软件部件的重用性 且使得对软件的修改 测试 维护等工作更易于进行 6 抽象抽象有两方面的意义 尽管问题域中的事物是复杂的 但是分析人员并不需要了解和描述它们的一切 只需要分析研究其中与系统目标有关的事物及其本质性特征 通过舍弃个体事物在细节上的差异 抽取其共同特征而得到一批事物的抽象概念 7 多态性一个操作在不同的类中可有不同的实现方式 这称为多态性 Polymophism 因而属于不同类的对象 收到同一消息可以产生不同的结果 多态性增强了软件的灵活性 重用性和可维护性 继承和多态 面向对象软件测试的重要性尽管面向对象开发方法提供了一系列可使人们以更高的效率开发出高质量的软件的机制 但最终软件的质量如何 还与开发过程中技术实施的具体情况有关 与开发人员的水平有关 故需要严格测试 面向对象软件部件的重用率高 若不尽早进行严格的测试 错误的繁衍将给后期测试活动及软件维护带来极大的麻烦 继承 封装 多态等机制的使用给面向对象软件带来了新的出错可能性 使得测试的侧重点发生了较大的变化 也就是说应重点针对这些机制的使用对软件进行测试 4 1 2面向对象软件测试的重要性 分别从3个方面论述面向对象软件的特点及其对软件测试的影响 1 面向对象程序执行的动态性2 封装 继承和多态3 演化 迭代的开发模式 4 1 3面向对象软件的特点 面向对象程序执行的动态性 传统程序的执行路径是在程序开发时定义的 程序执行的过程是主动的 其程序流程可以用一个控制流图从头到尾地表示 面向对象程序中方法的执行通常不是主动的 程序的执行路径是在运行过程中动态地确定的 封装对测试的影响 封装把数据及对数据的操作封装在一起 限制了对象属性对外的透明性和外界对它的操作权限 在某种程度上避免了对数据的非法操作 有效防止了故障的扩散 但同时 封装机制也给测试数据的生成 测试路径的选取以及测试结构的分析带来了困难 继承对测试的影响 继承实现了共享父类中定义的数据和操作 同时也可定义新的特征 子类是在新的环境中存在 所以父类的正确性不能保证子类的正确性 使代码的重用率得到了提高也使故障的传播几率增加 多态对测试的影响 多态是指类中具有相似功能的不同函数用同一个名称来实现 从而可以使用相同的调用方式来调用这些具有不同功能的同名函数 传统软件测试中经常使用静态分析技术对代码进行分析 面向对象软件中 由于动态绑定和多态性的存在所带来的不确定性 给测试覆盖率的满足增大了难度 4 2扩大测试的视角 面向对象的开发模型突破了传统的瀑布模型 将开发分为面向对象分析 OOA 面向对象设计 OOD 和面向对象编程 OOP 三个阶段 分析阶段产生整个问题空间的抽象描述 在此基础上 进一步归纳出适用于面向对象编程语言的类和类结构 最后形成代码 OO测试的视角不同层次的模型有着紧密的关联意识到上层模型的错误将带给下层模型错误和无用的工作所有的面向对象的模型都应该被测试 面向对象软件测试模型 OOATest 1 OOA将问题空间中的实例抽象为对象 用对象的结构反映问题空间的复杂实例和复杂关系 用属性和操作表示实例的特性和行为 对认定的对象的测试对认定的结构的测试对定义的属性和实例关联的测试对定义的服务和消息关联的测试 OOATest 2 对认定对象的测试认定的对象是否全面 认定的对象是否具有多个属性 对认定为同一对象的实例是否有共同的 区别于其他实例的共同属性 对认定为同一对象的实例是否提供或需要相同的服务 认定的对象的名称应该尽量准确 适用 OOATest 3 对认定结构的测试对于结构中的一种对象 尤其是处于高层的对象 是否能派生出下一层对象 对于结构中的一种对象 尤其是处于同一低层的对象 是否能抽象出在现实中有意义的更一般的上层对象 对所有认定的对象 是否能在问题空间内向上层抽象出在现实中有意义的对象高层的对象的特性是否完全体现下层的共性低层的对象是否有高层特性基础上的特殊性 OOATest 4 对定义的属性和实例关联的测试定义的属性是否对相应的对象和分类结构的每个现实实例都适用 定义的属性在现实世界是否与这种实例关系密切 定义的属性在问题空间是否与这种实例关系密切 定义的属性是否能够不依赖于其他属性被独立理解 定义的属性在分类结构中的位置是否恰当 低层对象的共有属性是否在上层对象属性体现 在问题空间中每个对象的属性是否定义完整 定义的实例关联是否符合现实 在问题空间中实例关联是否定义完整 特别需要注意1 多和多 多的实例关联 OOATest 5 对定义的服务和消息关联的测试对象和结构在问题空间的不同状态是否定义了相应的服务 对象或结构所需要的服务是否都定义了相应的消息关联 定义的消息关联所指引的服务提供是否正确 沿着消息关联执行的线程是否合理 是否符合现实过程 定义的服务是否重复 是否定义了能够得到的服务 OODTest 1 OOD是OOA的进一步细化和更高层的抽象 OOD确定类和类结构不仅是满足当前需求分析的要求 更重要的是通过重新组合或加以适当的补充 能方便实现功能的重用和扩增 以不断适应用户的要求 因此 对OOD的测试 从如下三方面考虑 对认定的类的测试 对构造的类层次结构的测试 对类库的支持的测试 OODTest 2 对认定类的测试是否含盖了OOA中所有认定的对象 是否能体现OOA中定义的属性 是否能实现OOA中定义的服务 是否对应着一个含义明确的数据抽象 是否尽可能少的依赖其他类 类中的方法 C 类的成员函数 是否单用途 OODTest 3 对构造的类层次结构的测试类层次结构是否含盖了所有定义的类 是否能体现OOA中所定义的实例关联 是否能实现OOA中所定义的消息关联 子类是否具有父类没有的新特性 子类间的共同特性是否完全在父类中得以体现 OODTest 4 对类库支持的测试一组子类中关于某种含义相同或基本相同的操作 是否有相同的接口 包括名字和参数表 类中方法 C 类的成员函数 功能是否较单纯 相应的代码行是否较少 类的层次结构是否是深度大 宽度小 OOPTest 1 典型的面向对象程序具有继承 封装和多态的新特性 这使得传统的测试策略必须有所改变 在面向对象编程 OOP 阶段 将忽略类功能实现的细则 将测试的目光集中在类功能的实现和相应的面向对象程序风格 主要体现为以下两个方面 数据成员是否满足数据封装的要求 类是否实现了要求的功能 OOPTest 2 数据成员是否满足数据封装的要求检查数据成员是否满足数据封装的要求 基本原则是数据成员是否被外界 数据成员所属的类或子类以外的调用 直接调用 更直观的说 当改变数据成员的结构时 是否影响了类的对外接口 是否会导致相应外界必须改动 值得注意 有时强制的类型转换会破坏数据的封装特性 OOPTest 3 类是否实现了要求的功能在测试类的功能实现时 应该首先保证类成员函数的正确性 需要着重声明 测试类的功能 不能仅满足于代码能无错运行或被测试类能提供的功能无错 应该以所做的OOD结果为依据 检测类提供的功能是否满足设计的要求 是否有缺陷 必要时 还应该参照OOA的结果 以之为最终标准 在OO环境中的单元测试单元测试的意义发生了较大变化最小的可测试单位是封装的类或对象OO类的测试是由封装在类中的操作和类的状态行为所驱动的 4 3面向对象的测试策略 输入数据输出结果传统单元测试模型输入数据输出结果初始状态结束状态类测试模型 在OO环境中的集成测试对于面向对象程序 相互调用的功能是散布在程序的不同类中 类通过消息相互作用申请和提供服务 类的行为与它的状态密切相关 状态不仅仅是体现在类数据成员的值 也许还包括其他类中的状态信息 OO软件的集成测试有两种不同策略基于线程的测试 thread basedtesting 基于使用的测试 use basedtesting 1 基于线程的测试 由系统的一个输入事件作为激励 对其触发的一组类进行测试 执行相应的操作 消息处理路径 最后终止于某一输出事件 应用回归测试对已测试过的类集再重新执行一次 以保证加入新类时不会产生意外的结果 2 基于使用的测试 首先通过测试不使用或很少使用其他类服务的类 即独立类 是系统中已经测试正确的某类 来开始构造系统 在独立类测试完成后 下一层继承独立类的类 称为依赖类 被测试 这个依赖类层次的测试序列一直循环执行到构造完整个系统 面向对象的集成测试可以分成两步进行 先进行静态测试 再进行动态测试 静态测试主要针对程序的结构进行 检测程序结构是否符合设计要求 静态测试主要针对程序的结构进行 检测程序结构是否符合设计要求 现在流行的一些测试软件都能提供一种称为 可逆性工程 的功能 即通过原程序得到类关系图和函数功能调用关系图 将 可逆性工程 得到的结果与OOD的结果相比较 检测程序结构和实现上是否有缺陷 动态测试设计测试用例时 需要功能调用结构图 类关系图或者实体关系图为参考 测试所要达到的覆盖标准可以是 达到类所有的服务要求或服务提供的一定覆盖率 依据类间传递的消息 达到对所有执行线程的一定覆盖率 达到类的所有状态的一定覆盖率等程序代码执行的覆盖率 在OO环境中的有效性测试和传统有效性一样 OO软件的有效性集中在用户可见的动作和用户可识别的系统输出使用分析模型中的用例测试用例可以从对象 行为模型和作为OOA的一部分的事件流图中导出 4 5OO软件的测试用例设计 OO测试用例设计的整体方法每个测试用例应该被唯一标识 并且和将被测试的类显式地相关联应该陈述测试的目的对每个测试应该开发一组测试步骤 应该包含 将被测试的对象的一组特定状态 将作为测试的结果使用的一组消息和操作 当测试对象时可能产生的一组例外一组外部条件 即 为了适当地进行测试而必须存在的软件的外部环境的变化 辅助理解或实现测试的补充信息 OO测试用例设计的含义 OO类是测试用例设计的目标封装是OO的本质设计概念 但是它可能会成为测试的小障碍继承也造成了对测试用例设计者的挑战 在面向对象的程序中 由于继承的作用 一个函数可能被封装在多个类中 子类中还可以对继承的特征进行重定义 若一个类得到了充分的测试 当其被子类继承后 继承的方法在子类的环境中的行为特征需要重新测试 封装和继承并未简化测试问题 反而使测试更加复杂 传统测试用例设计方法的可用性 传统的白盒测试方法可用于类的测试基本路径循环测试数据流技术黑盒测试方法对OO测试同样适用 OO编程对测试的影响 面向对象技术所独有的封装 继承 多态等新特点给测试带来一系列新的问题 增加了测试的难度 与传统的面向过程的程序设计相比 面向对象程序设计产生错误的可能性增大 或者使得传统软件测试中的重点不再那么突出 使原来测试经验和实践证明的次要方面成为了主要问题 例如 函数y Function x 如果该函数写在传统的面向过程的程序中 通常考虑的是函数Function 本身的行为特点 但若写在面向对象的程序中 就不得不同时考虑基类函数Base Function 的行为和继承类函数Derived Function 的行为 测试用例和类的层次 继承特性和多态特性 使子类继承或重载的父类成员函数出现了传统测试中未遇见的问题 这里要考虑如下两个问题 1 继承的成员函数是否都不需要测试 2 对父类的测试是否能照搬到子类 1 继承的成员函数是否都不需要测试 对父类中已经测试过的成员函数 以下两种情况需要在子类中重新测试 a 继承的成员函数在子类中做了改动 b 成员函数调用了改动过的成员函数的部分 例 假设存在父类Base有Inherited 和Redefined 这两个成员函数 继承父类Base的子类Derived只对Redefined 做了改动 那么 Derived Redefined 就需要重新测试 对于Derived Inherited 若它包含了调用Redefined 的语句 比如 x x Redefined 就需要重新测试 否则就不需要 2 对父类的测试是否能照搬到子类 引用前面的假设 成员函数Base Redefined 和Derived Redefined 已经是不同的 那么 按理应该要对Derived Redefined 重新测试分析 设计测试用例 但是由于面向对象的继承使得两个函数相似 故只需要在对Base Redefined 的测试要求和测试用例上添加对Derived Redefined 新的测试要求和增补相应测试用例 例Base Redefined 含有如下语句 If value 0 message less elseif value 0 message equal elsemessage more 在Derived Redefined 中定义为 If value 0 message less elseif value 0 message Itisequal else message more if value 88 message luck 在原有对父类Base的测试上 对Derived Redefined 的测试只需作如下改动 将value 0的测试结果期望改动 增加value 88的测试 基于场景的测试设计 基于故障的测试忽略了两种主要的错误类型 不正确的需求说明子系统间的交互错误基于场景的测试关心用户做什么而不是产品做什么场景揭示了交互的错误基于场景的测试往往在单个测试中处理多个子系统 4 6测试类的方法 随机测试划分测试基于故障的测试 随机测试 下面通过银行应用系统的例子 简要地说明这种测试方法 该系统的account 账户 类有下列操作 open 打开 setup 建立 deposit 存款 withdraw 取款 balance 余额 summarize 清单 creditLimit 透支限额 和close 关闭 一个account类实例的最小行为历史包括下列操作 open setup deposit withdraw close 序列中可能发生许多其他行为 open setup deposit deposit withdrew balance summarize creditLimit n withdraw close 以上序列可以随机地产生一系列不同的操作序列 例如 r1 open setup deposit deposit balance summarize withdraw close r2 open setup deposit withdraw deposit balance creditLimit withdraw close 1 基于状态的划分 这种方法根据类操作改变类状态的能力来划分类操作 让我们再一次考虑account类 状态操作包括deposit和withdraw 而非状态操作有balance summarize和creditLimit 设计测试用例 以分别测试改变状态的操作和不改变状态的操作 划分测试 例如 用这种方法可以设计出如下的测试用例 p1 setup open deposit deposit withdraw withdraw close p2 open setup deposit summarize creditLimit withdraw close 测试用例 P1改变状态 而测试用例 P2测
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 昆山市2025招聘进村(社区)工作人员易考易错模拟试题(共500题)试卷后附参考答案
- 徐州市城乡建设局中心2025年下半年招考2名工作人员易考易错模拟试题(共500题)试卷后附参考答案
- 兄弟之间抚养协议书
- ktv合作协议合同
- 广东深圳市龙岗区信访局下属事业单位面向区内选调职员易考易错模拟试题(共500题)试卷后附参考答案
- 村民违法违规协议书
- 村居路灯建设协议书
- 内审业务服务协议书
- 山东公路技师学院2025年下半年教师招考易考易错模拟试题(共500题)试卷后附参考答案
- 公司注销保密协议书
- 26.1.2 反比例函数的图象和性质(第1课时 图象和性质)(教学设计)数学人教版九年级下册
- 浙江省杭州市滨和中学2024-2025学年九年级上学期期中教学质量检测英语试题(含答案)
- 82-2式手榴弹教学课件
- 安徽省合肥八中2026届高一化学第一学期期中质量检测试题含解析
- 2025年国家义务教育质量监测小学德育模拟测评估考试题库及答案
- 2026年齐齐哈尔高等师范专科学校单招职业适应性考试题库附答案
- 学习贯彻全国青联学联贺信精神
- 2026年洛阳职业技术学院单招职业技能测试必刷测试卷及答案1套
- 北京市朝阳区2025-2026学年高三上学期11月期中考试数学试卷
- 水箱清洗应急预案
- 高职大一英语期末考试题库及答案
评论
0/150
提交评论