历年下午案例试题一都是考察白盒测试,具体的考察形式也已经固定
一、题型结构与知识框架
案例分析题包含三大核心问题:
推导特定覆盖层级的逻辑条件
绘制控制流图并计算环路复杂度
确定线性无关路径集合
二、覆盖层级标准精解(关键对比)
覆盖类型 测试条件要求 覆盖验证点
语句覆盖 执行所有可执行语句 每个语句至少执行一次
分支覆盖 遍历控制流图所有边 每个分支的真/假结果至少出现一次
判定覆盖 覆盖每个判定语句的所有可能结果 每个判定的TRUE/FALSE结果
条件覆盖 每个子条件的所有可能取值 每个条件取TRUE/FALSE
条件组合覆盖 每个判定的所有子条件取值组合 所有可能的布尔组合
修正条件判定覆盖 每个条件独立影响判定结果 条件与判定的因果关系验证
三、控制流图构建规范
结构化转换原则
顺序结构:合并为矩形节点
分支结构:
if(A && B){...} → if(A){if(B){...}}
循环结构:显式标注入口/出口节点
特殊节点处理
虚节点:用于分支汇聚(即使无实际代码)
复合条件:分解为嵌套判断结构
异常出口:单独建立终止节点
绘图示例
void func(int a, int b){
if(a > 0 && b < 5){ // P1
printf("C1");
}
else{
printf("C2");
}
}
转换后控制流图:
[开始]→[a>0?]→(T)→[b<5?]→(T)→[C1]→[结束] ↓(F) ↗ [C2]←(F)←[a>0?]←(F)←[b<5?]
四、环路复杂度计算体系
基础公式验证
V(G)=E−N+2=P+1
�
(
�
)
=
�
−
�
+
2
=
�
+
1
其中:
$E$: 边数
$N$: 节点数
$P$: 谓词节点数(即条件判断节点)
典型结构复杂度
顺序结构:$V=1$
单分支if:$V=2$
while循环:$V=2$
switch-case:$V=case数+1$
五、线性无关路径生成方法
路径选择策略
基准路径法:沿主执行路径扩展
分支遍历法:逐个覆盖未访问分支
路径描述规范
// 示例代码
while(x<10){ if(y>5) A();
else B();
x++;
}
路径集合:
[开始]→while→y>5→A→x++→退出循环
[开始]→while→y≤5→B→x++→退出循环
[开始]→while→y>5→A→x++→继续循环→y≤5→B→x++
路径验证指标
覆盖所有边
包含至少一个新条件组合
路径数等于$V(G)$
六、典型题型解答示例
给定代码:
int classify(int x){
if(x > 100) return 1;
else if(x < 0) return 2;
else return 3;
}
问题1:语句覆盖条件 需执行路径:
x>100 → return 1
x≤100且x<0 → return 2
x≥0且x≤100 → return 3
问题2:控制流图与复杂度
[开始]→[x>100?]→(T)→[return1]→[结束]
↓(F)
→[x<0?]→(T)→[return2]→[结束]
↓(F)
→[return3]→[结束]
计算:
$E=6$, $N=5$ → $V=6-5+2=3$
判定节点数2 → $V=2+1=3$
问题3:线性无关路径
开始 → x>100 → return1
开始 → x≤100 → x<0 → return2
开始 → x≤100 → x≥0 → return3
————————————————