代码覆盖率教程(分支、语句、决策、FSM)


任何软件开发公司的最终目标都是提供高质量的软件。为了实现这一目标,必须对软件进行适当的测试。

因此,测试是软件开发过程中的一个重要方面。因此,至关重要的是,生成的软件必须由开发人员(在单元测试阶段)进行评估,然后交付给质量控制团队进行广泛测试,以确保其缺陷很少或没有缺陷。

在交付给实际测试团队进行测试之前,会对软件进行单元测试。此测试由开发人员完成,因为它涉及代码级别的测试。这样做是为了确保正在测试的每个代码组件都能正常工作。

代码覆盖率的定义是什么?

代码覆盖率是一种衡量指标,描述了程序源代码的测试覆盖程度。它是一种白盒测试,用于查找一组测试用例未测试到的软件部分。它还构建一些测试用例以提高覆盖率并确定定量的代码覆盖率度量。

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

为什么要进行代码覆盖率测试?

代码覆盖率非常重要,原因有很多,其中一些如下所示:

  • 与没有良好代码覆盖率的软件相比,它有助于确保软件具有更少的错误。

  • 它间接地帮助提供更好的“质量软件”,因为它有助于提高代码质量。

  • 它是一个可以用来确定测试有效性(为测试代码而编写的单元测试的有效性)的指标。

  • 它有助于识别源代码中可能未经探索的区域。

  • 它有助于确定当前测试(单元测试)是否足够,以及是否需要其他测试。

为什么要使用代码覆盖率?

以下是使用代码覆盖率的一些最令人信服的原因:

  • 它可以帮助您确定测试实施的有效性。

  • 它提供定量评估。

  • 它表明源代码的测试覆盖程度。

原始源代码结构

  • 取两个值,例如 a=0 和 b=1。

  • 计算这两个数字的总和。

  • 如果总和大于 0,则打印“这是正结果”。

  • 如果总和小于 0,则打印“这是负结果”。

方法

在本节中,我们将介绍用于衡量代码覆盖率的多种方法,这些方法正在/可以被使用。

为了了解这些方法,让我们看看下面的代码片段:

Add (int a, int b) {
   if (b > a) {
      b = b - a
      print b
   }
   if (a > b) {
      b = a – b
      print b
   }
   else print '0'
}

语句覆盖率

此方法是一种衡量指标,用于确定源代码中所有可能的可执行语句是否至少运行过一次。这是一种确保每行源代码至少测试一次的技术。

虽然这似乎是一项简单的任务,但在确定语句覆盖率时务必谨慎行事。原因是,根据输入值,源代码中的条件可能会或可能不会被执行。这意味着测试将不会覆盖所有代码行。因此,可能需要各种输入值集来覆盖源代码中的所有此类情况。

例如,在前面的源代码中,如果输入值为 2 和 3,则代码的“Else”部分将不会运行。另一方面,如果输入值为 3 和 2,则代码的“If”部分将不会运行。这意味着我们的语句覆盖率在这两种数据集中都不会达到 100%。在这种情况下,我们可能需要使用所有三组数据[(2, 3), (3, 2), (0, 0)]来运行测试,以确保 100% 的语句覆盖率。

函数覆盖率

顾名思义,此方法衡量了测试期间源代码中包含的函数的覆盖程度。在测试运行期间,测试源代码中的所有函数。同样,我们必须确保我们针对不同的值测试这些函数,以确保对函数进行了充分的测试。

源代码文件中可能有多个函数,并且根据提供的输入值,函数可能会或可能不会被调用。因此,函数覆盖率的目标是确保我们拥有所有必要的函数。

如果我们的测试在上面的源代码中即使只调用一次“Add”函数,我们将其称为完整的函数覆盖率。

条件覆盖率

在源代码中出现条件的地方,结果是真或假的布尔值。条件覆盖率的目标是查看测试是否涵盖了真值和假值。当源代码中出现的每个条件都针对真值和假值状态进行评估时,则称代码的条件覆盖率已完成。

例如,如果在以下代码中使用值集 (2, 3) 和 (4, 2),则条件覆盖率将为 100%。当使用数据集 (2, 3) 时,(b > a) 变为真,(a > b) 变为假。当使用数据集 (4, 2) 时,(b > a) 评估为假,但 (a > b) 评估为真。因此,这两个条件都涵盖了真值和假值。因此,条件覆盖率将为 100%。

分支覆盖率

此方法旨在确保源代码中执行每个条件结构的分支。例如,在前面的代码中,测试应涵盖所有“If”语句以及任何伴随的“Else”语句,以实现 100% 的分支覆盖率。

例如,如果在给定代码中使用值集 (2, 3)、(4, 2)、(1, 1),则分支覆盖率将为 100%。当使用数据集 (2, 3) 时,第一个“If”分支运行并 (b > a)。当使用数据集 (4, 2) 时,(a > b) 评估为真,这导致第二个“If”分支被执行。

然后,“Else”分支使用数据集 (1, 1) 评估为真并被执行。因此,确保了 100% 的分支覆盖率。

分支覆盖率的优势

以下是分支覆盖率测试的一些优势:

  • 允许您验证所有代码分支,确保它们都不会导致程序执行中的任何异常。

  • 分支覆盖率方法消除了由于语句覆盖率测试而产生的问题。

  • 允许您查找其他测试方法未涵盖的位置。

  • 它使您能够计算代码覆盖率的数值度量。

  • 分支覆盖率不考虑布尔表达式中的分支。

有限状态机的覆盖率

最困难的代码覆盖率方法类型是有限状态机覆盖率。这是因为它会影响设计的行为。此覆盖率方法要求您计算访问和转换的特定时间状态的数量。它还确定有限状态机包含多少个序列。

您应该选择哪种代码覆盖率?

毫无疑问,这是最难回答的问题。为了选择覆盖率方法,测试人员必须首先确保满足需求。

  • 被测代码中存在一个或多个未检测到的故障。

  • 潜在处罚的成本,

  • 声誉受损的成本,

  • 错失销售的成本,等等。

  • 导致代价高昂的生产故障的故障可能性越大,您应该选择的覆盖率范围就越大。

优势

如前所述,它是一个非常有价值的测试指标,原因如下:

  • 它有助于识别源代码中可能未经测试或未被测试发现的部分。

  • 它有助于识别已使用/无效代码,从而提高代码质量。

  • 代码覆盖率可用于确定单元测试的有效性。

  • 这些测量结果可用于交付更高质量的软件。

缺点

  • 即使设计中未实现某些功能,代码覆盖率仍然报告 100% 的覆盖率。

  • 代码覆盖率不允许我们判断是否测试了某个功能的所有可能值。

  • 此外,代码覆盖率并不表示您覆盖逻辑的程度或质量。

  • 当声明的功能未实现或未包含在规范中时,基于结构的方法无法检测到问题。

代码覆盖率工具

这是一个包含重要代码覆盖率工具的列表:

序号工具名称和描述
1Cobertura
这是一个免费使用的代码覆盖率工具。它通过检测代码库来分析测试套件运行时哪些代码行被执行以及哪些代码行未被执行,并估计测试覆盖率。
2Clover
Clover 还通过仅执行覆盖自上次构建以来已更改的应用程序代码的测试来缩短测试时间。
3DevPartner
开发人员可以使用 DevPartner 检查 Java 代码的代码质量和复杂度。
4Emma
EMMA 在类、方法、行和基本块级别以及聚合的源文件、类和方法级别提供覆盖率。
5Kalistick
Kalistick 是一款第三方应用程序,它从多个角度检查代码。
6CoView 和 CoAnt
Coding Software 是一款代码覆盖率工具,可用于度量、模拟对象创建、代码可测试性以及路径和分支覆盖率等。
7Bullseye for C++a
BulseyeCoverage 是一款 C++ 和 C 代码覆盖率工具。


8声纳
Sonar 是一款开源代码覆盖率工具,有助于代码质量管理。

摘要

  • 代码覆盖率是一个衡量指标,反映了程序源代码被测试的全面程度。

  • 它可以帮助您确定测试实施的有效性。

  • 有五种不同的方法可以衡量代码覆盖率。1.) 语句覆盖率 2.) 条件覆盖率 3) 分支覆盖率 4.) 切换覆盖率 5.) FSM覆盖率

  • 语句覆盖率需要至少运行一次源代码中的所有可执行语句。决策覆盖率给出每个布尔表达式的真或假结果。

  • 分支覆盖率会测试代码模块中的每个结果。

  • 将以这种方式评估条件语句中的变量或子表达式。

  • 有限状态机覆盖率是最困难的一种代码覆盖率方法。

  • 为了选择一种覆盖率方法,测试人员必须考虑潜在损失、声誉损失、销售损失和其他因素的成本。

  • 代码覆盖率表明您的测试平台对源代码的执行程度。术语“功能覆盖率”指的是设计的功能覆盖程度。

  • 最流行的代码覆盖率工具包括 Cobertura、JTest、Clover、Emma 和 Kalistick。

  • 您可以使用代码覆盖率为您的覆盖率添加更多测试用例。

  • 代码覆盖率不会告诉您我们是否测试了某个功能的所有可能值。

更新于: 2021年8月17日

3K+ 浏览量

开启您的 职业生涯

通过完成课程获得认证

开始
广告