携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第20天,点击查看活动详情
白盒测试
什么是白盒测试
白盒测试是一种允许测试人员检查和验证软件系统内部工作原理的方法 - 其代码,基础架构以及与外部系统的集成。白盒测试是现代持续集成/持续交付 (CI/CD) 开发管道中自动化构建流程的重要组成部分。
白盒测试通常在静态应用程序安全测试 (SAST) 的上下文中引用,这是一种自动检查源代码或二进制文件并提供有关 bug 和可能漏洞的反馈的方法。
白盒测试提供输入并检查输出,考虑代码的内部工作原理
白盒测试的优缺点
| 优点 | 缺点 | |
|---|---|---|
| 1. | 能够实现完整的代码覆盖率 | 需要付出很大的努力才能实现自动化 |
| 2. | 易于自动化 | 自动化对代码库的变化很敏感,需要昂贵的维护 |
| 3. | 减少测试人员和开发人员之间的通信开销 | 无法测试代码库中不存在的预期功能 |
| 4. | 允许持续改进代码和开发实践 | 无法从用户的角度进行测试 |
黑盒和白盒测试
白盒测试通常与黑盒测试形成对比,黑盒测试涉及从用户的角度测试应用程序,而不了解其实现:
- 白盒测试可以发现结构问题,隐藏的错误和特定组件的问题。
- 黑盒测试检查整个系统是否按预期工作。
灰盒测试
白盒测试涉及对被测系统内部工作原理的完整了解,而黑盒测试则不涉及任何知识。然而,灰盒测试是一种折衷方案——用部分内部知识来测试系统。它最常用于集成测试、端到端系统测试和渗透测试。
灰盒测试结合了开发人员和测试人员的输入,可以产生更有效的测试策略。它减少了对大量用户路径执行功能测试所需的开销,使测试人员专注于最有可能影响用户或导致缺陷的路径。
灰盒测试结合了黑盒和白盒测试的优点:
- 确保从用户的角度执行测试,就像在黑盒测试中一样。
- 利用内部知识专注于最重要的问题,并识别和解决系统的内部弱点,就像在白盒测试中一样。
在应用程序安全测试领域,灰盒测试方法称为交互式应用程序安全测试(IAST)。IAST结合了:
- SAST — 通过评估静态应用程序代码来执行白盒测试。
- 动态应用程序安全测试 (DAST) — 通过与正在运行的应用程序交互并发现用户或外部攻击者等故障和漏洞来执行黑盒测试。
白盒测试的类型
白盒测试可以采取多种形式:
- 单元测试 — 作为应用程序代码的一部分编写的测试,用于测试每个组件是否按预期工作。
- 突变测试 — 一种单元测试,通过定义测试、对代码进行小的随机更改并查看测试是否仍然通过来检查代码的健壮性和一致性。
- 集成测试 — 专门设计用于检查软件系统中内部组件之间的集成点或与外部系统集成的测试。
- 白盒渗透测试 - 道德黑客充当知识渊博的内部人员,试图根据对应用程序代码和环境的深入了解来攻击应用程序。
- 静态代码分析 — 使用预定义的模式或机器学习分析,自动识别静态代码中的漏洞或编码错误。
白盒测试关注什么?
白盒测试可以专注于发现应用程序代码的以下任何问题:
- 安全漏洞和漏洞 — 检查在对应用程序进行编码时是否应用了安全最佳实践,以及代码是否容易受到已知安全威胁和攻击。
- 损坏或结构不良的路径 — 识别冗余、中断或效率低下的条件逻辑。
- 预期输出 ― 执行函数的所有可能输入,以查看它是否始终返回预期结果。
- 循环测试 — 检查单循环、串联循环和嵌套循环的效率、条件逻辑以及局部和全局变量的正确处理。
- 数据流测试 (DFT) — 在变量及其值通过代码时对其进行跟踪,以查找未正确初始化、声明但从未使用或操作不正确的变量。
测试技术和代码覆盖率
白盒测试的主要目标之一是尽可能全面地覆盖源代码。代码覆盖率是一个指标,它显示有多少应用程序代码具有单元测试来检查其功能。
在代码覆盖率内,可以使用语句覆盖率、分支覆盖率和路径覆盖率等概念来验证单元测试套件实际执行和测试了多少应用程序的逻辑。下面将更详细地讨论这些概念。
对账单范围
语句覆盖率是一种白盒测试技术,可确保至少运行和测试代码中的所有可执行语句一次。例如,如果代码块中有多个条件,每个条件都用于特定范围的输入,则测试应执行每个输入范围,以确保实际执行所有代码行。
语句覆盖率有助于发现未使用的语句、未使用的分支、部分代码引用的缺失语句以及以前版本中遗留的死代码。
分行覆盖范围
分支覆盖率将代码映射到条件逻辑的分支中,并确保单元测试覆盖每个分支。例如,如果存在多个嵌套条件语句:
if X then..
if Y then..
A
B
else
if Z then..
C
else..
D
A、C 和 D 是条件分支,因为它们仅在满足条件时才发生。B 是无条件分支,因为它始终在 A 之后执行。在分支覆盖方法中,测试人员标识所有条件和无条件分支,并编写代码以执行尽可能多的分支。
路径覆盖
路径覆盖率与通过代码的线性独立路径有关。测试人员绘制代码的控制流图,如下面的示例所示。
用于在路径覆盖方法中设计测试的控制流程图
在此示例中,代码中有几个可能的路径:
- 1, 2
- 1, 3, 4, 5, 6, 8
- 1, 3, 4, 7, 6, 8
- 等。
在路径覆盖方法中,测试人员编写单元测试以通过程序的控制流执行尽可能多的路径。目标是识别损坏、冗余或低效的路径。