📄 本篇摘要
黑盒测试最怕两个极端:不测(漏)和瞎测(穷举不完)。两把科学的尺子:等价划分——同一类里的值行为几乎一样,每档挑一个代表就够了;边值分析——bug 最爱藏在边界上,专测 1、100 这些门槛的两边。
📝 关系
上一节:黑盒与白盒、覆盖率 | 下一节:Bug、调试与 BTS
一、等价划分:一类挑一个代表
输入取值范围往往巨大甚至无限,全测不可能。但同一【档】里的值,程序的处理逻辑通常相同——比如【合法年龄 1~100】:1 和 100 和 55 走的是同一条代码路径。于是把输入切成若干等价类:
- 有效等价类:1~100(测一个代表,如 55);
- 无效等价类:<1 一个类(测 0)、>100 一个类(测 101)、非数字一个类(测 "abc")。
每个等价类至少测一个代表,特别是无效类——新手只测合法输入,而程序炸往往炸在非法输入上。
二、边值分析:bug 藏在门槛上
经验规律:大量 bug 集中在边界——>= 写成 >、循环多跑一次、差一错误(off-by-one)。边界两侧的值要成对测:合法范围 1~100,就测 0、1、2、99、100、101 这一组。
教材提醒:边界不只数值有——字符串长度、列表首尾元素、日期月末、并发上限,一切【临界点】都算。
三、组合爆炸:为什么需要这两把尺
三个参数、每个 5 档取值=125 种组合;参数再多点就上万。等价划分先砍维度,边值分析再把火力集中到最高危区——用几十个用例覆盖上千种可能,这就是黑盒测试的性价比打法。
四、动手 Demo:给【合法 1~100】做一次科学体检
def valid_score(n):
"""需求:1~100 的整数合法(含两端)"""
return isinstance(n, int) and 1 <= n <= 100
# 等价划分 + 边值分析联合作业
cases = [
# (描述, 输入, 期望)
("无效类: 下越界旁", 0, False),
("边界: 下界", 1, True),
("边界旁: 下界内", 2, True),
("等价类: 中间代表", 55, True),
("边界旁: 上界内", 99, True),
("边界: 上界", 100, True),
("无效类: 上越界旁", 101, False),
("无效类: 非整数", "55", False),
("无效类: 布尔陷阱", True, False),
]
for desc, n, want in cases:
got = valid_score(n)
print(f"{desc:>10} {str(n):>5} -> {got} {'OK' if got == want else 'FAIL'}")
assert got == want, f"用例失败: {desc}"
print("全部通过")
沙箱实跑输出:
无效类: 下越界旁 0 -> False OK
边界: 下界 1 -> True OK
边界旁: 下界内 2 -> True OK
等价类: 中间代表 55 -> True OK
边界旁: 上界内 99 -> True OK
边界: 上界 100 -> True OK
无效类: 上越界旁 101 -> False OK
无效类: 非整数 55 -> False OK
无效类: 布尔陷阱 True -> False OK
全部通过
看到什么算成功:九个用例全 OK、打出全部通过。
读结果:九个用例覆盖了无限多的可能取值——等价划分负责选代表,边值分析负责卡门槛。(彩蛋:isinstance(True, int) 在 Python 里是 True,布尔会冒充 1 通过数值判断——【布尔陷阱】用例专治它。)
五、30 秒实验
把条件改成 1 <= n <= 100 时手滑写成 1 < n < 100,重跑——下界 1 和上界 100 两个边界用例立刻变红。边界用例的价值=任何差一错误都无处遁形。
六、常见误区
| 误区 | 真相 |
|---|---|
| 只测合法输入 | 无效输入才是崩溃重灾区,无效等价类必须测 |
| 中间值多测几个就安心 | bug 不在中间在边界;中间一个代表足够 |
| 用例越多越好 | 撞同一条路径的用例是重复劳动;按类选代表才是科学 |
自测三问(点击展开)
1. **等价划分的依据是什么?** 答:同一档的输入走同一条代码路径,行为几乎一致,故每档取一个代表。 2. **1~100 的边值用例组是哪六个数?** 答:0、1、2、99、100、101——门槛两侧成对出现。 3. **为什么无效等价类反而更重要?** 答:程序崩溃多源于非法输入处理不当,合法输入反而很少出错。- ☐ 5-6 学习完成
相关笔记
- 黑盒与白盒、覆盖率 —— 用例设计完还要看盖没盖全
- 条件分支 —— 边界 bug 的老巢
- ⌨️ 编程原理 · 索引 —— 全课路线图