当前位置: 首页 > news >正文

测试覆盖标准-条件覆盖-短路求值

测试覆盖标准-条件覆盖-短路求值

一 测试覆盖标准

测试覆盖标准是指在软件测试过程中,用来衡量测试用例对软件代码的覆盖程度的一系列指标。这些标准帮助确保测试活动的有效性,并有助于识别未被测试覆盖的代码区域,从而减少潜在的风险。以下是一些常见的测试覆盖标准:

  1. 语句覆盖:确保程序中的每一条语句至少被执行一次。这是最基本的覆盖标准。

  2. 分支覆盖(或称为判定覆盖):保证程序中每个判断(if语句、循环等)的真假分支都至少执行一次。

  3. 条件覆盖:要求程序中每个逻辑条件的每个可能的结果(true或false)都被测试到。这比分支覆盖更严格,因为它关注的是条件本身的覆盖情况。

  4. 路径覆盖:尝试运行程序中所有可能的执行路径。理论上,这是最全面的覆盖方式,但在实践中,由于路径数量随着程序复杂度指数级增长,实现起来可能不切实际。

  5. 多重条件覆盖:要求测试程序中的每一个条件的所有可能组合。这是一种非常严格的覆盖标准,对于复杂的条件表达式尤其重要。

  6. 函数覆盖:确保程序中的每个函数或方法至少被调用了一次。

  7. 线程/进程覆盖:在并发编程中,特别关注不同线程或进程之间的交互和同步问题,确保所有可能的线程调度顺序都被考虑到。


二 示例代码(C风格伪代码)

int function(int A, int B, int C) {if (A == 0 || (B > 1 && C == 0)) {B = B + 1;}if (B == 0) {C = C - 1;}return C;
}

这段代码中有两个 if 判断,包含逻辑条件,适合用来演示这四种覆盖标准。


1. 语句覆盖(Statement Coverage)

目标:确保程序中的每条语句至少被执行一次。

要求:
  • 所有语句都要执行到,包括 if 块内的语句。
测试用例举例:
ABC是否满足
020是(进入第一个 if)
105是(进入第二个 if)

解释:

  • 第一个测试用例触发了 B = B + 1;
  • 第二个测试用例触发了 C = C - 1;
  • 所有语句都执行到了 → 达成语句覆盖。

2. 分支覆盖 / 判定覆盖(Branch / Decision Coverage)

目标:每个判断的真假分支都要被覆盖。

要求:
  • 每个 if 的 true 和 false 分支都必须被执行一次。
测试用例举例:
ABC第一个 if 结果第二个 if 结果
020truefalse
121falsefalse
105falsetrue

解释:

  • 第一个测试用例使第一个 if 成立(true)
  • 第二个测试用例使第一个 if 不成立(false)
  • 第三个测试用例使第二个 if 成立(true)
  • 所以所有判断分支都被覆盖 → 达成分支覆盖。

3. 条件覆盖(Condition Coverage)

目标:每个逻辑条件的每个可能结果(true/false)都被测试到。

条件分解:

第一个 if 中有两个子条件:

  • A == 0
  • (B > 1 && C == 0) → 又可拆分为两个条件:
    • B > 1
    • C == 0

所以总共有 3 个独立条件:

  1. A == 0
  2. B > 1
  3. C == 0
  4. B == 0 (第二个 if 中的条件)
测试用例举例:
ABCA==0B>1C==0B==0
020TTTF
111FFFF
100FFTT

解释:

  • 每个条件的 true 和 false 都出现过 → 达成条件覆盖。

4. 路径覆盖(Path Coverage)

目标:覆盖所有可能的执行路径。

分析路径:

从上面代码中,我们可以分析出以下几条路径:

  1. 不进任何 if

    • A != 0 且 (B <=1 或 C != 0)
    • 且 B != 0
  2. 进入第一个 if,不进第二个:

    • A == 0 或 (B >1 且 C == 0)
    • 且 B != 0
  3. 不进第一个 if,进入第二个:

    • A != 0 且 (B <=1 或 C != 0)
    • 且 B == 0
  4. 进入两个 if

    • A == 0 或 (B >1 且 C == 0)
    • 且 B == 0
测试用例举例:
ABC路径编号
121路径 1
020路径 2
101路径 3
000路径 4

解释:

  • 每一条路径都有对应的测试用例覆盖 → 达成路径覆盖。

总结对比表

覆盖类型目标优点缺点
语句覆盖每条语句至少执行一次简单、容易实现忽略分支/条件逻辑
分支覆盖每个判断的真假分支都要执行比语句覆盖更全面忽略多个条件组合
条件覆盖每个逻辑条件的真假都要测试更细粒度地检测逻辑错误不保证所有路径都走通
路径覆盖所有可能路径都要执行最彻底,能发现复杂逻辑问题实现成本高,尤其对大程序

三 条件覆盖

好的!我们来更详细地、一步步地讲解条件覆盖(Condition Coverage),并用一个具体的例子帮助你彻底理解。


什么是“条件覆盖”?

条件覆盖(Condition Coverage) 是指:
在测试中,确保程序中每一个逻辑条件的每一个可能结果(true 或 false)都被执行到。

这和“分支覆盖”不同,因为:

  • 分支覆盖只关心整个 if 条件的结果是 true 还是 false。
  • 条件覆盖则关注的是每个子条件是否都取过 true 和 false。

示例代码

我们继续使用之前的例子:

int function(int A, int B, int C) {if (A == 0 || (B > 1 && C == 0)) {B = B + 1;}if (B == 0) {C = C - 1;}return C;
}

第一个 if 的条件是:

A == 0 || (B > 1 && C == 0)

这个判断由多个基本条件组成:

  1. A == 0
  2. B > 1
  3. C == 0

第二个 if 的条件是:

B == 0

所以一共四个独立的条件:

编号条件表达式
C1A == 0
C2B > 1
C3C == 0
C4B == 0

条件覆盖的目标

要达到条件覆盖,我们需要设计足够多的测试用例,使得:

对于每一个独立条件(如 C1 到 C4),在测试中至少出现一次为 true,也至少出现一次为 false


设计满足条件覆盖的测试用例

我们来设计几个输入值,并记录每个条件的结果。

测试编号ABCC1: A==0C2: B>1C3: C==0C4: B==0
T1020truetruetruefalse
T2111falsefalsefalsefalse
T3100falsefalsetruetrue

现在我们来检查每个条件是否都取到了 true 和 false:

条件是否有 true是否有 false
C1: A == 0✅ T1 是 true✅ T2/T3 是 false
C2: B > 1✅ T1 是 true✅ T2/T3 是 false
C3: C == 0✅ T1/T3 是 true✅ T2 是 false
C4: B == 0✅ T3 是 true✅ T1/T2 是 false

✅ 所有条件都有 true 和 false → 达到了条件覆盖!


注意事项

  • 条件覆盖并不保证所有组合都测试了(比如 (A==0 为 true)(B>1 为 false) 的情况是否被测试到)
  • 它只要求每个条件本身都取过 true 和 false
  • 所以它比分支覆盖更细致,但不如多重条件覆盖或 MC/DC 强

类比理解

你可以把“条件覆盖”想象成你在检查一个灯泡电路中的每个开关:

  • 不管最终灯亮不亮(就像不管整个 if 成立与否)
  • 只要每个开关都分别开过和关过(也就是每个条件都为 true 和 false)

你就完成了“条件覆盖”。


小结

覆盖类型关注点目标
语句覆盖每条语句是否执行所有语句都要执行过
分支覆盖整个 if 是否真假每个判断的真假分支都要执行
条件覆盖每个子条件是否真假每个独立条件都必须为 true 和 false 各一次

四 提问

为什么要三组测试用例 不能两组测试用例吗? 比如第一组全是True 第二组全是false 我觉得这样也满足在测试中至少出现一次为 true,也至少出现一次为 false。

非常好的问题!👏
你提出的思路非常有逻辑性:“如果一组测试用例让所有条件都为 true,另一组都为 false,那每个条件是不是也都经历了 true 和 false?”

从表面来看,这似乎满足了条件覆盖的要求。但事实上,在软件测试中,并不是只要两个测试用例就能达成条件覆盖,因为有些条件在某些组合下会被“短路”(short-circuit),导致某些子条件根本不会被判断到。


我们来一步步分析你的想法:

你说:

“第一组全是 true,第二组全是 false,这样每个条件都有一次 true 和一次 false。”

我们试试看能不能用两组测试用例来实现条件覆盖。

示例代码回顾:

if (A == 0 || (B > 1 && C == 0)) {B = B + 1;
}

这个 if 的完整表达式是:

(A == 0) || ((B > 1) && (C == 0))

我们可以把它拆成三个独立的子条件:

  • C1: A == 0
  • C2: B > 1
  • C3: C == 0

尝试用两组测试用例达成条件覆盖

测试用例 T1(全部为 true):
ABCC1: A==0C2: B>1C3: C==0
020truetruetrue
测试用例 T2(全部为 false):
ABCC1: A==0C2: B>1C3: C==0
111falsefalsefalse

看起来每个条件都出现了 true 和 false?对吧?

但是这里有个大问题 —— 短路求值(Short-Circuit Evaluation)!


关键问题:短路逻辑的影响

在大多数编程语言中(如 C、C++、Java、Python、JavaScript 等),逻辑或 || 是短路运算符

  • 如果第一个条件为 true,就不会再计算后面的条件。

所以当你运行 T1(A == 0 为 true)时:

if (true || (B > 1 && C == 0)) { ... }

程序根本不会去判断 (B > 1)(C == 0)

这意味着在 T1 中,虽然你在测试用例表中写下了 C2: trueC3: true,但实际上这些条件并没有被执行!


正确的做法:确保每个子条件都被真正评估过

为了达到真正的条件覆盖,我们需要设计测试用例,使得:

每个子条件 必须被实际评估到,而不是被跳过。

这就要求我们在不同的测试用例中,有意地让前面的条件不成立,从而强制评估后面的条件


正确的三组测试用例示例

测试编号ABCC1: A==0C2: B>1C3: C==0是否评估所有条件?
T1020true不评估不评估
T2111falsefalsefalse
T3100falsefalsetrue

解释:

  • T1:A == 0 成立,后面的 (B > 1 && C == 0) 被短路 → 不能用来确认 C2 和 C3 被测试
  • T2:所有条件都为 false,而且没有短路,C1、C2、C3 都被评估了
  • T3:A != 0,进入后面判断;B <= 1,但 C == 0 为 true,说明 C3 被评估

所以需要至少三组测试用例才能真正覆盖所有条件并避免短路影响。


总结

问题回答
为什么不能只用两组测试用例?因为存在短路逻辑,某些子条件可能根本没有被评估。
两组测试用例是否满足形式上的“每个条件出现 true 和 false”?表面上是的,但如果考虑实际执行路径,某些条件并未被真正测试到。
如何正确做条件覆盖?设计测试用例时要绕过短路机制,确保每个子条件都被实际判断一次。

http://www.dtcms.com/a/272999.html

相关文章:

  • 全新开源AI知识库系统!PandaWiki一键构建智能文档,支持AI问答、创作与搜索!
  • [特殊字符] 05_Jenkins 部署前端项目实现自动化部署
  • rv1106使用笔记
  • 【RL-VLM-F】算法框架图绘图学习笔记
  • ubuntu server配置静态IP
  • ​​​​​​​微软PowerBI PL-300认证考试报名入口及费用
  • 【PTA数据结构 | C语言版】顺序队列的3个操作
  • 完美卸载 Ubuntu 双系统:从规划到实施的完整指南
  • 乐鑫代理商飞睿科技,ESP32模组重塑AIoT体验的四大技术支柱
  • C++类型萃取(Type Traits):深入解析std::enable_if与std::is_same
  • git fetch的使用
  • 【第五章-基础】Python 函数---以一个初学者来理解函数
  • 第十六天,7月10日,八股
  • 【网络安全】利用 Cookie Sandwich 窃取 HttpOnly Cookie
  • vue中token的使用与统计实践
  • android闪光灯源码分析
  • Android 插件化实现原理详解
  • 【读书笔记】如何画好架构图:架构思维的三大底层逻辑
  • 遥感影像图像分割-地物提取模型训练与大图直接推理流程
  • 突破传统局限:60G 3D毫米波雷达如何实现精准人体全状态检测?
  • Vue3基础知识
  • 论文笔记(LLM distillation):Distilling Step-by-Step!
  • 5、Vue中使用Cesium实现交互式折线绘制详解
  • 电脑被突然重启后,再每次打开excel文件,都会记录之前的位置窗口大小,第一次无法全屏显示。
  • imx6ul Qt运行qml报错This plugin does not support createPlatformOpenGLContext!
  • 无人机抗风模块运行与技术难点分析
  • Flowable22变量监听器---------------持续更新中
  • OneFileLLM:一键聚合多源信息流
  • 股指期货交割交易日到期没平仓盈亏以哪个价格计算?
  • RP2040使用存储系统