分类
面向对象的软件测试与传统测试的比较‖
专家和学者做出了大量的努
,那就是软件中有错误,正
力。现在人们已经逐步认识到所
是这些错误导致了软件开发在成
谓的软件危机实际上仅是一种状况
本、进度和质量上的失控。
| 软件的质量不仅是体现 切相关。这时,对错误的纠 溯到软件开发的最初阶段。 别是着眼于编码以前的各开 包括在整个开发各阶段的复 试三个方面组成。 | 在程序的正确性上,它和编码以 正往往不能通过可能会诱发更多 因此,为了保证软件的质量,我 发阶段的工作。于是,软件测试 查、评估和检测。由此,广义的 | 前所做的需求分析,软件设计也密 错误的简单的修修补补,而必须追 们应该着眼于整个软件生存期,特 的概念和实施范围必须扩充,应该 软件测试实际是由确认、验证、测 |
| 在整个软件生存期,确 需求分析阶段、也会出现在 编码阶段和测试阶段。事实 的标准,而验证和测试通常 | 认、验证、测试分别有其侧重的 测试阶段;验证主要体现在设计 上,确认、验证、测试是相辅相 又会帮助完成一些确认,特别是 | 阶段。确认主要体现在计划阶段、 阶段和编码阶段;测试主要体现在 成的。确认无疑会产生验证和测试 在系统测试阶段。 |
| 传统的测试计算机软件的策略是从“ 单元测试开始,然后逐步进入集成测试, 集中在最小的可编译程序单位——子程序 测试后,它被集成在程序结构中,这时要 的错误和新单元加入所导致的副作用,最 错误。 | 小型测试”开始,逐步走向“大型测试”。即我们从 最后是有效性和系统测试。在传统应用中,单元测试 (如,模块、子例程、进程),一旦这些单元均被独立 进行一系列的回归测试以发现由于模块的接口所带来 后,系统被作为一个整体测试以保证发现在需求中的 |
| 面向对象程序的结构不再是传统的功 逐步将开发的模块搭建在一起进行测试的 的开发模式,对每个开发阶段都有不同以 测面向对象分析和设计的结果。因此,传 | 能模块结构,作为一个整体,原有集成测试所要求的 方法已成为不可能。而且,面向对象软件抛弃了传统 往的要求和结果,已经不可能用功能细化的观点来检 统的测试模型对面向对象软件已经不再适用。 |
| 1 面向对象测试模型 |
| 面向对象的开发模型突 象设计(OOD),和面向对 骤的划分,我们把面向对象 向对象编程的测试,面向对 | 破了传统的瀑布模型,将开发分 象编程(OOP)三个阶段。针对 的软件测试分为:面向对象分析 象单元测试,面向对象集成测试 | 为面向对象分析(OOA),面向对 这种开发模型,结合传统的测试步 的测试,面向对象设计的测试,面 ,面向对象系统测试。 |
| 2 面向对象分析的测试 |
| 传统的面向过程分析是一个功能分解 这种传统的功能分解分析法的着眼点在于 的抽象来对待系统的需要。而面向对象分 中的概念,与面向对象程序设计语言中的 是得到问题空间的图表的形式描述。OOA 现实抽象化。将问题空间中的实例抽象为 关系,用属性和操作表示实例的特性和行 反,行为是相对稳定的,结构是相对不稳 后面阶段类的选定和实现,类层次结构的 下方面考虑: | 的过程,是把一个系统看成可以分解的功能的集合。 一个系统需要什么样的信息处理方法和过程,以过程 析(OOA)是"把E-R图和语义网络模型,即信息造型 重要概念结合在一起而形成的分析方法",最后通常 直接映射问题空间,全面的将问题空间中实现功能的 对象,用对象的结构反映问题空间的复杂实例和复杂 为。对一个系统而言,与传统分析方法产生的结果相 定的,这更充分反映了现实的特性。OOA的结果是为 组织和实现提供平台。因此,对OOA的测试,应从以 |
| 对认定的对象的测试 |
| 对认定的结构的测试 |
| 对认定的主题的测试 |
| 对定义的属性和实例关联的测试 |
| 对定义的服务和消息关联的测试 |
| 3 面向对象设计的测试 |
| 通常的结构化的设计方 作业,这些作业是以过程实 结果是设计阶段的输入"。 ,并建立类结构或进一步构 在OOA上的另一思维方式的 OOA 的界限通常是难以严格 重要的是通过重新组合或加 要求。因此,对OOD的测试 | 法,用的"是面向作业的设计方 现系统的基础构造,把问题域的 而面向对象设计(OOD)采用"造 造成类库,实现分析结果对问题 大动干戈,而是OOA的进一步细 区分的。OOD确定类和类结构不 以适当的补充,能方便实现功能 ,应从如下三方面考虑: | 法,它把系统分解以后,提出一组 分析转化为求解域的设计,分析的 型的观点",以OOA为基础归纳出类 空间的抽象。由此可见,OOD不是 化和更高层的抽象。所以,OOD与 仅是满足当前需求分析的要求,更 的重用和扩增,以不断适应用户的 |
| 对认定的类的测试 |
| 对构造的类层次结构的测试 |
| 对类库的支持的测试 |
| 4 面向对象编程的测试 |
| 典型的面向对象程序具 变。封装是对数据的隐藏, 任意修改和读写的可能性, 重要特点,继承使得代码的 序对外呈现出强大的处理能 考虑不同类型具体执行的代 | 有继承、封装和多态的新特性, 外界只能通过被提供的操作来访 降低了传统程序中对数据非法操 重用率提高,同时也使错误传播 力,但同时却使得程序内"同一" 码和产生的行为。 | 这使得传统的测圆呗员匦胗兴?br>问或修改数据,这样降低了数据被 作的测试。继承是面向对象程序的 的概率提高。多态使得面向对象程 函数的行为复杂化,测试时不得不 |
| 面向对象程序是把功能 现设计要求的功能。因此, 目光集中在类功能的实现和 | 的实现分布在类中。能正确实现 在面向对象编程(OOP)阶段, 相应的面向对象程序风格,主要 | 功能的类,通过消息传递来协同实 忽略类功能实现的细则,将测试的 体现为以下两个方面。 |
| 数据成员是否满足数据封装的要求 |
| 类是否实现了要求的功能 |
| 5 面向对象的单元测试 |
| 传统的单元测试的对象是软件设计的 单元测试应对模块内所有重要的控制路径 多采用白盒测试技术,系统内多个模块可 | 最小单位——模块。单元测试的依据是详细设描述, 设计测试用例,以便发现模块内部的错误。单元测试 以并行地进行测试。 |
| 当考虑面向对象软件时,单元的概念 每个类和类的实例(对象)包装了属性(数 小的可测试单位是封装的类或对象,类包 同类的一部分存在,因此,单元测试的意 而是将操作作为类的一部分。 | 发生了变化。封装驱动了类和对象的定义,这意味着 据)和操纵这些数据的操作。而不是个体的模块。最 含一组不同的操作,并且某特殊操作可能作为一组不 义发生了较大变化。我们不再孤立地测试单个操作, |
| 6 面向对象的集成测试 |
| 传统的集成测试,有两 顶向下集成是构造程序结构 ,以深度优先或广度优先的 上测试是从“原子”模块( | 种方式通过集成完成的功能模块 的一种增量式方式,它从主控模 策略,逐步把各个模块集成在一 即软件结构最低层的模块)开始 | 进行测。(一)自顶向下集成:自 块开始,按照软件的控制层次结构 起。(二)自底向上集成:自底向 组装测试。 |
| 因为面向对象软件没有 ,此外,一次集成一个操作 的成分的直接和间接的交互 测试,集成对回应系统的一 归测试以保证没有产生副作 类的类(称为独立类)而开始 依赖类,被测试。这个依赖 | 层次的控制结构,传统的自顶向 到类中(传统的增量集成方法)经 ”。对OO软件的集成测试有两种 个输入或事件所需的一组类,每 用。第二种称为基于使用的测试 构造系统,在独立类测试完成后 类层次的测试序列一直持续到构 | 下和自底向上集成策略就没有意义 常是不可能的,这是由于“构成类 不同策略,第一种称为基于线程的 个线程被集成并分别测试,应用回 ,通过测试那些几乎不使用服务器 ,下一层的使用独立类的类,称为 造完整个系统。 |
| 7 面向对象的系统测试 |
| 通过单元测试和集成测试,仅能保证 ,它是否满足用户的需要。为此,对完成 尽量搭建与用户实际使用环境相同的测试 统设备部件,也应有相应的模拟手段。系 象、属性和各种服务,检测软件是否能够 体行为表现,从另一个侧面看,也是对软 | 软件开发的功能得以实现。但不能确认在实际运行时 开发的软件必须经过规范的系统测试。系统测试应该 平台,应该保证被测系统的完整性,对临时没有的系 统测试时,应该参考OOA分析的结果,对应描述的对 完全"再现"问题空间。系统测试不仅是检测软件的整 件开发设计的再确认。 |
| 面向对象测试的整体目 是一致的,但是OO测试的策 ,此外,测试的焦点从过程 | 标——以最小的工作量发现最多 略和战术有很大不同。测试的视 构件(模块)移向了类。 | 的错误——和传统软件测试的目标 角扩大到包括复审分析和设计模型 |
| 不论是传统的测试方法还是面向对象的测试方法,我们都应该遵循下列的原则: |
| 1.应当把“尽早和不断地测试”作为开发者的座右铭。 |
| 2.程序员应该避免检查 | 自己的程序,测试工作应该由独 | 立的专业的软件测试机构来完成。 |
| 3.设计测试用例时,应该考虑到合法 况下要制造极端状态和意外状态,比如网 | 的输入和不合法的输入,以及各种边界条件,特殊情 络异常中断、电源断电等情况。 |
| 4.一定要注意测试中的 | 错误集中发生现象,这和程序员 | 的编程水平和习惯有很大的关系。 |
| 5.对测试错误结果一定要有一个确认 确认,严重的错误可以召开评审会进行讨 | 的过程。一般有A测试出来的错误,一定要有一个B来 论和分析。 |
| 6.制定严格的测试计划 个高水平的测试。 | ,并把测试时间安排得尽量宽松 | ,不要希望在极短的时间内完成一 |
| 7.回归测试的关联性一 不少见。 | 定要引起充分的注意,修改一个 | 错误而引起更多错误出现的现象并 |
| 8.妥善保存一切测试过程文档,意义是不言而喻的,测试的重现性往往要靠测试文档。 |