24 面向对象测试¶
说明
本文档由 AI 生成
这一章(Chapter 24: Testing Object-Oriented Applications, OOT)非常关键,它详细讲解了**面向对象测试 (Object-Oriented Testing, OOT)**。与上一章(传统应用程序测试)不同,这一章重点探讨了如何针对面向对象(OO)分析和设计模型进行测试,以及如何处理类、继承和封装带来的独特挑战。
这一章的逻辑非常清晰:首先指出为了充分测试 OO 系统,必须在三个方面做出改变(测试定义、策略、用例设计);接着详细讲解了如何审查 OO 分析和设计模型(语义正确性、一致性);然后提出了新的 OO 测试策略(单元测试针对类,集成测试针对线程/使用/集群);最后,重点介绍了多种具体的 OO 测试方法,包括基于场景、基于故障、随机测试、划分测试以及类间测试。
以下是为你整理的详细笔记(Markdown格式),专有名词后均已附上英文对照,非常适合用来复习备考。
🐍 软件工程 Chapter 24: 面向对象应用测试 (Testing Object-Oriented Applications)¶
1. 面向对象测试的三大变化 (Changes in OOT)¶
为了充分测试面向对象系统,必须做到以下三点:
- 拓宽测试定义 (Broaden definition of testing): 将错误发现技术应用于面向对象的分析和设计模型(而不仅仅是代码)。
- 改变测试策略 (Change strategy): 单元测试和集成测试的策略必须发生显著变化。
- 调整用例设计 (Adjust test case design): 必须考虑 OO 软件的独特特征(如封装、继承、多态)。
2. 测试 OO 模型 (Testing OO Models)¶
- 模型审查的重要性 (Importance of review):
- 相同的语义结构(如类、属性、操作、消息)贯穿分析、设计和代码级别。
- 好处: 在分析阶段发现类属性定义的问题,可以避免如果等到设计或代码阶段才发现时可能引发的副作用 (Side effects)。
- 模型正确性 (Correctness):
- 语义正确性 (Semantic correctness): 基于模型对现实世界问题域 (Real world problem domain) 的符合程度来评估。
- 验证方法: 将模型展示给领域专家 (Domain experts),检查类定义和层级是否存在遗漏或歧义。
- 关系评估 (Relationship evaluation): 确定类之间的连接(实例连接)是否准确反映了现实世界对象的连接。
- 模型一致性 (Consistency):
- 检查 CRC 模型 (CRC model): 检查每个 CRC 索引卡的描述,确定委派的职责是否属于协作者 (Collaborator) 的定义。
- 反转连接 (Invert connections): 确保请求服务的协作者来自合理的来源,并确定是否需要其他类,或职责是否在类间合理分组。
- 合并职责 (Combine responsibilities): 确定那些被广泛请求的职责是否可以合并为单个职责。
3. OO 测试策略 (OO Testing Strategies)¶
- 单元测试 (Unit Testing):
- 概念变化: 最小的可测试单元不再是单个函数,而是**封装的类 (Encapsulated class)**。
- 原则: 不再孤立地测试单个操作(传统观点),而是作为类的一部分进行测试。
- 集成测试 (Integration Testing):
- 基于线程的测试 (Thread-based testing): 集成为响应系统的一个输入或事件所需的一组类。
- 基于使用的测试 (Use-based testing): 先测试使用服务器类很少(或没有)的类(称为独立类 Independent classes),然后测试依赖类 (Dependent classes)。
- 集群测试 (Cluster testing): 定义一个由协作类 (Collaborating classes) 组成的集群,设计测试用例以发现协作中的错误。
- 确认测试 (Validation Testing):
- 类连接的细节消失,转而依据需求模型中的**用例 (Use cases)** 进行测试。
- 可以使用传统的黑盒测试方法 (Conventional black-box testing methods) 来驱动确认测试。
4. OO 测试方法:Berard 方法¶
Berard 提出的测试用例应包含以下信息:
- 唯一标识 (Uniquely identified): 每个测试用例应有唯一 ID。
- 测试目的 (Purpose): 明确陈述测试目的。
- 测试步骤 (Testing steps):
- 被测试对象的指定状态 (Specified states)。
- 将被测试的消息和操作 (Messages and operations)。
- 可能发生的异常 (Exceptions)。
- 外部条件 (External conditions):测试必须存在的外部环境变化。
- 补充信息 (Supplementary information)。
5. OO 测试方法:核心分类¶
- 基于故障的测试 (Fault-based testing):
- 测试人员寻找**似是而非的故障 (Plausible faults)**(即可能导致缺陷的实现方面)。
- 设计测试用例来执行设计或代码以确定这些故障是否存在。
- 类测试与类层次结构 (Class Testing and Hierarchy):
- 继承 (Inheritance): 并不能消除对所有派生类进行彻底测试的必要性。
- 影响: 实际上,继承可能会使测试过程复杂化。
- 基于场景的测试设计 (Scenario-Based Test Design):
- 专注于用户的行为 (User's actions),而不是产品本身。
- 捕捉用户必须执行的任务(通过用例),并将其及其变体作为测试。
6. OO 测试方法:随机测试 (Random Testing)¶
- 步骤:
- 识别适用于类的操作 (Operations)。
- 定义对其使用的约束 (Constraints)。
- 识别**最小测试序列 (Minimum test sequence)**:定义类(对象)的最小生命周期历史 (Minimum life history) 的操作序列。
- 生成各种随机(但有效)的测试序列。
- 执行其他(更复杂的)类实例生命周期历史。
Abstract 7. OO 测试方法:划分测试 (Partition Testing)¶
类似于传统的等价类划分,旨在减少所需的测试用例数量。
- 基于状态的划分 (State-based partitioning):
- 根据操作改变类状态的能力对其进行分类和测试。
- 基于属性的划分 (Attribute-based partitioning):
- 根据操作所使用的属性 (Attributes) 对其进行分类和测试。
- 基于类别的划分 (Category-based partitioning):
- 根据每个操作执行的通用功能 (Generic function) 对其进行分类和测试。
8. OO 测试方法:类间测试 (Inter-Class Testing)¶
- 目标: 测试客户端类 (Client class) 向服务器类 (Server class) 发送消息的交互。
- 步骤:
- 对于每个客户端类,使用类操作列表生成一系列随机测试序列(发送消息)。
- 对于生成的每条消息,确定协作者类 (Collaborator class) 和服务器对象中的相应操作。
- 对于服务器对象中被调用的每个操作,确定它传输的下一条消息。
- 对于每条消息,确定被调用的下一级操作,并将其合并到测试序列中。
9. OO 测试方法:行为测试 (Behavior Testing)¶
- 目标: 实现**所有状态覆盖 (All state coverage)**。
- 原则: 操作序列应导致类(如 Account 类)经历所有允许的状态转换 (State transitions)。
- 示例: 账户 (Account) 的状态转换可能包括:空账户 (Empty acct) -> 开户 (Open) -> 工作中账户 (Working acct) -> 死账户 (Dead acct) 等。
💡 复习重点总结 (Key Takeaways for Exam)¶
- 核心变化 (Core Changes): 记住 OO 测试中最小的单元是**类 (Class)**,而不是函数。
- 集成测试策略 (Integration Strategies): 重点区分 基于线程 (Thread-based)、基于使用 (Use-based) 和 集群测试 (Cluster testing) 的定义。
- 测试方法 (Test Methods):
- 随机测试 (Random Testing): 关注“最小生命周期 (Minimum life history)”的概念。
- 划分测试 (Partition Testing): 区分基于状态 (State)、属性 (Attribute) 和类别 (Category) 的划分依据。
- 类间测试 (Inter-Class Testing): 这是关于客户端-服务器 (Client-Server) 消息传递的测试。
- 模型审查 (Model Review): 理解为什么在分析阶段审查模型比在代码阶段更有效(避免副作用)。
- 行为测试 (Behavior Testing): 目标是实现**所有状态覆盖 (All state coverage)**,即测试用例必须覆盖类的所有状态转换路径。
评论区
欢迎在评论区指出文档错误,为文档提供宝贵意见,或写下你的疑问