if/while/for/语句覆盖/分支覆盖/路径覆盖的控制流程图+数据流分析(DU)
语句的线性序列Linear Sequences of Statements
“If” Constructs
“While” Constructs
“For” Constructs
语句覆盖率Statement Coverage
测试套件应执行 CFG 的所有节点
也被称为:
• 线路覆盖Line Coverage
• 节点覆盖Node Coverage
• 基本块覆盖Basic Block Coverage
分支机构覆盖Branch Coverage
测试套件应执行 CFG 的所有真/假边缘
也被称为:
• 决策覆盖率Decision Coverage
• 谓词覆盖Predicate Coverage
• 边缘覆盖Edge Coverage
路径覆盖Path Coverage
测试套件应执行通过 CFG 的所有路径
在实践中通常不可能
通过 countZeros 的路径数取决于 x 的长度
某些版本的路径覆盖专注于每个循环的 0、1 或更多次执行,以减少可能无限数量的路径!
覆盖标准受不可行测试要求的约束Coverage Criteria are Subject To Infeasible Test Requirements
• 这也可能发生在声明覆盖范围内: 不可行的语句指向死代码
• Branch Coverage 更有可能发生这种情况: 不可行的分支指向代码中的冗余决策
• 很可能与路径覆盖:
不可行路径不一定是冗余的结果; 并非所有通过 CFG 的路径在实际代码中都是合法可行的
包含结构覆盖标准Subsumption of Structural Coverage Criteria
何时使用结构覆盖
• 结构覆盖级别是了解测试套件执行了多少代码的有用指标。
• 通用原理:您不会希望发布未通过至少一次测试执行至少一次的代码部分:
因此语句/行覆盖率是常用的指标
但 Branch Coverage 更强,无需更多额外努力即可获得
路径覆盖不太常见且通常难以处理
数据流分析Data Flow Analysis
它也是一个 Definition-Use Path
在数据流分析和测试中,DU 集指的是程序或系统中的变量集,这些变量被定义并随后在程序执行中使用。
在数据流分析中,目标是跟踪程序中的数据流,以确定变量是如何定义的(赋值)以及这些定义的值稍后在程序中的使用方式。 集合 DU 获了变量定义及其用途之间的这种关系。
集合 DU 可以表示为变量对 (d, u) 的集合,其中 d 表示变量的定义,u 表示它在程序中的后续使用。 每对 (d, u) 表示在程序的某个点定义了一个变量,其值在稍后的点使用。
通过分析集合 DU,数据流分析技术可以识别与变量使用相关的潜在问题或异常,例如未初始化的变量、已定义但从未使用过的变量,或未事先定义就使用的变量。
在测试环境中,DU 集也可以用来指导测试用例的设计。 测试人员可以专注于创建测试用例,这些用例会执行程序中定义和使用变量的路径,确保所有相关数据流场景都得到充分测试。
总的来说,集合 DU 通过捕获变量定义和使用之间的关系,使分析和测试技术能够识别潜在问题并指导测试用例设计,在数据流分析和测试中起着至关重要的作用。
所有用途覆盖All Uses Coverage
每个定义到达每个使用同一个变量
所有Def-Use 路径覆盖
DU中的每条路径都需要执行
一个复杂的例子: