什么是循环测试?方法论,示例

⚡ 智能摘要

循环测试验证程序内部的循环结构,检查跳过循环、进入循环一次、在循环边界执行循环以及将循环次数推至最大允许次数之外一次时会发生什么情况。

  • 🔘 定义: 一种旨在提高循环有效性的白盒控制结构技术,而不是针对屏幕。
  • 🔁 四类: 简单循环、嵌套循环、连接循环和非结构化循环都需要各自的策略。
  • 📍 三个检查点: 进入循环、执行期间的行为以及退出条件。
  • 🧪 边界通行证: 0、1、2,一个典型的计数,然后是 b-1、b 和 b+1 次迭代。
  • 🪜 嵌套订单: 从最内圈开始,尽量减少外圈的圈数,然后向外编织。
  • 🐞 发现缺陷: 差一限制、未初始化的计数器、无限循环和容量瓶颈。
  • ⚠️ 局限性: 循环错误存在于底层代码中,一旦被发现,往往很难被察觉。

循环测试方法论、循环类型和示例测试用例

什么是环路测试?

回路测试 是一种软件测试类型,它完全专注于程序中循环结构的有效性。它是控制结构测试的一部分,与控制结构测试并列。 路径测试数据验证测试和条件测试。

环路测试是 白盒测试 因此,这种技术需要由能够阅读源代码并了解循环条件、计数器和退出路径的人员来执行。测试人员不会根据用户界面猜测程序行为;循环本身就是被测对象。

下图显示了回路测试在控制结构测试系列中的位置。

回路测试是控制结构测试的一个分支

测试的环路类型

在选择策略之前,请先确定您要考虑的是四种循环类型中的哪一种。已测试的循环类型示例包括:

  • 简单循环 — 一个只有一个入口和一个出口的单环路,例如一条普通的环形路 HPMC胶囊, 而 or 在做 构造。
  • 嵌套循环 — 一个循环放在另一个循环里面,因此内循环在外循环每次执行时都会完成。
  • 串联循环 — 两个或多个循环按顺序依次运行。
  • 非结构化循环 — 嵌套和连接循环的意外组合,通常是跳入或跳出循环体的结果。

代码的复杂程度决定了开发难度。一个简单的循环只需要几次迭代;而一个非结构化的循环通常需要重新设计代码才能进行测试。

为什么要做环路测试?

进行环路测试的原因如下

  • 测试可以修复循环重复问题
  • 循环测试可以揭示性能和容量瓶颈。
  • 通过测试循环,可以确定循环中未初始化的变量。
  • 它有助于识别循环初始化问题。

此外,还有商业上的原因。循环执行次数过多会导致总数计算错误;循环永不终止会导致进程挂起。这两种缺陷在代码仍在开发人员机器上时很容易发现,但在生产环境中发现则成本高昂。

如何进行环路测试:完整的方法论

测试循环时,必须在三个不同层面上进行检查:

  • 当进入循环时
  • 在执行过程中,以及
  • 当循环结束

所有这些循环的测试策略如下。

简单循环

一个简单的循环只有一个入口和一个出口,如下图所示。

具有一个入口点和一个出口点的简单循环流程图

简单循环的测试方式如下:

  1. 跳过整个循环
  2. 循环一次
  3. 循环 2 次
  4. 品牌 a 穿过循环, a < b这是一个典型的中等迭代次数。
  5. 品牌 b, b-1和 b+1 通过循环,其中 b 是循环允许的最大遍历次数。

最后两个案例最有价值。跳过ping 循环证明了在程序运行之前已经评估了退出条件,并且 b+1 案例证明循环拒绝超出其声明的限制,而不是超出数组范围。

嵌套循环

嵌套循环会增加可能的迭代组合数量,因此它是从内到外进行测试,而不是一次性全部测试。

嵌套循环流程图,内循环被外循环包围

对于嵌套循环,您需要按照以下步骤操作。

  1. 将所有其他循环的值设置为最小值,并从最内层循环开始。
  2. 对于最内层循环,执行简单循环测试并将外层循环保持在其最小迭代参数值
  3. 对下一个循环执行测试,并逐步向外推进。
  4. 继续,直到最外层循环测试完毕。

连接循环

如图所示,串联循环在同一执行路径中依次排列。

串联循环流程图,显示两个循环按顺序执行。

在串联循环中,如果两个循环彼此独立,则使用简单循环方法进行测试;否则,使用嵌套循环方法进行测试。

但是,如果将一个循环的循环计数器用作另一个循环的初始值,则这两个循环不被认为是独立的。

非结构化循环

非结构化循环是最难处理的,因为控制流会在任意点跳入和跳出循环体。

带控制跳转的非结构化循环流程图ping 进入和离开环体

对于非结构化循环,必须重构设计以体现结构化编程结构的使用。一旦代码简化为简单、嵌套或连接的形式,上述匹配策略即可适用。

循环测试示例及测试用例

一个实际的例子可以具体说明迭代次数。考虑一个例程,它将运行结果乘以 1 到 10 之间的每个整数。 n进行阶乘计算。循环计数器从 1 开始,退出条件为 对付 > n并且,循环被声明为最多接受 12 次循环,之后结果将超出声明的整数类型。

将此视为一个简单的循环,上述推荐的迭代次数可转化为以下形式。 测试用例.

测试用例 n 的值 执行的通道 它证明了什么
TC01 0 0(跳过循环) 在程序运行之前评估退出条件,结果保持其初始值 1。
TC02 1 1 单次运行即可产生正确结果,计数器加一。
TC03 2 2 累加器会在两次连续的迭代之间将值向前传递。
TC04 5 5 典型的中等范围计数结果为预期的 120,证实了正常行为。
TC05 11 11 比最大值低一次的遍数仍然可以正常完成(b1)。
TC06 12 12 接受声明的最大值,循环终止(b).
TC07 13 拒绝 超过最大值一次的传递会被拒绝,而不是默默地溢出(b+ 1)。

请注意,TC01 和 TC07 是开发者最常忽略的两种情况,而这两种情况恰恰暴露了跳过初始化和溢出缺陷。负值 n 如果规范允许提供,则应将其放在同一集合中,这将循环测试与……联系起来 负面测试.

循环测试发现的常见缺陷

循环测试不断发现同一小类故障,因此每次都运行固定的迭代次数是值得的。

  • 差一边界 — 一个写成 < 协调 <= 这是预期行为,所以循环运行的次数要么少了一次,要么多了一次。
  • 未初始化的计数器或累加器 — 包含上次调用后剩余值的总数。
  • 无限循环 — 循环体永远无法满足的退出条件,因为计数器只在某些分支上更新。
  • 跳环假设 — 循环之后的代码读取循环体预期设置的变量,当循环运行零次时,该代码会失败。
  • 容量和性能故障 — 一个循环虽然正确,但每次循环都会重新读取数据库,因此成本会随着迭代次数的增加而增加。
  • 嵌套环路干扰 — 一个内部循环,它重用外部循环计数器,并悄悄地更改外部迭代计数。

由于每个故障都对应特定的迭代次数,因此与在更高迭代次数下发现的缺陷相比,这里出现的缺陷更容易重现且修复速度更快。 测试水平.

回路测试与其他控制结构测试技术

循环测试是控制结构家族中的一种成员,很容易与相邻的技术混淆。下表对它们进行了区分。

技术 它的目标 典型覆盖目标
循环测试 循环结构:入口点、迭代次数和退出点 每次循环的迭代次数分别为零次、一次、典型迭代次数和边界迭代次数
状况测试 决策中的布尔表达式 每个条件都进行了真假评估
数据流测试 各变量的定义和用途 每个定义与用法的组合都至少被执行过一次
基础路径测试 控制流图中的独立路径 路径数等于环路复杂度

实际上,这些技术是互补的,而不是相互竞争的。 圈复杂度 它会告诉你存在多少条独立路径,基础路径测试会覆盖这些路径,而循环测试则会添加仅靠路径覆盖无法强制执行的迭代次数。所有这些都是 动态测试 因为必须执行代码才能观察到结果,所以需要进行一些活动。

循环测试的局限性

该技术有其局限性,了解这些局限性可以防止过度投入。

  • 循环错误主要出现在低级软件中
  • 循环测试期间发现的错误并不是很微妙
  • 许多漏洞可能被操作系统检测到,因为它们会导致内存边界违例、可检测的指针错误和类似故障。
  • 识别每个循环的类别并进行相应的测试需要时间,这对于风险很小的代码路径来说很难证明其合理性。

常见问题

开发人员和技术测试人员通常拥有源代码访问权限,并在测试期间进行测试。 单元测试 或者代码审查。业务测试人员无法应用它,因为循环条件对用户界面是不可见的。

模型读取循环条件,并自动给出零次、一次、典型迭代次数和边界迭代次数,包括溢出情况。审核人员仍需确认每个预期结果是否符合规范。

由于迭代模式是公式化的,因此它可以快速生成测试用例。智能助手还可以运行测试用例并报告哪些计数失败,但决定最大允许通过次数仍然是由人来设计的。

在超时或迭代保护机制下运行测试用例,以便测试快速失败,而不是导致测试套件挂起。断言应基于记录的测试次数,而不仅仅是最终输出值。

远少于所有组合。由内而外的测试方法能使各层级的计数大致相加,而不是相乘,因为外层循环被固定在最小值,而内层循环则被执行。

目前还没有专门的工具可以实现这一点。团队通常会结合使用单元测试框架,例如…… JUnit 或者使用带有分支覆盖率报告工具的 pytest,然后读取报告以确认是否达到了零迭代路径。

不。分支覆盖率只要循环进入并退出一次即可满足要求。循环测试还要求统计跳过的循环次数和边界计数,而分支覆盖率本身并不能做到这一点。

每当它不结构化时——控制跳转ping 进入或离开主体。将结构简化为简单的嵌套或连接形式,比为每个不规则入口点设计测试成本更低。

总结一下这篇文章: