软件测试(4) 白盒测试
1. 白盒测试定义
白盒测试(White Box Testing) 又称为结构测试或逻辑驱动测试,是一种基于程序内部逻辑结构的测试方法。
-
测试人员需要了解程序代码结构和实现逻辑;
-
关注程序的控制流、数据流、判断逻辑、分支结构等;
-
目的:验证程序内部的执行路径是否按预期工作,代码是否覆盖全面。
2. 静态白盒测试方法(不执行程序)
2.1 代码检查法
-
通过人工或工具对源代码逐行检查;
-
发现语法错误、规范违背、潜在缺陷;
-
常见方式:走查、审查、桌面检查等。
2.2 静态结构分析法
-
使用工具分析代码结构,如函数调用图、变量依赖关系;
-
检查模块之间的耦合性、圈复杂度等;
-
工具:SonarQube、Understand 等。
2.3 静态质量度量法
-
对代码的复杂度、重复率、行数、注释比例等进行量化分析;
-
典型度量指标包括:
-
圈复杂度(Cyclomatic Complexity)
-
模块间耦合度
-
代码注释率
-
3. 动态白盒测试方法(需执行程序)
3.1 逻辑覆盖测试法(Logic Coverage)
覆盖类型 | 说明 |
---|---|
语句覆盖(Statement) | 每条语句至少执行一次 |
判定覆盖(Decision) | 每个条件判断结构(如if)至少执行为 true 和 false 两次 |
条件覆盖(Condition) | 每个单独的条件(例如 if(a > 0 && b < 5) 中的 a > 0 和 b < 5)分别为真/假 |
判定-条件覆盖 | 同时满足判定覆盖和条件覆盖 |
条件组合覆盖 | 所有条件变量可能组合都被测试 |
路径覆盖(Path) | 程序中所有可能的执行路径都覆盖 |
3.2 基本路径测试法(McCabe 方法)
用于度量和测试程序的复杂性,确保所有独立路径都被测试。
步骤:
-
画出控制流图(CFG):节点表示语句块,边表示控制流。
-
计算环形复杂度:
-
公式:
V(G) = E - N + 2
其中E
是边数,N
是节点数,V(G)
是圈复杂度。 -
圈复杂度 = 独立路径数量(每条路径至少经过一次)
-
-
找出独立路径集合:
每个独立路径增加了程序控制结构的新分支。
4. 其他白盒测试方法
4.1 域测试(Domain Testing)
-
将输入域分为若干子域,测试每个子域的代表值;
-
用于处理输入条件限制较复杂的情况,如不等式、条件组合。
4.2 符号测试(Symbolic Testing)
-
用符号代替具体值来分析程序行为;
-
适用于验证算法或逻辑正确性(类似形式化推理)。
4.3 Z路径测试
-
基于控制流图划分区域(Z区域),确定每个区域路径;
-
提高路径覆盖率,适合复杂条件控制的程序。
4.4 程序变异(Mutation Testing)
-
有意修改程序代码制造“变异体”(如把
==
改成!=
); -
若测试用例未能检测出错误,说明测试用例不够有效;
-
用于评估测试用例集的缺陷检测能力。
5.小结对比表
方法 | 类型 | 是否执行代码 | 特点/用途 |
---|---|---|---|
代码检查法 | 静态 | 否 | 人工或工具检查代码语法规范 |
静态结构分析法 | 静态 | 否 | 分析结构复杂度,模块依赖关系 |
质量度量法 | 静态 | 否 | 用于评估代码结构质量、复杂性 |
逻辑覆盖测试 | 动态 | 是 | 覆盖不同逻辑路径,常用六种覆盖标准 |
基本路径测试法 | 动态 | 是 | 通过控制流图和圈复杂度找到所有独立路径 |
域测试 | 动态/符号 | 是/否 | 测试输入范围边界、约束 |
符号测试 | 符号分析 | 否 | 静态推理验证逻辑正确性 |
Z路径测试 | 动态 | 是 | 关注Z区域路径组合 |
程序变异测试 | 动态 | 是 | 通过人为插入错误检测测试用例有效性 |