什么是循环测试?方法论,示例
什么是环路测试?
回路测试 是一种软件测试类型,它完全专注于程序中循环结构的有效性。它是控制结构测试的一部分,与控制结构测试并列。 路径测试数据验证测试和条件测试。
环路测试是 白盒测试 因此,这种技术需要由能够阅读源代码并了解循环条件、计数器和退出路径的人员来执行。测试人员不会根据用户界面猜测程序行为;循环本身就是被测对象。
下图显示了回路测试在控制结构测试系列中的位置。
测试的环路类型
在选择策略之前,请先确定您要考虑的是四种循环类型中的哪一种。已测试的循环类型示例包括:
- 简单循环 — 一个只有一个入口和一个出口的单环路,例如一条普通的环形路 HPMC胶囊, 而 or 在做 构造。
- 嵌套循环 — 一个循环放在另一个循环里面,因此内循环在外循环每次执行时都会完成。
- 串联循环 — 两个或多个循环按顺序依次运行。
- 非结构化循环 — 嵌套和连接循环的意外组合,通常是跳入或跳出循环体的结果。
代码的复杂程度决定了开发难度。一个简单的循环只需要几次迭代;而一个非结构化的循环通常需要重新设计代码才能进行测试。
为什么要做环路测试?
进行环路测试的原因如下
- 测试可以修复循环重复问题
- 循环测试可以揭示性能和容量瓶颈。
- 通过测试循环,可以确定循环中未初始化的变量。
- 它有助于识别循环初始化问题。
此外,还有商业上的原因。循环执行次数过多会导致总数计算错误;循环永不终止会导致进程挂起。这两种缺陷在代码仍在开发人员机器上时很容易发现,但在生产环境中发现则成本高昂。
如何进行环路测试:完整的方法论
测试循环时,必须在三个不同层面上进行检查:
- 当进入循环时
- 在执行过程中,以及
- 当循环结束
所有这些循环的测试策略如下。
简单循环
一个简单的循环只有一个入口和一个出口,如下图所示。
简单循环的测试方式如下:
- 跳过整个循环
- 循环一次
- 循环 2 次
- 品牌 a 穿过循环, a < b这是一个典型的中等迭代次数。
- 品牌 b, b-1和 b+1 通过循环,其中 b 是循环允许的最大遍历次数。
最后两个案例最有价值。跳过ping 循环证明了在程序运行之前已经评估了退出条件,并且 b+1 案例证明循环拒绝超出其声明的限制,而不是超出数组范围。
嵌套循环
嵌套循环会增加可能的迭代组合数量,因此它是从内到外进行测试,而不是一次性全部测试。
对于嵌套循环,您需要按照以下步骤操作。
- 将所有其他循环的值设置为最小值,并从最内层循环开始。
- 对于最内层循环,执行简单循环测试并将外层循环保持在其最小迭代参数值
- 对下一个循环执行测试,并逐步向外推进。
- 继续,直到最外层循环测试完毕。
连接循环
如图所示,串联循环在同一执行路径中依次排列。
在串联循环中,如果两个循环彼此独立,则使用简单循环方法进行测试;否则,使用嵌套循环方法进行测试。
但是,如果将一个循环的循环计数器用作另一个循环的初始值,则这两个循环不被认为是独立的。
非结构化循环
非结构化循环是最难处理的,因为控制流会在任意点跳入和跳出循环体。
对于非结构化循环,必须重构设计以体现结构化编程结构的使用。一旦代码简化为简单、嵌套或连接的形式,上述匹配策略即可适用。
循环测试示例及测试用例
一个实际的例子可以具体说明迭代次数。考虑一个例程,它将运行结果乘以 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 如果规范允许提供,则应将其放在同一集合中,这将循环测试与……联系起来 负面测试.
循环测试发现的常见缺陷
循环测试不断发现同一小类故障,因此每次都运行固定的迭代次数是值得的。
- 差一边界 — 一个写成 < 协调 <= 这是预期行为,所以循环运行的次数要么少了一次,要么多了一次。
- 未初始化的计数器或累加器 — 包含上次调用后剩余值的总数。
- 无限循环 — 循环体永远无法满足的退出条件,因为计数器只在某些分支上更新。
- 跳环假设 — 循环之后的代码读取循环体预期设置的变量,当循环运行零次时,该代码会失败。
- 容量和性能故障 — 一个循环虽然正确,但每次循环都会重新读取数据库,因此成本会随着迭代次数的增加而增加。
- 嵌套环路干扰 — 一个内部循环,它重用外部循环计数器,并悄悄地更改外部迭代计数。
由于每个故障都对应特定的迭代次数,因此与在更高迭代次数下发现的缺陷相比,这里出现的缺陷更容易重现且修复速度更快。 测试水平.
回路测试与其他控制结构测试技术
循环测试是控制结构家族中的一种成员,很容易与相邻的技术混淆。下表对它们进行了区分。
| 技术 | 它的目标 | 典型覆盖目标 |
| 循环测试 | 循环结构:入口点、迭代次数和退出点 | 每次循环的迭代次数分别为零次、一次、典型迭代次数和边界迭代次数 |
| 状况测试 | 决策中的布尔表达式 | 每个条件都进行了真假评估 |
| 数据流测试 | 各变量的定义和用途 | 每个定义与用法的组合都至少被执行过一次 |
| 基础路径测试 | 控制流图中的独立路径 | 路径数等于环路复杂度 |
实际上,这些技术是互补的,而不是相互竞争的。 圈复杂度 它会告诉你存在多少条独立路径,基础路径测试会覆盖这些路径,而循环测试则会添加仅靠路径覆盖无法强制执行的迭代次数。所有这些都是 动态测试 因为必须执行代码才能观察到结果,所以需要进行一些活动。
循环测试的局限性
该技术有其局限性,了解这些局限性可以防止过度投入。
- 循环错误主要出现在低级软件中
- 循环测试期间发现的错误并不是很微妙
- 许多漏洞可能被操作系统检测到,因为它们会导致内存边界违例、可检测的指针错误和类似故障。
- 识别每个循环的类别并进行相应的测试需要时间,这对于风险很小的代码路径来说很难证明其合理性。





