软件工程中的白盒测试

2025年5月19日 | 阅读10分钟

白盒测试是一种测试类型,它深入研究软件的底层结构、代码和架构,以在验证输入-输出功能的同时,改进其设计、可用性和安全性。由于白盒测试在测试过程中代码对测试人员是可见的,因此它也被称为透明盒测试、开放盒测试、代码驱动测试和玻璃盒测试。

White Box Testing in Software Engineering

在软件工程中,白盒测试主要关注应用程序的内部测试和内部工作机制。“WhiteBox”这个词的选择源于“看得见的盒子”的概念。WhiteBox(意为“透明盒”)指的是能够看穿程序“盒子”外部的能力。在“黑盒测试”中的“黑盒”一词,指的是由于无法观察软件内部如何运行,因此只能评估最终用户体验。

白盒测试:它是什么?

由于提供了全面的应用程序知识,包括源代码和设计文档的访问权限,测试人员可以检查和验证软件的内部操作、基础设施和集成。该技术意味着对程序的底层结构和实现细节有明确的了解,并且从内部系统的角度编写测试用例。白盒测试可以检测到其他测试技术可能遗漏的问题,因为它具有全面的可见性。白盒测试涉及检查程序并理解其代码、逻辑和结构,这与专注于在不了解其内部工作原理的情况下验证软件功能的黑盒测试形成对比。

白盒测试的主要重点是什么?

白盒测试涉及在对软件程序的内部结构和代码有全面了解的情况下对其进行评估。通过这种测试,测试人员可以根据应用程序的功能和设计来开发全面的测试用例。由于它使测试人员能够检查和验证软件系统的内部操作,包括其代码、基础设施和相互连接,因此白盒测试对于软件测试至关重要。

White Box Testing in Software Engineering

白盒测试的特点如下:

  • 全面性:它提供了全面的代码覆盖率,确保程序的所有内部组件都经过检查。
  • 自动化:通过简单地自动化测试用例,可以节省时间和金钱。
  • 优化:通过查找隐藏的缺陷和冗余,有助于代码优化。
  • 内省:它提供了对程序的深入理解,这对于维护和未来增长非常有帮助。

白盒测试方法

1. 语句覆盖

尽可能多地覆盖源代码是白盒测试的主要目标之一。代码覆盖率是一个指标,显示了验证应用程序功能的单元测试中有多少包含在其代码中。

可以确定单元测试套件实际执行和验证应用程序逻辑的程度。它使用了语句覆盖、分支覆盖和路径覆盖等概念。

2. 分支覆盖

在编程中,“分支”指的是“IF 语句”之类的内容,其中两个分支是 True 和 False。因此,我们在分支覆盖中验证每个分支至少被处理一次。如果出现“IF 语句”,将有两个测试条件

一个用于验证“true”分支,另一个用于验证“false”分支。

3. 路径覆盖

路径覆盖着眼于程序中的每个路径。这种全面的方法确保每个程序路径至少被检查一次。与分支覆盖相比,路径覆盖更有效。当测试复杂程序时,此方法很有用。

4. 判定覆盖

一种名为判定覆盖的白盒测试技术,因为它表明源代码中的每个布尔语句是真还是假。通过确保每个可能判定点的每个分支至少被覆盖一次,判定覆盖测试旨在覆盖和验证所有可访问的源代码。

当控制流语句(如 if 语句、do-while 语句或 switch case 语句)产生两个或多个可能的结果时,该点称为判定点。此覆盖范围内的表达式有时会变得复杂。因此,达到 100% 覆盖率非常困难。

5. 条件覆盖

一种用于评估和测试条件语句中变量或子表达式的测试技术,称为条件覆盖,也称为表达式覆盖。条件覆盖的目标是检查每个逻辑条件的结果。

此覆盖仅关注包含逻辑操作数(如果一个操作数的结果为 TRUE 或 FALSE,则为逻辑操作数)的表达式。条件覆盖不能保证完整的判定覆盖。

6. 多重条件覆盖

此测试方法评估每个判定的每个可能的情况组合。例如,我们有以下短语

因此,在这种情况下,测试用例将如下所示:

需要注意的是,此示例包含两个表达式 X 和 Y,导致四个测试用例。同样,对于三个条件,我们将有八个测试用例。根据多重条件覆盖的通用公式,对于每 n 个条件,将有 2n 个测试用例。

7. 有限状态机覆盖

有限状态机覆盖是最具挑战性的代码覆盖技术之一。这是因为它提高了设计的实用性。此覆盖策略需要计算访问或通过某个状态的次数。它还确定了具有有限状态的系统包含的序列数。有限状态机中的序列是指已排序的输入或输出集合。

8. 控制流测试

使用控制结构,此测试方法旨在确定程序的执行顺序。程序控制结构用于创建程序的测试用例。为了创建测试路径,测试人员会选择特定的软件段。它主要用于单元测试。程序控制图用于说明测试场景。对于每个执行路径,节点、边、判定节点和连接节点构成控制流图。

9. 数据流测试

数据流测试是一种测试方法,它使用软件产品的编程逻辑的控制流图,专注于数据变量及其值。在数据流测试(白盒测试的一个子集)中,会监控和验证每个数据变量。此测试的主要目标是查找可能导致数据变量或数据值使用和实现不当的编码错误,即数据异常,例如程序代码中已定义但随后未使用的变量。

白盒测试示例

让我们来看以下伪代码,以了解如何编写白盒测试用例:

将使用以下两个测试用例来执行上述代码中的白盒测试:白盒测试旨在验证和交叉检查所有不同的循环、分支和判定语句。

由于 Z 小于 30,因此第一个测试用例(X = 10, Y = 15)将跳过伪代码的第四行,而是输出第六行“ITS PENDING”。

在第二个测试场景中,X = 20, Y = 25,Z 变为 45,表明 Z > 30。因此,程序将终止,并显示第四行。

这些测试用例将验证真假两种情况,并确保每行代码至少被访问一次。

白盒测试类型

白盒测试可以在不同的环境和不同的目标下进行。白盒测试主要有三种形式,如下所示:

1. 单元测试:单元测试验证应用程序的每个组件或功能是否按预期工作。在开发过程中,它将验证应用程序是否满足设计规范。

有关单元测试的更多信息,请参阅以下链接:

https://tpointtech.cn/unit-testing

2. 集成测试:集成测试会检查应用程序不同组件之间的交互。在单元测试之后,以确保各个部分在单独和联合运行时都能正常工作。

有关集成测试的更多信息,请参阅以下链接:

https://tpointtech.cn/integration-testing

3. 回归测试:回归测试确保升级或修改不会影响代码的现有功能。在更改之后,它将验证程序是否仍然通过所有现有测试。

有关集成测试的更多信息,请参阅以下链接:

https://tpointtech.cn/regression-testing

如何执行白盒测试?

执行白盒测试的步骤如下:

1. 了解代码

检查应用程序的源代码是第一步也是最重要的一步。如果测试人员熟悉代码的内部结构,那么测试应用程序将更容易。除了帮助实现 100% 的测试覆盖率外,深入理解源代码还有助于识别和创建导致安全漏洞的关键测试用例。测试人员应了解产品的安全问题,因为主要目标是应用程序安全。

2. 制定和执行测试用例

第二阶段确保程序经过彻底测试。它包括基于语句/判定/条件/分支覆盖率的实际测试用例编写以及测试用例的实际执行。测试人员通过将应用程序分为语句、判定、条件和分支来创建测试用例。

  • 语句覆盖将覆盖在程序运行时至少执行一次的语句。
  • 同样,每个代码模块(语句或循环)的结果将包含在分支覆盖中。
  • 源代码中发现的每个布尔表达式的报告将包含在判定覆盖中。如果一个表达式评估为 TRUE 或 FALSE,则称为布尔表达式。
  • 此外,用于 IF/ELSE、SWITCH 等各种条件语句的变量通过条件覆盖进行测试。

灰盒、白盒和黑盒测试的比较

黑盒、白盒和灰盒测试是在 STLC(软件测试生命周期)过程中使用的三种主要测试方法。这些方法中的每一种在测试人员接近测试过程的方式以及他们对应用程序的了解程度上都有所不同。

以下是它们的简单比较,突出了重要功能:

黑盒测试白盒测试灰盒测试
测试人员不知道架构和源代码等内部操作,并关注输入和输出。测试人员完全了解架构和源代码以及内部操作。测试人员可以访问设计文档,但缺乏源代码专业知识,表明了解不完整。
受限覆盖基于需求和预期行为,不了解内部情况。完全覆盖,因为测试人员可以测试每个代码路径并可以访问源代码。中等覆盖,并侧重于可以获取部分信息的方面。
黑盒测试在 SDLC(软件开发生命周期)的后续阶段进行,即应用程序开发完成后。白盒测试可以尽早集成到 SDLC 的开发过程中。灰盒测试在某些程序组件构建完成后进行,但它比黑盒测试允许更早的分析。
在实时使用动态分析技术进行测试时,它侧重于用户行为。它使用静态分析工具(如代码分析器)检查源代码。根据已知信息,它同时使用动态和受限的静态分析方法。
它扮演最终用户的角色,专注于功能而不是内部操作。它专注于底层逻辑、结构和代码,就像开发人员一样。既是开发人员又是用户,拥有一些内部知识,专注于期望的行为。

白盒测试的好处

  1. 通过发现隐藏的缺陷进行代码优化
  2. 当内部代码结构透明时,更容易确定测试应用程序所需的输入数据类型
  3. 软件工程团队可以进行彻底的应用程序测试,因为它包括所有可能的代码路径。

白盒测试的缺点

  • 它提供了一个具有挑战性和昂贵的过程,需要经验丰富的专业人员、编程技能以及对底层代码结构的理解。
  • 当执行频繁更改时,需要新的测试脚本。
  • 如果应用程序涉及许多不同的领域,例如 Gojek Super App,那么使用白盒测试技术进行详细测试将更加困难。

白盒测试的实际应用

许多公司使用白盒测试来确保其软件达到最高质量,从而提高客户满意度。请看以下示例:

  • 谷歌广泛地在其所有服务和产品中使用了白盒测试,包括 Google Cloud Platform、Gmail 和 Search。例如,Google Search 中的白盒测试可确保搜索引擎根据复杂的排名标准有效地工作并提供准确的结果。为了确保其平台的可靠性和安全性,谷歌的测试团队会检查源代码以查找潜在漏洞、提高性能和改善用户体验。
  • 亚马逊通过白盒测试彻底测试其 Kindle 设备、AWS 云服务和电子商务平台。例如,AWS 中的白盒测试可确保云服务可靠运行、安全管理数据并有效地为全球数百万用户扩展。为了提高其服务的整体可靠性和弹性,亚马逊的测试团队会检查其平台的底层架构和代码,以查找并修复性能瓶颈、安全漏洞和兼容性问题。

总结

白盒测试是一种有用的技术,可以模拟完全了解目标系统底层工作原理的测试人员的行为。它为测试人员提供了对程序内部数据的完全访问权限。这使得能够识别尽可能多的结构性缺陷。

白盒测试可能非常困难。被评估的应用程序极大地影响了所涉及的难度。一个执行单个简单功能的微型应用程序可能只需几分钟即可完成白盒测试,但更大的编程程序则需要数天、数周甚至更长时间才能完全测试。应在软件应用程序编写完成后、开发过程中以及每次更改后进行白盒测试。


下一个主题软件工程的特点