【软件工程】软件测试:白盒测试(逻辑覆盖 / 基本路径)

【软件工程】软件测试:白盒测试(逻辑覆盖 / 基本路径)

考点频率:★★★★★(选择题必考,下午案例题也常出现)
难度:⭐⭐⭐⭐
建议:重点掌握六种逻辑覆盖的强弱顺序与各自定义,以及基本路径测试中控制流图的绘制与环形复杂度计算

1️⃣ 什么是白盒测试?

白盒测试,又称结构测试透明盒测试,是把程序当成一个透明的盒子,基于程序内部的逻辑结构和代码路径来设计测试用例。与黑盒测试关注“做什么”不同,白盒测试关注“怎么做”——盯着代码本身,检查分支、循环、条件判断有没有被跑通。

核心思想:程序执行就像在由各种判断(if/elseswitch、循环)构成的迷宫中“走路”。白盒测试的目标就是系统地覆盖这些路径,尽可能多地发现代码中的缺陷。

适用阶段:白盒测试主要用于单元测试阶段,开发人员自己测自己写的代码。

软考中白盒测试的高频考点就两个:逻辑覆盖法基本路径测试法

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 > 1B == 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 + 2E=边数,N=节点数
判定节点法V(G) = P + 1P=判定节点的数量

实际意义

  • 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

🔔本专栏日更,点击头像 → 专栏《软考中级高频考点》订阅,第一时间接收新内容

#软考中级 #软件设计师 #白盒测试 #逻辑覆盖 #基本路径测试 #软件工程