概述
简单来说,测试对象的不同是它们最根本的区别:
- 黑盒测试:把软件当成一个不透明的“黑盒子”。测试者完全不知道、也不关心程序内部的逻辑结构和实现细节,只检查程序的功能是否按照需求规格说明书的规定正常使用。
- 白盒测试:把软件当成一个透明的“玻璃盒子”。测试者完全了解程序的内部逻辑结构、代码实现,并据此设计测试用例,对程序的逻辑路径进行测试。
下面我们从多个维度进行详细对比和解析。
一、黑盒测试
1. 核心思想
“基于规格”的测试。只关心输入与输出,即对于给定的输入,是否能得到预期的输出。它从用户的角度出发,验证软件功能是否正确。
2. 测试依据
3. 主要测试内容
- 功能正确性:功能是否实现,是否符合需求。
- 界面测试:用户界面是否友好、易用。
- 性能测试:响应时间、吞吐量、资源利用率等。
- 兼容性测试:在不同平台、浏览器、设备上的表现。
- 安全性测试:是否存在安全漏洞。
- 初始化/终止测试:软件启动和退出是否正确。
4. 常用测试方法
- 等价类划分:将输入域划分为若干等价类,从每个类中选取少数代表性数据作为测试用例。
- 边界值分析:对输入或输出的边界值进行测试,因为错误更可能发生在边界附近。
- 判定表:适用于处理多种逻辑条件组合的情况。
- 因果图:通过分析输入(因)和输出(果)的关系来设计测试用例。
- 状态迁移图:测试系统在不同状态间转换时的行为。
- 场景法:模拟用户使用软件的实际场景。
5. 优点
- 简单,无需了解代码:测试人员不需要有编程背景。
- 从用户角度出发:更贴近实际用户的使用体验。
- 测试用例设计与软件实现同步进行。
6. 缺点
- 测试覆盖率较低:无法测试程序内部的特定路径,代码中可能存在未执行的“死代码”。
- 测试存在盲目性:由于不知道内部结构,测试用例可能冗余,也可能遗漏某些关键路径。
二、白盒测试
1. 核心思想
“基于代码”的测试。测试者必须像开发者一样了解程序的内部结构,检查程序内部的逻辑结构是否合理,代码是否按照预期执行。
2. 测试依据
3. 主要测试内容
- 代码逻辑覆盖:语句、分支、条件、路径等是否都被执行到。
- 内存泄漏:检查程序中是否存在分配了内存但未释放的情况。
- 代码质量:代码风格、可读性、效率等。
- 数据流:检查变量的定义和使用是否正确。
4. 常用测试方法(覆盖标准)
- 语句覆盖:设计用例使得程序中每条可执行语句至少执行一次。这是最弱的覆盖标准。
- 判定覆盖(分支覆盖):设计用例使得程序中每个判断的取真分支和取假分支至少经历一次。
- 条件覆盖:设计用例使得程序中每个判断中的每个条件的可能取值至少满足一次。
- 判定-条件覆盖:同时满足判定覆盖和条件覆盖。
- 条件组合覆盖:设计用例使得每个判断中所有条件的各种可能组合都至少出现一次。
- 路径覆盖:设计用例覆盖程序中所有可能的执行路径。这是最强的覆盖标准,但通常难以实现。
5. 优点
- 测试充分性高:能对程序内部特定部位进行覆盖测试。
- 能发现代码深处的隐患:可以发现黑盒测试无法发现的逻辑错误、内存泄漏等问题。
6. 缺点
- 成本高,难度大:对测试人员的编程能力要求高。
- 无法验证规格的正确性:如果规格说明本身有误,白盒测试无法发现。
- 易偏离用户需求:可能过度关注代码细节,而忽略了软件的整体功能。
三、核心区别对比表
特性维度 | 黑盒测试 | 白盒测试 |
---|
测试对象 | 程序的功能、外部行为 | 程序的内部逻辑结构、代码 |
测试依据 | 需求规格说明书 | 源代码、程序结构 |
测试人员 | 测试工程师、最终用户 | 开发工程师、专业白盒测试工程师 |
测试视角 | 用户视角 | 开发者视角 |
测试粒度 | 粗,关注整体功能 | 细,关注代码语句、分支、路径 |
优点 | 从用户角度出发,简单易行 | 充分性高,能发现内部问题 |
缺点 | 覆盖率低,无法测试内部 | 成本高,无法验证规格正确性 |
比喻 | 测试一辆汽车:踩油门看是否加速,打方向盘看是否转向 | 测试一辆汽车:打开发动机盖,检查线路、火花塞、油路 |
四、灰盒测试
在实际项目中,纯粹的黑盒或白盒测试并不多见,更多的是它们的结合体——灰盒测试。
- 定义:灰盒测试是介于黑盒和白盒之间的一种测试。测试者需要了解系统的部分内部结构(如接口、架构、数据库设计等),但不需要像白盒测试那样了解所有代码细节。
- 应用场景:
- 集成测试:了解模块间的接口,测试它们之间的交互。
- 性能测试:了解系统架构,设计更有针对性的性能场景。
- 安全测试:了解系统可能存在的薄弱环节(如特定的API接口)进行攻击。
- 数据库测试:了解表结构,编写SQL语句验证数据操作的准确性。
灰盒测试结合了黑盒和白盒的优点,既关注外部表现,又利用有限的内部知识设计出更高效、更有针对性的测试用例,是实践中非常有效的方法。