一篇文章学会黑盒测试、白盒测试(含实操)
文章目录
前言
刚开始做测试的同学,听到黑盒测试、白盒测试是不是头都大了?是什么东西这么专业高深,让人觉得只可远观而不可亵玩焉。今天就为大家揭开黑盒测试和白盒测试的神秘面纱,让每个测试入门人员都能够把它俩理解得明明白白。
| 对比维度 | 黑盒测试 (功能测试) | 白盒测试(结构测试) |
|---|---|---|
| 视角 | 用户视角(外部功能) | 开发视角(内部代码) |
| 方法 | 输入→输出验证(等价类 / 边界值) | 代码逻辑覆盖(语句 / 分支 / 路径) |
| 工具 | Selenium(UI)、Postman(接口) | JUnit(Java)、Pytest(Python) |
| 典型场景 | 登录功能:验证用户名密码组合 | 计算函数:检查所有分支和边界条件 |
| 适用阶段 | 功能测试、验收测试(后期) | 单元测试、集成测试(前期) |
一、黑盒测试概念及方法
黑盒测试是通过软件的外部行为表现进行测试,不关心程序如何实现,只关心输入输出 。此时程序就像被放于一个看不见内容的黑盒子中。由于黑盒测试时我们无法看到程序运行逻辑,所以我们设计测试用例的依据是产品需求文档、设计文档。

黑盒测试用例设计方法:糕冷小美@的黑盒测试用例的具体设计方法(7种)已经讲得很清楚了,我就不再单独介绍了。
二、一个黑盒测试实操范例
假设你要测试这样一个登录功能,你拿到功能说明文档,用户名规则为:英文加数字,6-12位,必须英文开头。密码规则为8-20位,由大写字母、小写字母、数字和特殊字符组成,必须包含其中三样。开始设计测试用例。

2.1 等价类划分法
2.1.1 用户名等价类
| 分类 | 输入条件 | 有效等价类 | 无效等价类 |
|---|---|---|---|
| 用户名 | 英文开头,6-12 位英文数字 | user1234(8 位,英文 + 数字) | 1userewrw4(非英文开头)、user(4 位)、user123456789(13 位)、user!123(含特殊字符) |
2.1.2 密码等价类
| 分类 | 输入条件 | 有效等价类 | 无效等价类 |
|---|---|---|---|
| 密码 | 8-20 位,含三类字符(大写 / 小写 / 数字 / 特殊字符) | User163!a(9位,大写 + 小写 + 数字 + 特殊字符) | user123(仅小写 + 数字,不足三类)、USER123(仅大写 + 数字)、user12!(7 位)、user123!abcdefghijklm(21 位)、密码123abc(不支持的字符) |
2.1.3 用例等价类
| 用例编号 | 输入数据(用户名/密码/确认密码) | 预期结果 | 覆盖方法 |
|---|---|---|---|
| UC01 | user1234 / User123! / User123! | 注册成功 | 有效等价类 |
| UC02 | 1userab3224 / User123! / User123! | 用户名不符合规则(非英文开头) | 无效等价类 |
| UC03 | user / User123! / User123! | 用户名长度不足(5 位) | 无效等价类 |
| UC04 | user123 / user123 / user123 | 密码不符合规则(仅两类字符) | 无效等价类 |
2.2 边界值法
| 用例编号 | 输入数据(用户名/密码/确认密码) | 预期结果 | 覆盖边界值 |
|---|---|---|---|
| UC05 | user1 / User8-! / User8-! | 注册失败 | 用户名 = 5 位,密码=7位 |
| UC06 | zu1234 / User896! / User896! | 注册成功 | 用户名 = 6 位,密码 = 8 位 |
| UC07 | user12345 / 890!@-aew / 890!@-aew | 注册成功 | 用户名 = 7 位,密码=9位 |
| UC08 | usera123456/User@ab1234567890!1/User@ab1234567890!1 | 注册成功 | 用户名 = 11 位,密码 = 19 位 |
| UC09 | userab123456/User@ab-1234567890!1/User@ab-1234567890!1 | 注册成功 | 用户名 = 12 位,密码 = 20 位 |
| UC10 | userab1234567/User@ab-1234567890!12/User@ab-1234567890!12 | 注册失败 | 用户名 = 13 位,密码 = 21 位 |
2.3 场景法(注册流程)
| 用例编号 | 场景描述 | 输入数据(用户名/密码/确认密码) | 预期结果 |
|---|---|---|---|
| UC10 | 正常注册成功 | user1234 / User123! / User123! | 跳转至登录页面 |
| UC11 | 用户名不合法 | 1user / User123! / User123! | 提示用户名规则错误 |
| UC12 | 密码不合法 | user1234 / user123 / user123 | 提示密码规则错误 |
| UC13 | 重复注册 | user1234 / User123! / User123! | 提示 “用户名已存在” |
| UC14 | 两次密码不一致 | Myuser1234 / User123! / user123! | 提示 “两次密码不一致” |
2.4 AI大模型与黑盒测试结合
我们可以将带上功能界面图片,告知功能说明,用AI聊天工具进行用例设计哦。如果要求用例输出结构,可以补充要求AI工具按照以下结构输出测试用例:输出用例编号,场景描述,用例优先级,输入数据,操作步骤,预期结果。

悄悄告诉你:我上面的绝大部分用例都是AI生成的。
三、白盒测试概念及方法
白盒测试时关注代码结构和逻辑,此时程序就像被打开的盒子,可以被看清一切细节。白盒测试关注的是代码正确性,设计测试用例的依据是代码结构。

目前网络上有非常多的白盒测试用例设计方法的资料,有的博主把这块也讲得非常的细致了。但是我们看到条件覆盖、判定覆盖、路径覆盖等词汇还是觉得晕晕乎乎的,思考了一下,原因在于大家都没把什么是条件,什么是判定,什么是路径讲清楚就开始讲方法了。所以,接下来先为大家介绍这些基础词汇。
| 基础词汇 | 定义 | 流程图中的样子 | 代码中的样子 |
|---|---|---|---|
| 语句 | 代码中的每一行独立执行的代码 | ![]() | ![]() |
| 条件 | 布尔表达式中的每个独立布尔子项(and、or连接的子条件) | ![]() | ![]() |
| 判定 | 一个布尔表达式(整个if、while等条件语句的结果) | ![]() | ![]() |
| 路径 | 程序执行时从入口到出口的一条完整执行流程 | ![]() | - |
顾名思义,语句覆盖就是让所有语句都被执行一次;条件覆盖就是让所有条件都要取一次真假值;判定覆盖就是让所有判断都取一次真假值,路径覆盖就是让所有路径都被走一遍。
白盒测试用例设计方法:糕冷亐㔓焼的测试百科:白盒测试用例的设计(图文并茂,非常详细)已经讲得很清楚了,我就不再单独介绍了。
四、一个白盒测试实操范例(AI工具自动生成)
我们现在有一个简单的程序需要测试,代码如下:
def example_function(a, b):
if a > 0 and b > 0:
return a + b
elif a < 0 or b < 0:
return a - b
else:
return 0
你是不是以为我要画程序流程图来编写单元测试用例?no no no 。实际工作中的函数或程序比我们的示例复杂得多,如果每个函数都要画出程序流程图再来设计测试用例,是想累死开发吗。
当前各类AI大模型工具已经完全可以编写可以直接使用的单元测试用例了。目前最方便的方式是在IDE中安装编码助手插件(如:通译灵码、文心快码、MarsCode),选中函数即可一键生成单元测试用例。插件里面也可以用对话方式生成自动化测试用例,所以我为大家演示在豆包中用对话方式生成单元测试用例。
- 第一回合:给最简单的指令,发现漏了一些用例

- 第二回合:结合专业知识给指令,用例更齐全

五、总结
如今随着AI大模型工具的普及,白盒测试中的单元测试用例几乎已经可以完全用AI代替人工,黑盒测试方面也可以让AI大模型工具为我们输出测试用例设计指导,输出表格文字型的测试用例,让测试人员的工作量减轻不少。但是当前一些AI工具需要比较专业的提示词才能得到更好的结果,所以咱们测试人员了解基础原理还是非常有必要的,以上。
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐










所有评论(0)