黑盒、白盒、灰盒测试:用饭店点菜讲明白
刚学软件测试时,黑盒、白盒、灰盒这三个词听着特别唬人。其实用一家饭店来打比方,五分钟就能讲清楚。本文用“顾客点菜、厨师做菜、服务员上菜”的故事,把三者讲透,最后附上业内行话说法,面试和写文档都能用。
一、先讲个饭店的故事
假设你开了一家饭店。饭店里主要有三种人:
- 顾客:坐在大厅,看菜单点菜,菜端上来尝味道,好不好吃他说了算。
- 厨师:在后厨,知道每道菜放多少盐、火候多大、先炒什么后放什么。
- 服务员:在大厅和后厨之间来回跑,既知道顾客点了什么,也知道后厨大概怎么出菜、菜从哪个窗口递出来。
软件测试里的黑盒、白盒、灰盒,恰好对应这三种视角。
二、黑盒测试:顾客点菜
故事
顾客坐在大厅,面前只有一本菜单。他不知道后厨用的是铁锅还是砂锅,不知道厨师先放葱还是先放姜,他只知道一件事:我点这道菜,端上来应该是我想要的味道。
- 顾客会怎么“测试”这家饭店?
- 点一道菜单上有的菜,看能不能端上来
- 点一道菜单上没有的菜,看服务员怎么回应
- 菜里说“微辣”,端上来是不是真的微辣
- 说“不要香菜”,端上来有没有香菜
- 点一份、点十份,看分量对不对
- 菜凉了、上错了、少放了盐,看饭店怎么处理
- 顾客全程不进后厨、不看菜谱、不管灶台,只关心“我点的”和“我得到的”对不对得上。
对应到软件测试
这就是黑盒测试:把系统当成一个黑盒子,不看内部代码怎么写的,只看输入什么、输出什么,是否符合需求。
- 测试依据:菜单就是需求规格说明书
- 测试视角:用户视角,功能对不对、好不好用
- 常用方法:等价类划分、边界值分析、场景法、错误推测法
- 优点:门槛低,谁都能当顾客;能发现“菜根本不是我想点的”这种需求偏差
- 缺点:顾客永远不知道后厨哪个环节出了问题,菜咸了是盐放多了还是酱油放多了,说不清
- 适用场景:系统测试、验收测试、功能测试、UI 测试
一句话:黑盒测试就是顾客点菜,只看端上来的菜对不对,不管后厨怎么炒。
三、白盒测试:厨师做菜
故事
现在换个身份,你是厨师,站在后厨里。
你面前有菜谱、有食材、有灶台。你知道这道菜要经过哪些步骤:洗菜、切菜、热油、下锅、调味、翻炒、装盘。哪一步火候大了、哪一步盐放多了、哪一步顺序错了,你心里门儿清。
厨师会怎么“测试”自己的菜?
- 菜谱上写的每一步,是不是都走到了
- “油热了下葱”这个判断,油没热的时候走没走另一条路
- 放盐这个动作,放多、放少、不放,三种情况都试了吗
- 炒菜循环翻几下,翻 0 下、1 下、很多下,分别什么结果
- 某个调料罐过期了(异常分支),有没有处理
- 有没有哪一步菜谱上写了,实际根本没做(死代码)
厨师看得见后厨的一切,能精确知道问题出在哪一步。
对应到软件测试
这就是白盒测试:打开盒子看代码,基于程序内部结构设计用例,关注语句、分支、条件、路径有没有都走到。
- 测试依据:菜谱就是源代码、流程图、控制流图
- 测试视角:开发者视角,逻辑严不严密
- 常用方法:语句覆盖、判定覆盖、条件覆盖、路径覆盖、单元测试、代码审查
- 优点:能发现内部逻辑错误、死代码,覆盖率可量化,缺陷能定位到具体哪一行
- 缺点:需要懂代码,门槛高、成本高;菜谱写得再完美,也发现不了“顾客其实想吃另一道菜”
- 适用场景:单元测试、集成测试、安全关键系统、代码审查
一句话:白盒测试就是厨师看菜谱做菜,盯着每一步、每个分支、每道火候,确保后厨流程没问题。
四、灰盒测试:服务员上菜
故事
最后是服务员。服务员很特殊:他站在大厅,但能进后厨;他知道顾客点了什么,也知道后厨大概怎么出菜、菜从哪个窗口递出来、哪张单子对应哪桌。
服务员会怎么“测试”?
- 顾客点了菜,他先看单子对不对(外部行为)
- 然后去后厨窗口看这道菜有没有开始做、做到哪一步(内部状态)
- 菜端出来,他检查是不是这桌点的、有没有少配菜(外部结果)
- 如果顾客催菜,他知道去后厨问哪个灶台(定位问题)
- 如果同时来了十桌客人,他盯着出菜顺序别乱(并发、流程)
服务员不是厨师,不会炒菜,但他知道后厨的门朝哪开,所以比顾客更快发现问题、更快找到人解决。
对应到软件测试
这就是灰盒测试:介于黑盒和白盒之间,了解部分内部结构(接口、数据库、日志、架构),但测试设计仍以外部行为为主。
- 测试依据:需求 + 部分设计文档、数据库结构、接口协议、日志
- 测试视角:介于用户和开发者之间
- 常用方法:API 接口测试、数据库测试、基于日志的测试、故障注入
- 优点:比顾客有针对性,比厨师成本低;既能验行为,又能查内部状态、快速定位
- 缺点:边界模糊,取决于你“知道多少后厨的事”;内部一改,用例可能要跟着改
- 适用场景:接口测试、集成测试、微服务/分布式系统、性能测试定位、安全测试
一句话:灰盒测试就是服务员上菜,既看顾客满不满意,也知道后厨大概怎么回事,两边信息一对,问题跑不掉。
五、三家对比,一张表看懂
| 维度 | 黑盒(顾客) | 白盒(厨师) | 灰盒(服务员) |
|---|---|---|---|
| 看不看内部 | 不进后厨 | 后厨全看 | 能进后厨看一部分 |
| 测试依据 | 菜单/需求 | 菜谱/代码 | 菜单 + 部分后厨信息 |
| 测试视角 | 顾客 | 厨师 | 服务员 |
| 主要阶段 | 系统、验收 | 单元、集成 | 接口、集成、系统 |
| 门槛 | 低 | 高 | 中 |
| 缺陷定位 | 难 | 易 | 中 |
| 成本 | 低-中 | 高 | 中 |
| 典型工具 | Selenium、Postman | JUnit、JaCoCo | Postman + 查库、看日志 |
六、完整走一遍:一道“登录菜”
还是用饭店打比方,把同一个功能用三种视角各测一遍。
需求(菜单):用户名 6-12 位,密码 8-20 位,登录成功进首页,失败提示“用户名或密码错误”,连续 5 次失败锁定账号。
顾客视角(黑盒)
顾客只看菜单和端上来的菜:
- 用户名 5 位、6 位、12 位、13 位,分别什么结果
- 密码 7 位、8 位、20 位、21 位
- 正确用户名配错密码
- 不存在的用户
- 什么都不填直接点“登录”
- 连续错 5 次,第 6 次还让不让登
- 锁定后用正确密码还能不能进
- 提示文案是不是菜单上写的那句
顾客不需要知道密码在后厨怎么加密、账号状态存在哪个柜子。
厨师视角(白盒)
厨师翻开菜谱看代码:
- 用户名长度判断 if (len >= 6 && len <= 12),真分支假分支都走一遍
- 密码长度判断的边界分支
- 失败计数 count++ 的每条路径
- if (count >= 5) lock() 这个判断,锁和不锁都测
- 密码哈希校验函数的全部分支
- 数据库查不到用户时的 null 分支
- 异常捕获那段有没有走到
- 用 JUnit 写单元测试,用 JaCoCo 看分支覆盖率
这样能发现“第 5 次失败没锁、第 6 次才锁”这种菜谱和菜单对不上的问题。
服务员视角(灰盒)
服务员知道后厨用 Redis 记失败次数、MySQL 存账号状态、有出菜日志:
- 调登录接口,看返回码和响应体(顾客视角)
- 同时查 Redis 里 login_fail:{userId} 计数有没有加一
- 查 MySQL 里 account_status 有没有变成 locked
- 查日志有没有记下失败原因
- 用接口工具同时发多个请求,看计数会不会算乱
- 知道密码用 bcrypt,顺手确认数据库里没存明文
外部行为验了,内部状态也查了,出了问题还知道去哪张桌子找人。
七、行话怎么说
面试、写文档、和外企同事沟通,直接说英文最稳妥:
- 黑盒测试:Black-Box Testing
- 白盒测试:White-Box Testing
- 灰盒测试:Gray-Box Testing(也拼 Grey-box)
业内常用别名,团队内沟通秒懂: - 黑盒:功能测试、数据驱动测试、基于需求规格说明书的测试
- 白盒:结构测试、逻辑驱动测试、透明盒测试 / 玻璃盒测试(Glass-box testing)、基于代码的测试
- 灰盒:别名少,一般直呼其名,或说“黑盒和白盒的结合”。注意灰盒是一种技术视角,不是测试阶段,只是集成测试阶段常用灰盒思路。
沟通建议:写文档、面试用英文术语;团队内用“功能测试”代黑盒、“结构测试”代白盒,大家都明白。
八、到底怎么选
- 只关心菜好不好吃、站在顾客角度 → 黑盒
- 要保证后厨每一步都规范、单元级质量 → 白盒
- 做接口/集成/分布式系统,想兼顾效率和定位 → 灰盒
真实项目里从来不是三选一:单元测试像厨师看菜谱(白盒),接口和集成像服务员跑堂(灰盒),系统测试和验收像顾客尝菜(黑盒)。按阶段和风险组合着用,才是正经测试策略。
九、一句话总结
| 类型 | 饭店版一句话 | 测试版一句话 |
|---|---|---|
| 黑盒 | 顾客点菜,只看端上来的菜对不对 | 只看输入输出,不管内部怎么实现 |
| 白盒 | 厨师做菜,盯着菜谱每一步和火候 | 打开盒子看代码,盯住分支和路径 |
| 灰盒 | 服务员上菜,两边信息一对 | 半开盒子,看接口、数据库、日志辅助测试 |
记住这家饭店,黑盒白盒灰盒就再也不会混了。

浙公网安备 33010602011771号