你可以向测试场景中添加流程控制条件(循环、条件、等待、分组等)。这可以提升更复杂测试场景/流程配置的利用率,最终通过自动化测试功能解决复杂场景的测试难题。For 循环#
当你需要连续多次发送单个请求时,使用 for 循环是一种高效的方法。以下是在 Apidog 测试场景中有效使用 for 循环的方法:设置迭代次数:决定循环应运行多少次。这可以是固定数字,也可以是 {{variable}}。
添加请求:在 for 循环中,你可以包含一个或多个请求,也可以包含其他循环或条件分支。这种灵活性允许构建复杂的测试场景,在其中需要按顺序测试多个操作。
Break If 条件:你可以向 for 循环添加 Break if 条件。如果条件满足,循环将立即终止。你可以拖拽并调整 Break if 的位置,甚至添加多个 Break if 条件来处理不同场景。
On Error 处理:通过向循环添加 On Error 条件来管理错误。如果发生错误,将触发指定操作:继续:跳过当前循环周期中的剩余请求,并进入下一次迭代。
结束执行:完全停止整个测试场景。
On Error 条件固定在循环开头,无法移 动。
在请求中使用循环索引#
当前循环索引可以在请求中用作局部变量,以动态调整参数或请求主体。使用方法如下:2
点击请求参数中的魔法棒图标
🪄,并选择“获取前置步骤数据”。
“获取前置步骤数据”功能仅在“测试”模块中可用,在“APIs”模块中不可用。
使用“获取前置步骤数据”时,只有在整个测试场景一起运行时才能获取该值;运行单个步骤时无法访问。
5
你将获得类似
{{$.5.index}} 的动态变量。点击“插入”,运行时它会被替换为当前循环的索引,例如
0 或
5。
ForEach 循环#
当你有一个包含多个元素的数组(特定内容列表或从前置步骤获取的列表),并且需要对列表中的每一项执行相同操作时(例如,先获取产品列表,然后将列表中的每个产品加入购物车),你需要使用 ForEach 循环。在 ForEach 循环中,循环内的操作会 针对数组中的每个元素执行。它与 For 循环的区别在于,你无需关心迭代次数;只需关注循环数组的内容。设置循环数组:在 ForEach 循环中,你需要设置一个数组作为循环对象。你可以使用变量,也可以手动输入数组,例如 ["a","b","c"]。
添加请求:在 ForEach 循环中,你可以添加一个或多个请求,或者添加其他循环或条件分支等。
Break If 条件和 On Error 处理:你可以向 ForEach 循环添加 Break if 和 On error,与上文提到的 for 循环一致。
在 ForEach 循环的高级设置中,你还可以为 Break If 和 On Error 自定义异常处理选项。更多信息请参见判断规则。
ForEach 使用示例#
假设有两个端点:一个用于获取宠物信息列表,另一个用于获取单个宠物的详情。如果你需要获取最近添加到列表中的某只宠物的详情,可以在自动化测试中使用 ForEach 循环设置此场景。1.
ForEach 循环外的第一步是请求宠物信息列表端点,以获取实际列表数据。通常,该接口的响应包含一个数组,其中包含多只宠物的基础信息,例如宠物 ID 和名称。
2.
设置一个 ForEach 循环,源数组为上一步响应中的宠物数组子集。
3.
在循环内,设置一个请求到“获取宠物信息”端点,并使用 ForEach 循环中的元素值填充该请求中的 ID 参数。
在请求中使用循环元素#
当前循环元素/索引可以在请求中用作局部变量,以动态调整参数或请求主体。使用方法如下:1
添加一个 ForEach 循环,并在循环中包含一个请求。
2
点击请求参数中的
魔法棒图标,并选择“获取前置步骤数据”。
3
选择循环选项,通常标记为“循环
{{array}} 中的每个元素”。
4
选择“当前循环元素”。你可以使用 JSONPath 提取元素的属性。
5
你将获得类似
{{$.17.element}} 的动态变量。点击“插入”,运行时它会被替换为当前循环的元素,该元素是循环数组中的一个元素。
当前循环元素:系统会自动从 ForEach 循环中指定的数组提取元素,并将其存储到指定变量中。在每次迭代开始时,该变量会更新为数组中当前元素的值。如果元素是对象,你可以使用 JSONPath 提取特定子字段,例如 {{$.1.element.data.name}}。当前循环索引:当前循环的索引存储在此变量中。它从 0 开始,并在每次后续迭代开始时递增 1,以反映当前索引。
当你需要根据不同场景发送不同请求时,可以使用 If 语句添加条件分支。当指定条件满足时,将执行对应步骤;否则将跳过。更具体的详细信息,请参阅判断规则。设置 If 语句:If 语句支持等于、不等于、包含、不包含等多种条件。条件两侧都可以使用常量和变量。
添加请求:可以在条件分支中添加多个请求,也可以添加其他循环或条件分支。
执行条件分支:如果配置中设置的条件满足,则执行测试步骤;否则跳过。
Else 语句:可以在条件分支中添加 Else 语句,用于处理 If 条件不满足的场景。
If 使用示例#
宠物店店主需要根据前一天宠物的销售状态,如果某只宠物已售出,则将其销售状态改为“已售出”。否则(else),需要查看仍在售宠物列表。2.
将从 API 请求响应中获得的变量 saleStatus 输入到“If”之后的输入框中,并选择条件“等于”。最后,输入 true 作为比较值。
3.
将鼠标悬停在条件分支操作上,可以看到“ + Else”选项。点击它以添加步骤“在售宠物列表”(用于条件不满足时,即查询仍在售宠物列表)。
判断规则#
在测试场景中使用 If 语句时,你可以定义条件规则来控制测试执行。如果条件满足,对应步骤将运行;否则将跳过。同样,在 ForEach 和 For 循环的 Break If 设置中,你可以设置判断规则,以更灵活地控制执行流程。| 规则 | 描述 |
|---|
| 等于 | 检查两个值是否相等。 |
| 不等于 | 检查两个值是否不相等。 |
| 存在 | 检查某个字段或变量是否存在。 |
| 不存在 | 检查某个字段或变量是否不存在。 |
| 小于 | 检查一个值是否小于另一个值。 |
| 小于或等于 | 检查一个值是否小于或等于另一个值。 |
| 大于 | 检查一个值是否大于另一个值。 |
| 大于或等于 | 检查一个值是否大于或等于另一个值。 |
| 匹配正则表达式 | 检查字符串是否匹配指定的正则表达式。 |
| 包含 | 检查字符串或数组是否包含指定值。 |
| 不包含 | 检查字符串或数组是否不包含指定值。 |
| 为空 | 检查字段、数组或变量是否为空。 |
| 不为空 | 检查字段、数组或变量是否不为空。 |
| 在列表中 | 检查某个值是否属于指定列表。 |
| 不在列表中 | 检查某个值是否不属于指定列表。 |
执行条件检查时(例如大于、大于或等于、等于或不等于),如果要比较的值是整数或字符串,系统会自动将字符串转换为数字以进行准确比较。例如,如果你将字符串 "18" 与数字 18 进行比较,系统会在比较前将字符串 "18" 转换为数字 18。检查两个值是否相等。如果相等,则条件满足并执行测试步骤;否则将跳过。场景:检查从前置步骤提取的用户年龄是否等于 18。
条件示例:{{$.5.response.body.data.age}} Equals 18
实际执行效果:如果从前置步骤提取的年龄值为 18(字符串会自动转换为数字),则执行该步骤,例如显示特定信息或执行某些操作。
不等于#
检查两个值是否不相等。如果不相等,则条件满足并执行测试步骤;否则将跳过。场景:检查从前置步骤提取的订单状态是否不等于“Paid”。
条件示例:{{$.4.response.body.data.status}} Does not equal Paid
实际执行效果:如果从前置步骤提取的订单状态是其他值(例如“Pending”或“Shipped”),则执行该步骤。
检查某个字段或变量是否存在。如果存在,则条件满足并执行该步骤;否则将跳过。场景:检查从前置步骤提取的用户数据中是否存在 email 字段。
条件示例:{{$.3.response.body.data.email}} Exists
实际执行效果:如果从前置步骤提取的用户数据中存在 email 字段,则执行该步骤。
不存在#
检查某个字段或变量是否不存在。如果不存在,则条件满足并执行该步骤;否则将跳过。场景:检查从前置步骤提取的用户数据中是否不存在 phone 字段。
条件示例:{{$.2.response.body.data.phone}} Does not exist
实际执行效果:如果从 前置步骤提取的用户数据中缺少 phone 字段,则执行该步骤。
检查一个值是否小于另一个值。如果是,则条件满足并执行该步骤;否则将跳过。场景:检查从前置步骤提取的产品库存是否小于 10。
条件示例:{{$.1.response.body.data.stock}} Less Than 10
实际执行效果:如果从前置步骤提取的库存值为 8,则条件满足并执行该步骤。
小于或等于#
检查一个值是否小于或等于另一个值。如果是,则条件满足并执行该步骤;否则将跳过。场 景:检查从前置步骤提取的年龄是否小于或等于 12。
条件示例:{{$.2.response.body.data.age}} Less than or equal 12
实际执行效果:如果从前置步骤提取的年龄值为 10,则条件满足并执行该步骤。
检查一个值是否大于另一个值。如果是,则条件满足并执行该步骤;否则将跳过。场景:检查从前置步骤提取的订单金额是否大于 1000。
条件示例:{{$.1.response.body.data.amount}} Greater than 1000
实际执行效果:如果从前置步骤提取的订单金额值为 1105,则条件满足并执行该步骤。
大于或等于#
检查一个值是否大于 或等于另一个值。如果是,则条件满足并执行该步骤;否则将跳过。场景:检查从前置步骤提取的用户积分是否大于或等于 500。
条件示例:{{$.3.response.body.data.points}} Greater than or equal 500
实际执行效果:如果从前置步骤提取的积分值为 600,则条件满足并执行该步骤。
匹配正则表达式#
检查字符串是否匹配指定的正则表达式。如果匹配,则条件满足并执行该步骤;否则将跳过。条件示例:{{$.2.response.body.data.email}} Matches with Regex /^[a-z0-9._%+-]+@[a-z0-9.-]+\.[a-z]{2,}$/i
实际执行效果:如果从前置步骤提取的电子邮件格式匹配该正则表达式(例如 test@gmail.com),则执行该步骤。
正则表达式应使用“字面量”语法编写,即模式用 / 包裹,并可在末尾追加可选修饰符(例如 g 表示全局匹配,i 表示不区分大小写)。有关编写正则表达式的更多信息,你可以参考 MDN 文档。 检查字符串或数组是否包含指定值。如果包含,则条件满足并执行该步骤;否则将跳过。场景:检查从前置步骤提取的用户角色列表是否包含“admin”角色。
条件示例:{{$.3.response.body.data.roles}} Contains admin
实际执行效果:如果从前置步骤提取的角色列表包含“admin”,则执行该步骤。
不包含#
检查字符串 或数组是否不包含指定值。如果不包含,则条件满足并执行该步骤;否则将跳过。场景:检查从前置步骤提取的用户购物车是否不包含某个产品。
条件示例:{{$.4.response.body.data.cartItems}} Does not contain productId123
实际执行效果:如果从前置步骤提取的购物车数组不包含产品 productId123,则执行该步骤。
检查字段、数组或变量是否为空。如果为空,则条件满足并执行该步骤;否则将跳过。条件示例:{{$.2.response.body.data.remarks}} Is empty
实际执行效果:如果从前置步骤提取的备注字段为空,则执行该步骤。
不为空#
检查字段、数组或变量是否不为空。如果不为空,则条件满足并执行该步骤;否则将跳过。条件示例:{{$.1.response.body.data.orderRemarks}} Is not Empty
实际执行效果:如果从前置步骤提取的订单备注不为空,则执行该步骤。
在列表中#
检查某个值是否属于指定列表。如果属于,则条件满足并执行该步骤;否则将跳过。场景:检查从前置步骤提取的用户选择的产品是否在推荐产品列表中。
条件示例:{{$.3.response.body.data.productId}} In List ["prod123", "prod456", "prod789"]
实际执行效果:如果从前置步骤提取的产品 ID 是“prod456”,则执行该步骤。
在 Apidog 中,输入列表时,每个元素应单独输入,并通过按 Enter 键分隔。
不在列表中#
检查某个值是否不属于指定列表。如果不属于,则条件满足并执行该步骤;否则将跳过。场景:检查从前置步骤提取的用户输入的促销码是否不在已使用促销码列表中。
条件示例:{{$.4.response.body.data.promoCode}} Not in List ["usedCode1", "usedCode2"]
实际执行效果:如果从前置步骤提取的促销码是“newPromo”,则条件满足并执行该步骤;否则将跳过。
当测试流程中的多个步骤相互关联时,可以将它们分组在一起进行分类。通过对测试步骤进行分组,可以提升测试场景的可读性和可操作性。当测试流程中的某个步骤需要等待一段时间后再执行时,你可以添加等待条件来解决此问题。等待使用示例#
模拟用户查看宠物详情,并在浏览 1000ms 后更新宠物信息的浏览状态。当你使用测试流程控制时,测试报告不会显示 If、for 等步骤,而只会按执行顺序以线性方式列出实际执行的请求。