题目
分析并改进最大公约数函数的测试覆盖率
信息
- 类型:问答
- 难度:⭐⭐
考点
测试覆盖率分析,测试用例设计,测试策略理解
快速回答
针对最大公约数函数的测试覆盖率问题:
- 覆盖率分析:识别未覆盖的分支(如a=0,b=0)和边界条件(负数输入)
- 测试用例设计:补充测试用例覆盖缺失分支,包括(0,0)、负数组合和质数组合
- 局限性认知:100%覆盖率不能保证逻辑正确性,需结合其他测试方法
原理说明
测试覆盖率衡量测试用例执行代码的程度,常用指标包括:
- 语句覆盖:是否执行每条语句
- 分支覆盖:是否覆盖所有条件分支
- 路径覆盖:是否覆盖所有执行路径
代码示例
原始函数:
def gcd(a, b):
if a == 0 and b == 0:
return 0 # 特殊分支
a, b = abs(a), abs(b)
while b:
a, b = b, a % b
return a初始测试用例(覆盖率不足):
def test_gcd():
assert gcd(12, 8) == 4 # 正数常规用例
assert gcd(17, 5) == 1 # 质数组合覆盖率报告显示:
• 第2行(a==0 and b==0)未覆盖
• 负数输入未测试
改进方案
补充测试用例:
def test_gcd_enhanced():
# 覆盖特殊分支
assert gcd(0, 0) == 0
# 覆盖负数边界
assert gcd(-12, 8) == 4
assert gcd(12, -8) == 4
# 覆盖零值组合
assert gcd(0, 5) == 5
assert gcd(5, 0) == 5
# 覆盖大数运算
assert gcd(2*3*5*7, 3*5*11) == 15最佳实践
- 分层覆盖目标:核心逻辑100%分支覆盖,工具类代码80%+语句覆盖
- 覆盖策略:优先覆盖边界值、异常路径、复杂分支
- 工具整合:结合Coverage.py/JaCoCo等工具生成可视化报告
- 持续监控:在CI/CD流水线设置覆盖率阈值(如新增代码≥85%)
常见错误
- ❌ 仅追求高覆盖率数字,忽略测试用例有效性
- ❌ 未覆盖边界条件(如0值、最大值、非法输入)
- ❌ 忽略异常处理分支(如try-catch块)
- ❌ 未定期更新测试用例适应代码变更
扩展知识
- 变异测试:故意注入代码缺陷,验证测试用例能否捕获
- 组合覆盖:使用Pairwise/正交表减少用例数量
- 覆盖率类型对比:
- 行覆盖:最基础但可能遗漏分支
- 分支覆盖:检测条件逻辑缺陷
- MC/DC覆盖:航空/安全关键系统强制要求 - 行业基准:Google推荐核心模块≥90%分支覆盖,非关键模块≥60%