路径测试是什么
路径测试基于程序的控制流图,沿代码分支设计执行路径:语句覆盖要求每行都执行到,分支覆盖要求每个判断的真假都取到,路径覆盖要求走遍不同分支组合。工程上最常用的是独立路径覆盖——按圈复杂度算出最少需要几条路径,把线性无关的路径各走一遍。它是白盒测试里判断覆盖是否实在的基准线。
基本信息
| 覆盖梯度 | 语句覆盖 弱于 分支覆盖 弱于 条件组合覆盖 |
|---|---|
| 圈复杂度 | V(G) = 判断节点数 + 1,也等于最少独立路径数 |
| 独立路径集 | 每条路径至少引入一段新边,数量等于圈复杂度 |
| 执行依据 | 控制流图:节点是语句块,边是控制转移 |
| 配套手段 | 结合边界值与条件取反设计测试数据 |
| 常用工具 | JaCoCo、Istanbul 等覆盖率工具可在运行时统计 |
圈复杂度速算
圈复杂度速算
代码:
if (a > 0 && b > 0)
X();
if (c)
Y();
圈复杂度 = 判断数 3 个 + 1 = 4 # 至少 4 条独立路径
路径示例:# 设计时让每条路径引入一段新的分支
1) a>0,b>0,c 真 -> X 与 Y 都执行
2) a>0,b>0,c 假 -> 只执行 X
3) a<=0,c 真 -> 只执行 Y
4) a<=0,c 假 -> 两者都不执行典型使用场景
- 单元测试补全:按圈复杂度检查是否所有分支都有人测过。
- 遗留代码摸底:先跑覆盖率工具看语句与分支覆盖,找到盲区。
- 安全关键模块:对失败处理与兜底分支单独设计路径用例。
- 评审辅助:分支密集的函数在评审单上标注路径设计要点。
- 回归筛选:改动涉及的分支路径对应的用例优先进入回归。
语句覆盖会骗人:一行为真假两半的捷径常被分支覆盖拆穿,覆盖率门槛一般按分支定。
路径爆炸是常态:循环与多判断函数不可能穷举,工程上以独立路径集为准。
覆盖率是下限不是目标:为了数字而写无断言的用例,风险依旧存在。