覆盖是白盒测试的核心指标,用于衡量测试用例对代码的"扫描"程度。以下是主要覆盖类型的深度解析:
1. 语句覆盖(Statement Coverage)
定义
确保每条可执行语句至少被执行一次
最基础的覆盖标准
示例
python
复制
下载
def calculate(x):
if x > 0: # 分支语句
print("正数") # 语句1
else:
print("非正数") # 语句2
测试用例:
x=1(覆盖语句1)
x=-1(覆盖语句2)
覆盖率计算:
总语句数:3(if + print + print)
已覆盖:3 → 100%语句覆盖
优缺点
✅ 简单易实现
❌ 无法检测缺失分支(如没有测试x=0的情况)
2. 分支覆盖(Branch Coverage)
定义
每个条件判断的True/False分支都要被覆盖
比语句覆盖更严格
示例
java
复制
下载
public String check(int score) {
if (score >= 60) { // 分支点
return "及格"; // 分支1
} else {
return "不及格"; // 分支2
}
}
测试用例:
score=80(覆盖分支1)
score=50(覆盖分支2)
特殊情况:
python
复制
下载
if a and b: # 需要测试a/b的各种组合
与语句覆盖的关系
100%分支覆盖 ⇒ 100%语句覆盖
反之不成立
3. 条件覆盖(Condition Coverage)
定义
每个布尔子表达式的True/False都要被覆盖
适用于复合条件判断
示例
c
复制
下载
if (age > 18 && gender == 'M') { // 两个子条件
// do something
}
子条件:
age > 18(T/F)
gender == 'M'(T/F)
测试用例:
用例agegender覆盖条件组合120'M'T && T215'F'F && F320'F'T && F (可选)415'M'F && T (可选)
注意点
不保证所有分支被覆盖(如只测TT和FF可能漏掉分支)
4. 路径覆盖(Path Coverage)
定义
覆盖所有可能的执行路径
最严格的覆盖标准
示例
python
复制
下载
def func(x, y):
if x > 0: # 分支1
y += 1
if y < 10: # 分支2
x += 1
return x + y
独立路径:
分支1=T → 分支2=T
分支1=T → 分支2=F
分支1=F → 分支2=T
分支1=F → 分支2=F
现实挑战
循环可能产生无限路径 → 通常限制循环次数
复杂度随分支数指数增长(n个分支⇒最多2ⁿ条路径)
5. MC/DC覆盖(修正条件/判定覆盖)
定义
航空领域最高安全标准(DO-178C)
要求:
每个条件独立影响判定结果
覆盖所有条件的所有可能取值
示例
c
复制
下载
if (A || B) && C { // 3个条件
// ...
}
测试需求:
保持B和C不变,改变A使判定结果变化
保持A和C不变,改变B使判定结果变化
保持A和B不变,改变C使判定结果变化
最少测试用例(通常需要4-6个)
6. 其他覆盖类型
类型说明适用场景函数覆盖每个函数/方法被调用基础验证参数值覆盖检测参数边界值API测试数据流覆盖跟踪变量定义-使用链编译器/静态分析异常覆盖触发所有异常处理代码健壮性测试
覆盖策略选择指南
图表
代码
复制
下载
graph TD
A[测试目标] --> B{安全关键系统?}
B -->|是| C[MC/DC覆盖]
B -->|否| D{代码复杂度?}
D -->|高| E[分支+条件覆盖]
D -->|低| F[语句覆盖]
行业标准参考
医疗/航空:MC/DC覆盖 ≥95%
金融系统:分支覆盖 ≥90%
普通应用:语句覆盖 ≥80%
覆盖工具示例
语言工具支持覆盖类型JavaJaCoCo语句/分支/行覆盖Pythoncoverage.py语句覆盖C/C++gcov分支/语句覆盖JavaScriptIstanbul行/分支/函数覆盖
黄金法则
不要盲目追求100%覆盖 → 关键模块优先
覆盖质量 > 覆盖数量 → 检查测试用例有效性
结合黑盒测试 → 边界值/等价类补充验证
微软研究表明:85%的分支覆盖率通常能发现绝大多数缺陷,超过后收益递减。合理的覆盖策略比绝对数字更重要。