【软件工程】软件测试:白盒测试(逻辑覆盖 / 基本路径)
考点频率:★★★★★(选择题必考,下午案例题也常出现)
难度:⭐⭐⭐⭐
建议:重点掌握六种逻辑覆盖的强弱顺序与各自定义,以及基本路径测试中控制流图的绘制与环形复杂度计算
1️⃣ 什么是白盒测试?
白盒测试,又称结构测试或透明盒测试,是把程序当成一个透明的盒子,基于程序内部的逻辑结构和代码路径来设计测试用例。与黑盒测试关注“做什么”不同,白盒测试关注“怎么做”——盯着代码本身,检查分支、循环、条件判断有没有被跑通。
核心思想:程序执行就像在由各种判断(if/else、switch、循环)构成的迷宫中“走路”。白盒测试的目标就是系统地覆盖这些路径,尽可能多地发现代码中的缺陷。
适用阶段:白盒测试主要用于单元测试阶段,开发人员自己测自己写的代码。
软考中白盒测试的高频考点就两个:逻辑覆盖法和基本路径测试法。
2️⃣ 逻辑覆盖法:六种覆盖标准
逻辑覆盖是一组由弱到强的覆盖标准。覆盖强度越高,测试越充分,但成本也越高。
2.1 语句覆盖(Statement Coverage)
定义:让程序中每条可执行语句至少执行一次。
特点:这是最弱的覆盖标准。它只关心语句是否被执行,不关心分支的真假。
弱点:无法发现分支中逻辑运算的错误。例如,将AND误写为OR,满足语句覆盖的测试用例可能依然无法发现这个Bug。
示例:对于代码if (A > 1 && B == 0) { x = x / A; },只需设计一个用例使x = x / A执行一次即可达到语句覆盖。
2.2 判定覆盖(Decision Coverage / 分支覆盖)
定义:使得程序中每个判定的“真”和“假”两种结果至少经历一次。
特点:比语句覆盖更强。关注整个判定语句的两种输出,而非单个条件。
示例:针对if (A > 1 && B == 0),需要设计用例使该判定为真和为假各一次。
2.3 条件覆盖(Condition Coverage)
定义:使得判定中的每个条件的可能取值(真/假)至少满足一次。
特点:拆分关注每个原子条件(如A > 1和B == 0是两个独立条件),而非整个判定结果。
注意:满足了条件覆盖,不一定满足判定覆盖。例如,两个用例分别覆盖(A>1=true, B==0=false)和(A>1=false, B==0=true),虽然每个条件都取过真和假,但整个判定可能从未取过真。
2.4 判定-条件覆盖(Decision-Condition Coverage)
定义:同时满足判定覆盖和条件覆盖的要求。
目标:弥补前两者的不足——既让每个条件的真假至少一次,也让每个判定的真假至少一次。
局限:可能无法覆盖条件间的组合情况。例如,(T, T)和(F, F)两种组合可能都没有被覆盖。
2.5 条件组合覆盖(Condition Combination Coverage)
定义:使得每个判定中所有条件的各种可能组合至少出现一次。
特点:覆盖条件组合的“真值表”。这是最强的多条件覆盖标准。
成本:组合数随条件数指数增长,测试用例数可能很多。例如3个条件就有8种组合。
2.6 路径覆盖(Path Coverage)
定义:设计足够用例,覆盖程序中所有可能的执行路径。
特点:这是最强的覆盖标准。
挑战:对于包含循环的程序,路径数量可能无限(例如循环次数不确定),通常需要设定最大循环次数。实际中,路径覆盖往往难以完全实现。
3️⃣ 六种逻辑覆盖的强弱关系(重点!)
从弱到强排列:
语句覆盖 < 判定覆盖 < 条件覆盖 < 判定-条件覆盖 < 条件组合覆盖 < 路径覆盖
关键补充:判定覆盖与条件覆盖无绝对强弱之分——判定覆盖可能不满足条件覆盖,条件覆盖也可能不满足判定覆盖。但两者都比语句覆盖强,都比判定-条件覆盖弱。
记忆口诀:“语判条,判条组,路径最强最辛苦”
4️⃣ 基本路径测试法
基本路径测试法是在路径覆盖的基础上,通过控制流图和环形复杂度来导出基本的、可执行的独立路径集合,从而设计测试用例。
4.1 四个核心步骤
| 步骤 | 内容 |
|---|---|
| 第1步 | 根据详细设计或源代码,导出程序的控制流图 |
| 第2步 | 计算控制流图的环路复杂性 V(G) |
| 第3步 | 确定线性无关的路径的基本集 |
| 第4步 | 为每条基本路径设计测试用例 |
4.2 控制流图(Control Flow Graph)
控制流图用节点(圆圈)代表一个或多个顺序执行的语句,用边(箭头)代表控制流的转移。
常见结构的转换规则:
- 顺序结构:节点依次连接
- if-else 分支:一个节点分出两条边,分别指向两个分支
- while 循环:一个节点分出两条边——进入循环体和跳过循环体
4.3 环形复杂度(McCabe度量法)
环形复杂度 V(G)决定了至少需要多少条独立路径。
三种计算方法(结果相同):
| 方法 | 公式 | 说明 |
|---|---|---|
| 区域法 | V(G) = 区域数 | 流图中将平面划分成的区域数量 |
| 边-节点法 | V(G) = E - N + 2 | E=边数,N=节点数 |
| 判定节点法 | V(G) = P + 1 | P=判定节点的数量 |
实际意义:
V(G)的值 =独立路径的最少条数V(G) ≤ 10:代码简单,易于维护10 < V(G) ≤ 20:需考虑重构优化V(G) > 20:高风险代码,可测试性差
5️⃣ 经典例题
例题1:以下关于白盒测试的叙述中,正确的是( )。
A. 白盒测试只关注程序的输入输出,不关注内部结构
B. 语句覆盖是最强的逻辑覆盖标准
C. 白盒测试基于程序内部逻辑结构设计测试用例
D. 白盒测试和黑盒测试的测试依据相同
解析:A是黑盒测试的描述;B说反了——语句覆盖是最弱的;D错误,白盒测试依据程序代码,黑盒测试依据需求规格说明书。C正确,白盒测试正是基于程序内部逻辑结构来设计测试用例的。选C。
例题2:在六种逻辑覆盖标准中,覆盖强度从低到高排列正确的是( )。
A. 语句覆盖 → 判定覆盖 → 条件覆盖 → 判定-条件覆盖 → 条件组合覆盖 → 路径覆盖
B. 语句覆盖 → 条件覆盖 → 判定覆盖 → 判定-条件覆盖 → 路径覆盖 → 条件组合覆盖
C. 判定覆盖 → 语句覆盖 → 条件覆盖 → 判定-条件覆盖 → 条件组合覆盖 → 路径覆盖
D. 语句覆盖 → 判定覆盖 → 判定-条件覆盖 → 条件覆盖 → 条件组合覆盖 → 路径覆盖
解析:正确的强弱顺序是:语句覆盖 < 判定覆盖 < 条件覆盖 < 判定-条件覆盖 < 条件组合覆盖 < 路径覆盖。选A。
例题3:某程序的控制流图有8个节点和10条边,则该程序的环形复杂度为( )。
A. 2
B. 3
C. 4
D. 5
解析:V(G) = E - N + 2 = 10 - 8 + 2 = 4。选C。
6️⃣ 记忆口诀
白盒测试看代码,逻辑覆盖分六层。
语判条判条组路,由弱到强记分明。
基本路径四步走:画图算环定路径,最后设计测试例。
环形复杂度三公式:区域、E-N+2、判定节点+1。
7️⃣ 小测验(评论区对答案)
某程序的控制流图包含6个节点和8条边,则该程序的环形复杂度为( )。根据该复杂度,至少需要设计多少条独立路径的测试用例?
A. 2;2
B. 3;3
C. 4;4
D. 5;5
🔔本专栏日更,点击头像 → 专栏《软考中级高频考点》订阅,第一时间接收新内容
#软考中级 #软件设计师 #白盒测试 #逻辑覆盖 #基本路径测试 #软件工程