黑盒测试和白盒测试
黑盒测试和白盒测试
一.概念
黑盒测试和白盒测试是软件测试中两种最基础、最核心的测试方法,它们从不同的视角出发,关注系统的不同层面。
1.区分:
- 黑盒测试:不关心内部代码结构,只关注输入输出是否符合预期。
- 白盒测试:关注内部逻辑结构,需要看懂代码,测试路径、分支、条件等是否被正确执行。
2.黑盒测试(Black-box Testing)
项目 | 内容 |
---|---|
视角 | 用户视角 |
是否需要代码 | 不需要 |
关注重点 | 功能是否正确、界面是否友好、性能是否达标 |
常用方法 | 等价类划分、边界值分析、因果图、决策表、错误推测 |
优点 | 不依赖代码实现,适合需求验证,测试人员无需编程能力 |
缺点 | 无法发现隐藏的逻辑错误,覆盖率低 |
举例:测试一个登录功能,输入用户名和密码,看是否能成功登录,不会去看代码怎么验证密码。
3.白盒测试(White-box Testing)
项目 | 内容 |
---|---|
视角 | 开发者视角 |
是否需要代码 | 需要 |
关注重点 | 代码逻辑、分支覆盖、循环、路径、条件判断等 |
常用方法 | 语句覆盖、分支覆盖、路径覆盖、条件覆盖、MC/DC |
优点 | 能发现深层逻辑错误,覆盖率高 |
缺点 | 需要编程能力,测试成本高,无法发现缺失的功能 |
举例:检查一个排序函数,是否对所有边界情况(空数组、重复元素、负数)都处理正确,甚至要看是否每条语句都执行过。
4.总结:
黑盒测试看“功能对不对”,白盒测试看“代码有没有错”。
5.拓展:灰盒测试(Gray-box Testing)
结合两者优点,部分了解内部结构,比如通过数据库日志、接口文档等辅助测试,常用于集成测试阶段。
二.具体测试方法
1.速查表
类型 | 方法 | 一句话记忆 | 典型输出物 |
---|---|---|---|
黑盒 | 等价类划分 | 把无限输入切成有限“代表” | 等价类表 |
黑盒 | 边界值分析 | Bug 爱躲在边界上 | 边界值表 |
黑盒 | 判定表(决策表) | 多条件组合别漏项 | 判定表 |
黑盒 | 因果图 + 转换 | 把“条件”画成图再转判定表 | 因果图 + 判定表 |
黑盒 | 状态迁移 | 点按钮会跳状态,测跳错没 | 状态图 + 迁移表 |
黑盒 | 错误推测 | 靠经验猜“最常出错” | 风险清单 |
白盒 | 语句覆盖 | 每一行代码都跑到 | 覆盖报告 ≥ 90% |
白盒 | 分支覆盖 | 每个 if/else 都取真取假 | 覆盖报告 100% |
白盒 | 条件覆盖 | 每个布尔子表达式都真/假 | 条件覆盖表 |
白盒 | 路径覆盖 | 所有独立路径跑一次 | 路径树 |
白盒 | MC/DC | 民航/医疗安全底线 | MC/DC 矩阵 |
2.黑盒六大具体方法
1.1 等价类划分(Equivalence Partitioning)
步骤:
① 找输入域 → ② 分有效/无效类 → ③ 每类抽 1 个代表 → ④ 写用例
模板:
输入项 | 有效等价类 | 无效等价类 | 代表值 | 期望结果 |
---|---|---|---|---|
年龄 | 0–120 | <0, >120, 小数,字母 | -1, 130, 1.5, abc | 报错 |
示例:注册表单年龄字段,用 3 个用例即可覆盖 4 个无效类。 |
1.2 边界值分析(Boundary Value Analysis)
步骤:
① 找边界 → ② 取“上点、离点、内点” → ③ 每点 1 条用例
模板:
边界 | 上点 | 离点 | 内点 |
---|---|---|---|
1–100 | 1, 100 | 0, 101 | 50 |
示例:转账金额 1–100 万,必测 0.99、1、100、100.01 四条。 |
1.3 判定表(Decision Table)
步骤:
① 列出所有条件桩 → ② 列出动作桩 → ③ 穷举组合 → ④ 合并相似列
模板:
条件 | R1 | R2 | … |
---|---|---|---|
会员? | Y | Y | N |
满100? | Y | N | – |
动作 | 免运费 | 减10 | 无优惠 |
示例:电商下单优惠规则,10 条规则 64 列,合并后剩 8 列,写 8 条用例即可。 |
1.4 因果图 + 转换
步骤:
① 需求→因果图(结点=条件/结果,边=与或非) → ② 按图转判定表 → ③ 生成用例
工具:draw.io 画因果图,Excel 转表。
示例:文件上传成功=格式正确∧大小<10M∧登录,画 3 条件 1 结果,转表后 8 列。
1.5 状态迁移(State Transition)
步骤:
① 画状态图(圆=状态,箭=事件) → ② 列迁移表 → ③ 每条迁移 1 用例
模板:
当前状态 | 事件 | 新状态 | 期望 |
---|---|---|---|
登录页 | 正确密码 | 首页 | 进入首页 |
登录页 | 3 次错误 | 锁定页 | 账号锁定 |
示例:ATM 机“空闲→插卡→输入密码→主菜单→取款→退卡→空闲” 全路径 7 条用例。 |
1.6 错误推测(Error Guessing)
步骤:
① 脑暴/历史缺陷库 → ② 列风险清单 → ③ 每条风险 1 用例
清单示例:
- SQL 注入:输入 'or 1=1–
- 越权:把 URL 中 id=1001 改 1002
- 并发:5 个线程同时减库存
经验:维护“Top 10 错误”checklist,每次回归跑一遍。
3.白盒五大具体方法
(以下均用一段 Java 示例讲解,再给出度量公式)
代码示例:
public int foo(int a, int b){
1 int x=0;
2 if (a>0 && b<10)
3 x=a+b;
4 else
5 x=a-b;
6 return x;
}
1.1 语句覆盖(Statement Coverage)
目标:第 1–6 行全部执行一次。
用例:
- TC1: a=5,b=5 → 路径 1-2-3-6 (覆盖 3 行)
- TC2: a=0,b=11 → 路径 1-2-4-5-6 (覆盖剩余行)
度量:已执行语句 / 总语句 = 6/6 = 100%。
1.2 分支覆盖(Branch/Decision Coverage)
目标:每个 if 出口(True/False)至少一次。
用例同上已满足:
- True 分支:TC1
- False 分支:TC2
度量:2/2 = 100%。
1.3 条件覆盖(Condition Coverage)
目标:每个布尔子表达式取真/假。
子条件:A=a>0,B=b<10
用例:
- TC1: a=5,b=5 → A=T, B=T
- TC2: a=0,b=11 → A=F, B=F
仍缺 A=T/B=F 和 A=F/B=T,需再补 2 条: - TC3: a=5,b=11 → A=T,B=F
- TC4: a=0,b=5 → A=F,B=T
度量:4/4 = 100%。
1.4 路径覆盖(Path Coverage)
目标:所有独立路径。
路径数:2(因单 if),用例 TC1+TC2 已 100%。
若出现嵌套 if,路径呈 2^n 增长,需用 McCabe 基路径法剪枝。
1.5 MC/DC(Modified Condition/Decision Coverage)
民航 DO-178C 要求:
① 每个条件都曾独立影响决策结果;
② 分支覆盖 100%。
上例:
用例 | a>0 | b<10 | 决策 | 说明 |
---|---|---|---|---|
TC1 | T | T | T | 基准 |
TC3 | T | F | F | b 变化导致决策变 |
TC4 | F | T | F | a 变化导致决策变 |
3 条即可满足 MC/DC,比全条件覆盖更精简。 |
4.落地工具推荐
- 黑盒:Xmind(画因果图/状态图)、Excel 模板、禅道/ TestLink 管理用例
- 白盒:
– Java: JaCoCo(语句/分支/条件/MC/DC 报告)
– C/C++: gcov + lcov
– Python: coverage.py + pytest-cov
– IDE 插件:IntelliJ Coverage、VS Code Coverage Gutters