# 测试

> 计算机科学 · CIE A-Level
> 来源: https://www.owlsprep.com/zh/study/cie-9618-u12-testing/

本模块涵盖CIE 9618第一卷的所有核心测试概念，包括不同的测试方法及其在软件开发各阶段的应用。你将学习如何对测试类型进行分类，并为任何场景选择正确的测试方法。

**先修:** [理解软件开发生命周期](https://www.owlsprep.com/zh/study/cie-9618-u12-software-development-lifecycle/)

## 学习目标

- 区分静态测试和动态测试方法
- 为软件开发的每个阶段确定正确的测试类型
- 比较黑盒测试和白盒测试方法
- 描述Alpha测试、Beta测试和用户验收测试的目的

## 静态测试 vs 动态测试

**静态测试** — 在不执行程序的情况下分析代码、设计或文档，在开发早期发现错误的测试。

*例:* 代码评审、语法检查、文档评审、走查

**动态测试** — 使用测试输入执行程序，检查运行时错误、输出正确性和整体功能的测试。

*例:* 使用样例输入运行函数以验证其输出

> **tip**
>
> 静态测试在开发早期执行成本更低、速度更快，因为它可以避免在开发后期调试复杂的运行时问题。

**例题:** 开发人员想要在运行新函数之前，检查其中的命名不一致和语法错误。他们应该使用哪种测试方法，为什么？

1. 首先，明确需求：开发人员需要在不执行代码的情况下检查代码。
2. 将需求与定义匹配：动态测试需要执行代码，因此不适合这里。
3. 静态测试定义为不执行代码的测试，因此它可以通过静态分析或代码评审检测语法错误和命名不一致，是正确方法。

## 按开发阶段划分的测试：单元测试、集成测试、系统测试

**分阶段测试** — 测试随着开发进度逐步进行，每个集成阶段使用不同的测试类型。

*例:* 单个组件使用单元测试，组件组使用集成测试，完整产品使用系统测试。

- **单元测试**：独立测试单个小型组件（例如一个函数），确认其按设计工作。
- **集成测试**：测试多个集成组件之间的交互，发现模块间数据传递的错误。
- **系统测试**：测试整个完全集成的端到端系统，确认其满足所有规定需求。

**例题:** 开发人员已经完成了酒店预订系统所有独立模块的编码。现在他们想要检查，当一个房间在房间数据库模块中被标记为已预订时，它是否会在客户预订模块中正确显示为不可用。这是什么测试类型？

1. 该测试检查两个独立已完成模块之间的交互。
2. 单元测试仅独立测试单个模块，因此这不是单元测试。系统测试测试整个完整系统，因此这不是系统测试。
3. 集成测试专门检查集成模块之间交互的错误，因此这是集成测试。

## 验收测试：Alpha测试、Beta测试和UAT

**验收测试** — 部署前的最终测试阶段，确认系统符合客户或最终用户的需求，可准备发布。

- **Alpha测试**：由内部开发团队执行，在软件发布给外部测试人员之前进行。
- **Beta测试**：由一小群外部最终用户执行，他们在真实环境中使用软件，发现内部测试遗漏的错误。
- **用户验收测试（UAT）**：由客户执行，在最终部署前确认系统符合其业务需求。

**例题:** 一家社交媒体公司在正式发布前，将其新应用的预发布版本发布给5万名志愿老用户测试并报告错误。这属于哪种验收测试？

1. 该测试由外部最终用户在正式发布前执行。
2. Alpha测试由内部人员执行，因此不是Alpha测试。UAT由客户执行以确认需求，因此不是UAT。
3. Beta测试是由外部最终用户进行的预发布测试，用于发现真实环境中的错误，因此这是Beta测试。

## 黑盒测试 vs 白盒测试

**结构化测试方法** — 根据测试人员是否有权访问系统内部源代码划分的两种测试设计方法。

- **黑盒测试**：测试人员无权访问内部源代码，仅根据外部需求设计测试来检查输入和输出，也称为功能测试。
- **白盒测试**：测试人员有权完全访问内部源代码，设计测试覆盖所有内部逻辑路径、分支和代码行，也称为结构化测试。

**例题:** 开发人员想要确保密码验证函数中的每个条件分支都被测试到，他们应该使用哪种测试方法？

1. 要测试所有条件分支，开发人员需要了解源代码的内部结构。
2. 黑盒测试不利用任何内部代码结构知识，因此无法保证所有分支都被测试到。
3. 白盒测试利用内部代码知识设计测试，覆盖所有逻辑路径和分支，因此这是正确方法。

## 常见错误

- **错误做法:** 混淆集成测试和系统测试
  - 原因: 考生通常认为任何多组件测试都是系统测试
  - 正确做法: 系统测试测试整个端到端集成系统，而集成测试仅检查小组件模块之间的交互
- **错误做法:** 认为静态测试仅指代码评审
  - 原因: 考生忘记所有不执行代码的测试都属于静态测试
  - 正确做法: 静态测试包括编译器语法检查、设计评审和文档评审，不仅仅是手动代码评审
- **错误做法:** 混淆Alpha测试和Beta测试
  - 原因: 考生经常搞反谁来执行每种预发布验收测试
  - 正确做法: 记住：Alpha = 内部（A代表内部团队），Beta = 外部（B代表公司外部）
- **错误做法:** 认为验收测试仅指Beta测试
  - 原因: 考生忘记所有部署前确认需求的最终测试都属于验收测试
  - 正确做法: 验收测试包括Alpha测试、Beta测试和客户执行的用户验收测试（UAT）

## 速查表

| 测试类型 | 核心定义 | 典型用例 |
| --- | --- | --- |
| 静态测试 | 不执行代码 | 早期代码评审、语法检查 |
| 动态测试 | 执行代码 | 检查运行时功能 |
| 单元测试 | 单个组件 | 独立测试模块 |
| 集成测试 | 模块间交互 | 检查组件间数据流 |
| 系统测试 | 整个集成系统 | 验证所有需求 |
| Alpha测试 | 内部验收 | Beta测试前发现错误 |
| Beta测试 | 外部用户验收 | 预发布真实环境测试 |
| 黑盒测试 | 无权访问源代码 | 对照规格测试输入输出 |
| 白盒测试 | 有权访问源代码 | 测试所有内部逻辑路径 |

## 下一步

测试是软件开发的核心组成部分，该知识点在CIE 9618第一卷中频繁考察，题目分值通常为3到6分。能够清晰区分测试类型并将其匹配到对应场景是拿到这类常见题目满分的关键。本主题还与其他单元密切相关，包括软件开发方法、质量保证和调试。现在建立清晰的测试知识体系，将帮助你应对软件工程中更高级的主题，并回答连接多个概念的扩展回答题。

- [软件维护](https://www.owlsprep.com/zh/study/cie-9618-u12-software-maintenance/)
- [调试](https://www.owlsprep.com/zh/study/cie-9618-u12-debugging/)
- [软件项目管理](https://www.owlsprep.com/zh/study/cie-9618-u12-software-project-management/)

---

来自 [OwlsPrep](https://www.owlsprep.com) —— A-Level / IB / AP / IGCSE 免费学习指南，依据官方考纲编写。原页面：https://www.owlsprep.com/zh/study/cie-9618-u12-testing/
