白盒测试,又称结构测试、逻辑驱动测试,是一种基于程序内部逻辑结构进行的测试方法。

了解程序的源代码、逻辑结构和实现细节,从而通过分析控制流、数据流等来设计测试比例,以验证程序的每个路径、语句和分支是否按预期工作。

白盒测试核心思想:站在程序内部的角度,检查代码结构的正确性与逻辑的完整性

目标

验证程序内部的逻辑是否正确

发现程序内部潜在的逻辑错误或缺陷

确保程序的所有语句至少执行一次

主要技术与类型

白盒测试的核心在于覆盖率分析。

  • 语句覆盖:程序中每条可执行语句至少执行一次
  • 判定覆盖/分支覆盖:每个判断的“真/假”分支至少执行一次
  • 条件覆盖:判断中的每个布尔表达式都取到真、假
  • 判定-条件覆盖:同时满足判定覆盖与条件覆盖
  • 条件组合覆盖:组合所有条件真/假的所有情况
  • 路径覆盖:程序中所有可能路径至少执行一次
  • 数据流覆盖:检查变量的定义、使用与失效之间的路径

测试的常用方法

控制流测试

通过分析程序的控制结构(顺序、选择、循环)建立控制流图(Control Flow Graph, CFG),设计测试用例以覆盖所有语句、分支与路径。

常用技术包括:基本路径测试(Basis Path Testing)、环路测试(Loop Testing)

控制流图关键元素:节点(表示语句或代码块)、边(表示控制流的转移(执行路径))

可通过 圈复杂度(Cyclomatic Complexity) 计算最少测试路径

V(G)=EN+2 V(G)=E-N+2

其中,E 为边数,N 为节点数。

数据流测试

侧重分析变量的定义(Definition)、引用(Use)和失效(Kill)关系,检查是否存在未定义即使用、定义后未使用等错误。

常见缺陷类型:使用未定义变量;定义但从未使用;使用后未释放资源;变量作用域混乱。

循环测试

专门针对程序中的循环结构进行测试。
基本策略包括:零次循环测试(跳过循环);一次循环测试;多次循环测试(典型次数);边界循环测试(最大次数或超过一次)。

例如:

1
for (int i = 0; i < n; i++) {...}

测试时应考虑 n=0, n=1, n=2, n=边界值等情况。

基本路径测试

由 McCabe 提出,是控制流测试的一种。
主要步骤:画出程序的控制流图;计算圈复杂度 V(G);确定独立路径集合;为每条独立路径设计测试用例。

示例:

1
2
3
4
5
if (x > 0)
x = x - 1;
else
x = x + 1;
print(x);

独立路径有两条:

  1. x > 0 的路径;

  2. x <= 0 的路径。

白盒测试的实施流程:阅读与理解源代码(掌握逻辑结构)->建立程序控制流图(CFG)->选择合适的覆盖标准(语句/分支/路径)->设计测试用例(输入集)->执行测试、记录结果->分析未覆盖的代码部分->修正缺陷与补充测试

优点

能发现隐藏的逻辑错误、未执行代码、死循环等内部缺陷;测试覆盖率高,可度量测试充分性;可评估代码质量、复杂度、可靠性;可与持续集成结合实现自动化测试

缺点

需要掌握代码实现,成本较高;不适用于大型系统的整体测试;难以检测需求层面的缺陷;当代码变更频繁时维护成本高