Code 覆盖率工具:语句、分支和决策测试

⚡ 智能摘要

Code 代码覆盖率是一种白盒测试指标,它报告源代码被测试套件执行的程度。ping 团队会查找未经测试的语句、分支、条件和路径,这些语句、分支和路径可能隐藏着缺陷。

  • 🎯 定义: Code 代码覆盖率量化了测试实际执行了多少源代码。
  • 📊 方法: 存在五种方法——语句覆盖、判定覆盖、分支覆盖、条件覆盖和有限状态机覆盖。
  • 🧩 报表与分支: 报表覆盖范围检查行,而分支机构覆盖范围检查每个决策结果。
  • Code 与功能性相比: Code 覆盖措施涵盖代码;功能覆盖措施涵盖需求。
  • 🛠️ 工具: Cobertura, OpenCloverEMMA 和 Sonar 可自动测量覆盖范围。
  • 🤖 人工智能协助: AI 工具能够自动生成测试用例,并发现未经测试的高风险覆盖缺口。

Code 覆盖率教程

什么是 Code 覆盖范围?

Code 覆盖 是衡量程序源代码测试程度的指标。它是以下形式的一种衡量标准: 白盒测试 它可以找出程序中未被一组测试用例覆盖的区域。它还有助于创建额外的测试用例以提高覆盖率,并确定代码覆盖率的量化指标。

大多数情况下,代码覆盖率系统会收集有关正在运行的程序的信息。然后,它将这些信息与源代码信息结合起来,生成一份关于测试套件代码覆盖率的报告。

为何使用 Code 覆盖率测试?

以下是使用代码覆盖率的一些主要原因:

  • 它可以帮助您衡量测试实施的效率。
  • 它提供了一种量化的测试方法。
  • 它定义了源代码的测试程度。

Code 覆盖方法

以下是主要的代码覆盖率计算方法:

  • 声明覆盖范围
  • 决策覆盖
  • 分支机构覆盖范围
  • Toggl电子覆盖范围
  • FSM 覆盖范围

声明覆盖范围

声明覆盖范围 语句覆盖率是一种白盒测试技术,它至少执行源代码中的所有可执行语句一次。它用于计算源代码中已执行的语句数量。语句覆盖率的主要目的是覆盖源代码中所有可能的路径、行和语句。

语句覆盖率用于根据被测代码的结构推导出各种场景。

声明覆盖范围

在白盒测试中,测试人员专注于软件的工作原理。换句话说,测试人员专注于源代码的内部运行机制,特别是控制流图或流程图。

一般来说,任何软件的源代码中都会包含各种各样的元素,例如运算符、函数、布局等等。ping例如异常处理程序等等。根据程序的输入,某些代码语句可能不会被执行。语句覆盖率的目标是覆盖代码中所有可能的路径、行和语句。

让我们通过一个例子来理解如何计算语句覆盖率。这里我们选取两种不同的场景,分别计算每种场景下的语句覆盖率百分比。

来源 Code:

Prints (int a, int b) {                       ------------  Printsum is a function
    int result = a + b;
    If (result > 0)
        Print ("Positive", result)
    Else
        Print ("Negative", result)
    }                                        -----------   End of the source code

情景1: 如果 A = 3,B = 9

声明覆盖方案 1

图中黄色标记的语句是根据场景执行的语句。已执行语句数为 5,语句总数为 7,因此语句覆盖率为 5/7 = 71%。

情景2: 如果 A = -3,则 B = -9

声明覆盖方案 2

图中黄色标记的语句是根据场景执行的语句。已执行语句数为 6,语句总数为 7,因此语句覆盖率为 6/7 = 85%。

但总的来说,你会发现所有陈述都涵盖在两种情景中。因此我们可以得出结论,总体陈述覆盖率为 100%。

声明覆盖范围包括哪些内容?

  1. 未使用的语句
  2. 死 Code
  3. 未使用的分支
  4. 缺失语句

决策覆盖测试

决策覆盖 决策覆盖率测试是一种白盒测试技术,它会报告源代码中每个布尔表达式的真假结果。决策覆盖率测试的目标是覆盖并验证所有可访问的源代码,方法是检查并确保每个可能的决策点的每个分支都至少执行一次。

在这种覆盖类型中,表达式可能变得非常复杂,因此很难实现 100% 的覆盖率。这就是为什么需要使用各种方法来报告此指标的原因。这些方法优先考虑最关键的组合。虽然它与分支覆盖率类似,但它对控制流更加敏感。

决策覆盖测试

决策覆盖示例

考虑以下代码:

Demo(int a) {
    If (a > 5)
        a = a * 3
    Print (a)
    }

情景1: a 的值为 2。如果 (a>5) 则决策结果为“否”,因此决策覆盖率 = 50%。

情景2: a 的值为 6。如果 (a>5) 则决策结果为“是”,因此决策覆盖率 = 50%。

测试用例 A 的值 输出 决策覆盖
1 2 2 50%
2 6 18 50%

分支覆盖测试

分支机构覆盖范围 分支覆盖率是一种白盒测试方法,它测试代码模块(语句或循环)的每个输出结果。分支覆盖率的目的是确保每个分支的每个决策条件至少执行一次。它有助于衡量独立代码段的比例,并找出没有分支的代码段。

例如,如果结果是二元的,则需要测试真和假结果。

计算分支覆盖率的公式:

分支覆盖率公式

分支机构覆盖示例

要学习分支覆盖率,请参考前面用过的例子。分支覆盖率也会考虑无条件分支。

测试用例 A 的值 输出 决策覆盖 分支机构覆盖范围
1 2 2 50% 33%
2 6 18 50% 67%

分支机构覆盖的优势:

  • 允许您验证代码中的所有分支。
  • 帮助您确保任何分支都不会导致程序运行出现任何异常。
  • 消除因语句覆盖率测试而产生的问题。
  • 可以帮助您找到其他测试方法未测试过的领域。
  • 允许您找到代码覆盖率的量化指标。
  • 分支覆盖率会忽略布尔表达式内部的分支。

条件覆盖测试

条件覆盖条件覆盖(或表达式覆盖)是一种测试方法,用于测试和评估条件语句中的变量或子表达式。条件覆盖的目标是检查每个逻辑条件的具体结果。与决策覆盖相比,条件覆盖对控制流的敏感性更高。在这种覆盖方式中,仅考虑包含逻辑操作数的表达式。

例如,如果一个表达式包含布尔运算(如 AND、OR 或 XOR),则表示所有可能的结果。条件覆盖率并不保证完全的决策覆盖率。

条件覆盖率的计算公式:

条件覆盖率公式

对于一个包含两个操作数的表达式,有四种可能的组合:TT、FF、TF 和 FT。考虑输入 X=3,Y=4(x)。 b) FALSE,条件覆盖率为 1/4 = 25%。

有限状态机覆盖

有限状态机覆盖率无疑是最复杂的代码覆盖率方法之一。这是因为它着眼于设计的行为。在这种覆盖率方法中,你需要查看特定状态被访问或转换的次数,以及有限状态机中包含的序列数量。

哪种类型 Code 可选择的保障范围

这无疑是最难回答的问题。为了选择合适的覆盖率方法,测试人员需要检查以下几点:

  • 被测代码存在一个或多个未发现的缺陷,
  • 潜在处罚的成本
  • 声誉损失的代价
  • 销售损失成本等等。

缺陷导致代价高昂的生产故障的可能性越高,您需要选择的覆盖级别就越严格。

Code 覆盖范围与功能覆盖范围

Code 保障范围 功能覆盖
告诉你你的测试平台对源代码的测试效果如何。 衡量您的测试平台对设计功能性的覆盖程度。
从不使用设计规范。 采用设计规范。
由开发人员完成。 由测试人员完成。

Code 覆盖工具

以下是一些重要的代码覆盖率工具:

工具名称 描述
Cobertura 一款开源代码覆盖率工具。它通过对代码库进行插桩,分析测试套件运行时哪些代码行被执行、哪些代码行未被执行,来衡量测试覆盖率。
三叶草 三叶草(OpenClover) 还可以通过仅运行涵盖自上次构建以来修改的应用程序代码的测试来减少测试时间。
开发合作伙伴 DevPartner 使开发人员能够分析 Java 代码质量和复杂度。
艾玛 EMMA 支持类、方法、行和基本块覆盖率,并按源文件、类和方法级别进行聚合。
卡利斯蒂克 Kalistick 是一款第三方应用程序,它可以从不同角度分析代码。
CoView 和 CoAnt 一款用于指标、模拟对象创建、代码可测试性、路径和分支覆盖率等的代码覆盖率工具。
靶心 C++ BullseyeCoverage 是一款代码覆盖率工具,适用于 C++ 和C.
声纳 Sonar 是一款开源代码覆盖率工具,可帮助您管理代码质量。

使用的优点和缺点 Code 保障范围

优势 缺点
有助于对代码覆盖率进行定量评估。 即使设计中没有实现某个特定功能,代码覆盖率仍然会显示 100% 的覆盖率。
允许您创建额外的测试用例以提高测试覆盖率。 使用代码覆盖率无法确定是否已测试了某个功能的所有可能值。
允许您查找程序中未被一组测试用例执行到的区域。 Code 覆盖率并不能说明你的逻辑覆盖了多少以及覆盖得如何。

常见问题

许多团队将 70% 到 80% 的实现率作为切实可行的目标。追求 100% 的实现率很少具有成本效益。与其追求整个代码库的单一实现率,不如将重点放在覆盖关键的高风险逻辑上。

不。全面覆盖证明的是每一行代码都执行了,而不是每个输入、值或需求都得到了验证。逻辑错误和缺失的功能仍然可能未被检测到,因此覆盖率是对良好测试设计的补充,而不是替代。

Code 代码覆盖率衡量的是测试期间执行的源代码量。测试覆盖率的范围更广。 trac衡量测试对需求、功能和风险的满足程度。 Code 测试覆盖率是整体测试覆盖率的一个输入参数。

不。即使某些分支(例如缺少 else 分支)未经过测试,你仍然可以达到 100% 的语句覆盖率。分支(决策)覆盖率更强,因为它包含了语句覆盖率,并且会测试所有可能的结果。

人工智能会分析源代码和现有测试,以精确定位未经测试的高风险路径,然后建议或生成新的测试用例。机器学习还会确定运行哪些测试的优先级,从而缩短反馈时间,同时保持……ping 覆盖率高。

是的。像 Diffblue Cover 这样的 AI 工具可以扫描代码,并自动为未覆盖的逻辑编写单元测试。它们会重点关注风险较高的分支和条件,从而以更少的人工干预提高代码覆盖率。

OpenClover 衡量语句、分支和方法覆盖率,并收集 20 多个指标。 Cobertura艾玛,以及 JaCoCo 还有其他一些广泛使用的免费选项 Java 项目。

修改后的条件/决策覆盖范围要求决策中的每个条件都能独立地影响结果。它比分支覆盖范围更为严格,并且根据 DO-178C 标准,安全关键型软件(例如航空电子设备)必须采用此标准。

总结一下这篇文章: