【软考 程序流程图的测试方法】McCabe度量法计算环路复杂度
程序流程图的测试方法
程序流程图的测试方法主要用于验证代码逻辑的完整性和正确性,属于白盒测试范畴。以下是几种核心方法及其应用方式:
1. 基本路径测试(Basis Path Testing)
- 原理:基于控制流图(CFG)生成覆盖所有独立路径的测试用例。
- 步骤:
- 绘制控制流图:将代码转换为节点(语句块)和边(控制转移)。
- 计算环路复杂度(McCabe方法):确定独立路径数量。
- 生成路径集合:覆盖所有独立路径。
- 设计测试用例:为每条路径设置输入和预期输出。
- 示例:
代码片段:if x > 0:print("正数") else:print("非正数") for i in range(3):print(i)
- 独立路径:2条(if分支 + 循环执行3次)。
2. 条件覆盖测试(Condition Coverage)
- 目标:确保每个逻辑条件的真/假结果均被覆盖。
- 步骤:
- 识别条件表达式:如
if (A and B)
。 - 设计用例覆盖所有可能组合:例如:
- 用例1:
A=True, B=True
- 用例2:
A=True, B=False
- 用例3:
A=False, B=True
- 用例4:
A=False, B=False
- 用例1:
- 识别条件表达式:如
3. 循环测试(Loop Testing)
- 目标:验证循环边界和迭代逻辑。
- 策略:
- 零次循环:跳过循环体。
- 单次循环:执行一次循环。
- 多次循环:执行典型次数(如2次)。
- 最大次数循环:测试边界值。
4. 分支覆盖测试(Branch Coverage)
- 目标:覆盖所有分支(如
if-else
、switch-case
)。 - 步骤:
- 标记所有分支点。
- 设计用例确保每个分支至少执行一次。
McCabe度量法计算环路复杂度
公式与步骤
McCabe环路复杂度(Cyclomatic Complexity)通过以下任一方式计算:
-
基于控制流图:
[
V(G) = E - N + 2P
]- (E):边数
- (N):节点数
- (P):连通分量数(通常 (P=1))
-
基于判定节点数:
[
V(G) = \text{判定节点数} + 1
]
示例演示
代码逻辑:
if A:print("A成立")
else:print("A不成立")
if B:print("B成立")
for i in range(2):print(i)
步骤1:统计参数
- 节点 (N = 6)(开始、A判断、两个分支、B判断、循环、结束)
- 边 (E = 7)
- 连通分量 (P = 1)
步骤2:计算复杂度
[
V(G) = 7 - 6 + 2 \times 1 = 3
]
或:判定节点数 = 2(两个if
) → (V(G) = 2 + 1 = 3)
环路复杂度的意义
- 复杂度值 = 最小测试用例数(需覆盖所有独立路径)。
- 阈值建议:
- (V(G) \leq 10):代码简单,易于维护。
- (10 < V(G) \leq 20):需重构优化。
- (V(G) > 20):高风险代码。
总结
- 测试方法:基本路径测试、条件覆盖、循环测试、分支覆盖是验证流程图逻辑的核心手段。
- McCabe复杂度:通过控制流图或判定节点数快速评估代码复杂度,指导测试用例设计。
- 实践建议:结合具体代码结构选择测试策略,优先覆盖高复杂度模块。