⌨️ 第五章 从设计到测试
📄 本篇摘要

黑盒测试最怕两个极端:不测(漏)和瞎测(穷举不完)。两把科学的尺子:等价划分——同一类里的值行为几乎一样,每档挑一个代表就够了;边值分析——bug 最爱藏在边界上,专测 1、100 这些门槛的两边。

📝 关系

上一节:黑盒与白盒、覆盖率 | 下一节:Bug、调试与 BTS

一、等价划分:一类挑一个代表

输入取值范围往往巨大甚至无限,全测不可能。但同一【档】里的值,程序的处理逻辑通常相同——比如【合法年龄 1~100】:1 和 100 和 55 走的是同一条代码路径。于是把输入切成若干等价类:

每个等价类至少测一个代表,特别是无效类——新手只测合法输入,而程序炸往往炸在非法输入上。

二、边值分析: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. **为什么无效等价类反而更重要?** 答:程序崩溃多源于非法输入处理不当,合法输入反而很少出错。

相关笔记