1. 课程定位:我们在哪里?(Where Are We Now?)
- 背景:在软件开发生命周期(SDLC)中,测试并不仅仅发生在编码之后,而是贯穿全程。
- 本章核心:从“黑盒”到“白盒”,从“功能”到“非功能”,全面覆盖软件质量保证的各个维度。
2. 静态黑盒测试 (Static Black-Box Testing)
核心概念: 在不执行代码的情况下,对软件的规格说明书(Specification)或需求文档进行检查。
测试对象:需求文档、设计文档、产品说明书。
核心方法:
- 审查(Review):正式的检查过程。
- 走查(Walkthrough):作者主导的讲解与模拟。
助教解释:
你可以把它理解为“找茬”。在房子盖起来之前,先看图纸有没有问题。如果在需求阶段发现逻辑矛盾(例如:要求由“红色”但在下一页写了“蓝色”),修复成本是最低的。
🎯 考试重点:
- 由谁做? 通常是需求分析师、产品经理和测试人员。
- 目的? 尽早发现“需求缺陷”,降低修复成本(这是静态测试最大的价值)。
3. 动态黑盒测试 (Dynamic Black-Box Testing)
核心概念: 在运行程序的情况下,把程序看作一个黑盒子,只关注输入和输出,不考虑内部代码实现。
3.1 核心测试方法
- 等价类划分 (Equivalence Partitioning):
- 把无限的输入数据划分为若干个“等价”的区域,从每个区域选一个代表值进行测试。
- 分类:有效等价类(合法的输入)、无效等价类(非法的输入,如输入字母到数字框)。
- 边界值分析 (Boundary Value Analysis):
- 🎯 核心原理:错误往往发生在输入范围的边界上,而不是中间。
- 例子:如果输入范围是 [1, 100],重点测试 0, 1, 2 和 99, 100, 101。
- 决策表/判定表:用于处理复杂的逻辑组合(如果A且B,则C…)。
3.2 高级方法(PPT提及)
- 情景测试 (Scenario Testing):基于用户实际使用场景的故事流。
- 漫游测试 (Exploratory/Tour Testing):测试人员凭经验和直觉在软件中“漫游”,寻找由于思维定势遗漏的Bug。
4. 白盒测试 (White-Box Testing) —— 🔴 重难点章节
核心概念: 也被称为结构测试。测试人员完全了解程序的内部结构、算法和代码逻辑,通过检查代码路径来发现错误。
4.1 静态白盒测试
- 代码审查 (Code Review):程序员之间互相检查代码规范和逻辑。
- 静态分析工具:使用工具自动扫描代码中的内存泄漏、未初始化变量等。
4.2 动态白盒测试(逻辑覆盖)
这是PPT中包含大量流程图(M1, M2分支图)的部分,是计算题的高频考点。
核心逻辑覆盖标准(由弱到强):
- 语句覆盖 (Statement Coverage):
- 定义:程序中每一行代码(每个可执行语句)至少被执行一次。
- 局限性:这是最弱的覆盖,无法发现逻辑判断中的错误(例如:如果条件是假,可能直接跳过了某行代码,导致逻辑遗漏)。
- 判定覆盖/分支覆盖 (Decision/Branch Coverage):
- 定义:程序中每个判定节点(if, while等)的真 (True) 和 假 (False) 分支都至少被执行一次。
- 助教补充:通常满足了分支覆盖,就自动满足了语句覆盖。
- 条件覆盖 (Condition Coverage):
- 定义:判定表达式中,每个原子条件(如
A > 1 && B == 0中的A>1和B==0)的真假都要取到。 - 注意:条件覆盖不一定能保证分支覆盖(因为组合起来的结果可能没覆盖全)。
- 定义:判定表达式中,每个原子条件(如
- 判定/条件覆盖 (Decision/Condition Coverage):
- 同时满足判定覆盖和条件覆盖。
- 条件组合覆盖 (Multiple Condition Coverage):
- 每个判定中,所有条件的所有可能组合都需要覆盖。这是比较强的标准。
- 路径覆盖 (Path Coverage):
- 定义:覆盖程序中所有可能的执行路径。
- 难点:如果存在循环,路径数量可能是无限的,通常难以完全实现。
🎯 考试重点公式与技巧:
- 圈复杂度 (Cyclomatic Complexity, V(G)):
- 用于衡量代码逻辑复杂度的指标,也是测试至少需要多少个用例的依据。
- 公式 1:
V(G) = E - N + 2(E是边数,N是节点数)。 - 公式 2:
V(G) = P + 1(P是判定节点的数量)。 - 复习建议:对着PPT中的流程图(M1, M2),试着数一下判定节点(菱形框),计算圈复杂度。
5. 专项测试类型 (Other Testing Types)
PPT开头和结尾词云中提到的各种非功能性测试。
- 性能测试 (Performance Testing):
- 负载测试:正常压力下表现。
- 压力测试 (Stress Testing):极限压力下(如双11并发)系统是否崩溃,以及崩溃后能否恢复。
- 安全性测试 (Security Testing):防范SQL注入、XSS攻击等,验证数据隐私。
- 易用性测试 (Usability Testing):界面是否友好,用户操作是否流畅(UI/UX)。
- 可移植性测试 (Portability Testing):软件能否在不同OS(Windows, Mac, Linux)或不同浏览器上运行。
- 互操作性/兼容性测试 (Interoperability):与其他软件或硬件的交互能力。
- 回归测试 (Regression Testing):修改代码后,重新测试原有功能,确保“修了一个Bug,没引入新Bug”。
📝 章节核心思想总结
本章的核心在于构建一个立体的测试防御体系。
- 不要等到写完代码才测试:从需求文档开始(静态黑盒),测试就已经介入。
- 黑白结合:黑盒测试关注“用户能不能用”,白盒测试关注“代码逻辑对不对”。
- 逻辑覆盖的层次:理解从语句覆盖到路径覆盖的递进关系,在考试中,如果问“最严格的覆盖”,通常指向路径覆盖或组合覆盖;如果问“最基本的覆盖”,则是语句覆盖。