7.6.3 黑盒测试
黑盒测试不研究代码如何实现,而是站在“使用者和需求规格”的角度问:给定输入,系统应该输出什么;输入不合法时,系统应该如何拒绝;多个业务条件组合时,应该触发哪个动作。
黑盒测试的核心思想
程序内部可能很复杂,但对黑盒测试来说,它先被抽象为一个输入输出转换器。
flowchart LR
I["输入数据/操作"] --> B["被测系统<br/>内部实现不可见"]
B --> O["实际输出/状态变化"]
S["需求规格/业务规则"] --> E["预期输出"]
O --> C{"实际 = 预期 ?"}
E --> C
C -->|是| P["该用例通过"]
C -->|否| F["发现缺陷或需求歧义"]所以黑盒测试最依赖需求规格。如果需求本身模糊,黑盒用例也会模糊。
等价类划分
等价类划分的目标是减少用例数量。它假设某一类输入对程序来说具有相同处理逻辑,因此从每个等价类中挑一个代表值即可。
以成绩等级为例:
| 成绩范围 | 等价类性质 | 预期等级 | 代表值 |
|---|---|---|---|
| 90 到 100 | 有效等价类 | 优 | 95 |
| 80 到 89 | 有效等价类 | 良 | 85 |
| 70 到 79 | 有效等价类 | 中 | 75 |
| 60 到 69 | 有效等价类 | 合格 | 65 |
| 0 到 59 | 有效等价类 | 不合格 | 55 |
| 小于 0 | 无效等价类 | 拒绝输入 | -1 |
| 大于 100 | 无效等价类 | 拒绝输入 | 101 |
等价类划分的关键不是“随便选几个数”,而是先把输入空间按处理规则切开。每个有效类和无效类至少选一个代表值,才能覆盖正常和异常场景。
边界值分析
边界值分析来自一个非常朴素但有效的经验:程序最容易在边界处出错。比如把 >= 60 写成 > 60,或者把数组下标最大值处理错,都会导致边界缺陷。
对上面的成绩等级,边界点应重点测试:
| 边界 | 边界内 | 边界外或邻近值 | 目的 |
|---|---|---|---|
| 最小合法值 | 0 | -1、1 | 检查下界 |
| 不合格/合格 | 59、60 | 58、61 | 检查等级切换 |
| 合格/中 | 69、70 | 68、71 | 检查等级切换 |
| 中/良 | 79、80 | 78、81 | 检查等级切换 |
| 良/优 | 89、90 | 88、91 | 检查等级切换 |
| 最大合法值 | 100 | 99、101 | 检查上界 |
实际做题时,边界值常和等价类一起出现:等价类保证每个类别有代表,边界值专门检查类别交界处。
错误推测
错误推测依赖测试人员经验。它不是乱猜,而是根据历史缺陷、业务常识和常见编程错误推断哪里容易错。
常见推测方向包括:
- 空值、空字符串、全空格。
- 最大长度、超长输入、特殊字符。
- 0、负数、小数、极大数。
- 日期闰年、月底、跨年、时区。
- 重复提交、网络中断、权限变化。
错误推测的优势是能快速捕获经验性高发错误;缺点是依赖人的经验,不如等价类和边界值那样系统。
因果图与判定表
当多个输入条件共同决定输出动作时,仅靠等价类容易漏掉组合。因果图先表示“原因”和“结果”的逻辑关系,再转换成判定表。
例如一个优惠规则:会员可享折扣;订单金额满 100 可包邮;但黑名单用户不能下单。
| 条件/动作 | 规则1 | 规则2 | 规则3 | 规则4 |
|---|---|---|---|---|
| 是否会员 | 是 | 否 | 是 | 任意 |
| 金额是否满 100 | 是 | 是 | 否 | 任意 |
| 是否黑名单 | 否 | 否 | 否 | 是 |
| 允许下单 | 是 | 是 | 是 | 否 |
| 享受折扣 | 是 | 否 | 是 | 否 |
| 包邮 | 是 | 是 | 否 | 否 |
判定表适合“多条件、多动作、条件组合影响结果”的题干。因果图强调条件之间的逻辑关系,判定表强调把组合列出来以免遗漏。
方法对比
| 方法 | 最适合的题目特征 | 优点 | 局限 |
|---|---|---|---|
| 等价类划分 | 输入范围能分成若干类别 | 用少量代表值覆盖大范围输入 | 容易漏掉边界错误 |
| 边界值分析 | 有上下限、区间、临界点 | 对高发边界缺陷敏感 | 不能覆盖复杂条件组合 |
| 错误推测 | 有经验可借鉴、缺陷模式明显 | 快速、灵活 | 依赖经验,不够系统 |
| 因果图/判定表 | 多条件组合决定动作 | 覆盖组合关系清楚 | 条件太多时表会膨胀 |
例题
本节小结
黑盒测试依据需求规格设计用例。等价类解决“输入空间太大”,边界值解决“临界点容易错”,错误推测利用经验补漏洞,因果图和判定表处理“多个条件共同决定结果”。考试看到等价类、边界值、因果图,优先归为黑盒测试。