Apifox 帮助文档
帮助文档常见问题Apifox 官网私有化部署
开发者中心
  • 开放 API
  • 更新日志
  • Road Map
  • Apifox Markdown
下载
  • 下载 Apifox
  • 下载 IDEA 插件
  • 下载浏览器扩展
  • Apifox Web 版
帮助文档常见问题Apifox 官网私有化部署
开发者中心
  • 开放 API
  • 更新日志
  • Road Map
  • Apifox Markdown
下载
  • 下载 Apifox
  • 下载 IDEA 插件
  • 下载浏览器扩展
  • Apifox Web 版
  1. 编排测试场景
  • 帮助中心
  • 更新日志
  • 入门
    • 产品介绍
    • 联系我们
    • 私有化部署
  • 开始使用
    • 下载 Apifox
    • 注册与登录
    • 页面布局
    • 基本概念
    • 快速上手
      • 概述
      • 新建接口
      • 发送接口请求
      • 快捷请求
      • 添加断言
      • 新建测试场景
      • 分享 API 文档
      • 了解更多
    • 基础知识
      • 接口基本信息
        • 请求 URL 与方法
        • 请求参数与请求体
        • 请求头
        • 请求参数编码解码
        • HTTP/2
      • 认证与授权
        • 概述
        • 支持的授权类型
        • Digest Auth
        • OAuth 1.0
        • OAuth 2.0
        • Hawk Authentication
        • Kerberos
        • NTLM
        • Akamai EdgeGrid
        • CA 和客户端证书
      • 响应与 Cookie
        • 概述
        • API 响应
        • 创建和发送 Cookie
        • 实际请求
        • 提取响应示例
      • 请求代理
        • 网页端中的请求代理
        • 分享文档中的请求代理
        • 客户端中的请求代理
      • API Hub
        • API Hub
    • 导入导出数据
      • 概述
      • 手动导入
      • 定时导入
      • 导入设置
      • 导出数据
      • 其它方式导入
        • 导入 OpenAPI/Swagger
        • 导入 Postman
        • 导入 Apipost
        • 导入 Eolink
        • 导入 cURL
        • 导入 Markdown
        • 导入 Insomnia
        • 导入 apiDoc
        • 导入 .har 文件
        • 导入 knife4j
        • 导入 NEI
        • 导入小幺鸡(docway)
        • 导入 Apizza
        • 导入 WSDL
  • 设计 API
    • 概述
    • 新建 API 项目
    • 接口基础知识
    • 请求体多示例配置
    • 响应组件
    • 常用字段
    • 全局参数
    • 历史记录
    • 批量管理
    • 数据模型
      • 概述
      • 新建数据模型
      • 通过 JSON 等生成
      • 高级数据类型
      • 构建数据模型
    • 鉴权组件
      • 概述
      • 创建鉴权组件
      • 使用鉴权组件
      • 在线文档中的鉴权组件
    • 高级功能
      • 接口字段
      • 接口状态
      • 关联测试场景
      • 参数列表外观
      • 接口唯一标识
  • 开发和调试 API
    • 概述
    • 生成请求
    • 发送请求
    • 请求历史
    • 接口用例
    • 动态值
    • 校验响应
    • 文档模式/调试模式
    • 生成代码
    • 环境和变量
      • 概述
      • 全局/环境/临时变量
      • 环境与服务
      • Vault Secrets(密钥库)
        • 功能简介
    • 前后置操作&脚本
      • 概述
      • 断言
      • 提取变量
      • 等待时间
      • 数据库操作
        • 概述
        • MongoDB
        • Redis
        • Oracle
      • 使用脚本
        • 概述
        • 前置脚本
        • 后置脚本
        • 公共脚本
        • pm 脚本 API
        • 使用 JS 类库
        • 响应数据可视化
        • 调用外部程序
      • 脚本示例
        • 断言示例
        • 脚本使用变量
        • 脚本读取/修改接口请求信息
      • 常见问题
        • 如何获取动态参数的真实值并加密?
        • 脚本运行后,提取的数字(bigint)精度丢失应该如何处理?
    • API 调试
      • GraphQL 调试
      • WebSocket 调试
      • Socket.IO 调试
      • SSE 调试
      • SOAP/WebService
      • gRPC 调试
      • 使用请求代理调试
      • Dubbo 调试
        • 新建 Dubbo 接口
        • 调试 Dubbo 接口
        • Dubbo 接口文档
      • TCP(Socket)
        • Socket 接口功能简介
        • 报文数据处理器
  • Mock 数据
    • 概述
    • 智能 Mock
    • 自定义 Mock
    • Mock 优先级
    • Mock 脚本
    • 云端 Mock
    • 自托管 Runner Mock
  • 自动化测试
    • 概述
    • 编排测试场景
      • 新建测试场景
      • 测试步骤间传递数据
      • 测试流程控制条件
      • 从接口/用例同步数据
      • 跨项目导入接口/用例
      • 导出测试场景数据
    • 运行测试场景
      • 运行测试场景
      • 批量运行测试场景
      • 数据驱动测试
      • 定时任务
      • 管理其它项目接口的运行环境
    • 测试报告
      • 测试报告
    • API 测试
      • 集成测试
      • 性能测试
      • 端到端测试
      • 回归测试
    • Apifox CLI
      • 概述
      • 安装和运行 CLI
      • CLI 命令选项
    • CI/CD
      • 概述
      • 与 Jenkins 集成
      • 与 Gitlab 集成
      • 与 Github Actions 集成
      • 与其它更多 CI/CD 平台集成
  • 发布 API 文档
    • 概述
    • 快捷分享
    • 查看 API 文档
    • 发布文档站
    • 页面布局设置
    • 自定义域名
    • AI 相关特性
    • 高级设置
      • 文档站搜索设置
      • 跨域代理
      • 文档站接入 Google Analytics
      • SEO 设置
      • 文档左侧目录设置
      • 文档可见性设置
      • 在线 URL 链接规范
    • API 版本
      • 创建 API 版本
      • 发布 API 版本
      • 快捷分享 API 版本
      • 功能简介
  • 迭代分支
    • 功能简介
    • 新建迭代分支
    • 在迭代分支中改动 API
    • 在迭代分支中测试 API
    • 合并迭代分支
    • 管理迭代分支
  • 管理中心
    • 入驻清单
      • 了解基本概念
      • 团队入驻
    • 管理团队
      • 团队基本操作
      • 团队成员管理
      • 成员角色与权限设置
      • 团队资源
        • 通用 Runner
        • 请求代理 Agent
        • 团队变量
      • 实时协作
        • 团队协作
    • 管理项目
      • 项目基本操作
      • 项目成员管理
      • 通知设置
        • 功能简介
        • 通知对象
        • 通知事件
      • 项目资源
        • 数据库连接
    • 管理组织
      • 单点登录(SSO)
        • 功能简介
        • 为组织配置单点登录
        • 管理用户账号
        • 将组映射到团队
        • Microsoft Entra ID
      • SCIM 用户管理
        • 功能简介
        • Microsoft Entra ID
      • 组织资源
        • 自托管 Runner
  • IDEA 插件
    • 快速上手
    • 生成接口文档
    • 生成数据模型
    • 配置
      • 全局配置
      • 项目内配置
      • 可配置规则
      • 脚本工具
      • Groovy 本地扩展
    • 进阶配置
      • 注释规范说明
      • 框架支持
    • 常见问题
      • 常见问题
  • 浏览器扩展
    • Chrome
    • Microsoft Edge
  • Apifox MCP Server
    • 概述
    • 通过 MCP 使用 Apifox 项目内的 API 文档
    • 通过 MCP 使用公开发布的 API 文档
    • 通过 MCP 使用 OpenAPI/Swagger文档
  • 最佳实践
    • 概述
    • 接口之间如何传递数据
    • 登录态(Auth)如何处理
    • 接口签名如何处理
    • 如何加密/解密接口数据
    • Jenkins 定时触发任务
    • 如何计算 AI 问答成本
    • 与其他成员共用数据库连接配置
    • 通过 CLI 运行包含云端数据库连接配置的测试场景
    • 通过 Runner 运行包含云端数据库连接配置的测试场景
  • 账号&应用设置
    • 账号设置
    • 语言设置
    • 网络代理
    • 快捷键
    • 数据备份与恢复
    • 更新 Apifox
    • API 访问令牌
  • 身份验证 & Auth 鉴权指南
    • 什么是 API Key
    • 什么是 Bearer Token
    • 什么是 JWT
    • 什么是 Basic Auth
    • 什么是 Digest Auth
    • 什么是 OAuth 1.0
    • 什么是 OAuth 2.0
      • 什么是 OAuth 2.0
      • 授权码授权类型
      • 授权码授权类型,带有 PKCE
      • 隐式授权类型
      • 密码凭证授权类型
      • 客户端凭证授权类型
  • 服务与隐私协议
    • 服务协议
    • 隐私协议
    • 服务等级协议
  • 参考资料
    • API 设计优先理念
    • JSON Schema 介绍
    • JSONPath 介绍
    • XPath 介绍
    • Apifox Markdown 语法
    • CSV 格式规范
    • 正则表达式
    • 安装 Java 环境
    • Runner 运行环境
    • 常见编程语言对应的数据类型
    • Socket 粘包和分包问题
    • 词汇表
    • 目录链接汇总
    • Apifox Swagger 扩展
      • 概述
      • x-apifox-folder
      • x-apifox-status
      • x-apifox-name
      • x-apifox-maintainer
    • Apifox JSON Schema 扩展
      • 概述
      • x-apifox-mock
      • x-apifox-orders
      • x-apifox-enum
    • 动态值表达式
  • 常见问题
  1. 编排测试场景

测试流程控制条件

你可以在测试场景中新增流程控制条件(如循环、等待、分组),以满足更复杂的测试场景和流程配置需求,最终通过自动化测试功能解决复杂场景的测试任务。
image.png

分组#

当测试流程中的多个步骤存在关联时,可以将它们归类到同一个分组中。通过对测试步骤进行分组,提升测试场景的可读性和操作性。
示例: 将查询宠物详情、修改宠物信息、再次查看详情等步骤归类成分组。
操作方法:
1.
点击底部的按钮「添加步骤」,并选择「分组」。
2.
将要归类的步骤拖动到分组下,或直接在分组中添加新步骤。
image.png

ForEach 循环#

在 ForEach 循环中,可以根据指定数组的元素个数,循环执行编排内的所有步骤,循环次数等于数组内的元素数量。支持提取当前循环的元素值和索引值。
在循环的附加设置中,支持添加“中断条件”和“遇到错误时”的循环异常处理选项,关于中断条件的操作可参考判断规则模块。

ForEach 使用示例#

假设有两个接口:获取宠物信息列表和获取单个宠物详情。需求是查询刚刚添加到宠物列表中的宠物详情。以下操作将展示如何通过 ForEach 循环编排这个场景。
1.
获取宠物列表
循环外的第一步是请求“获取宠物信息列表”接口,获取实际的列表数据。通常,这类接口会返回一个包含多个宠物基本信息(如宠物 ID、名称)的数组。
image.png
2.
设置 ForEach 循环
在 ForEach 循环中,将数组来源设置为上一步响应结果中的宠物信息数组部分。示例中,可以通过 data[*].id 提取 data 中的所有 id 值作为数组。
image.png
3.
循环内设置接口请求
在循环内添加“获取宠物详情”接口请求,并在请求参数 ID 中使用 ForEach 循环(element)中的元素值。
image.png
4.
ForEach 循环执行示例
若从列表中返回了 3 个宠物信息(即数组内有 3 个元素),那么你可以在测试报告中看到**“获取宠物信息列表”接口执行了 3 次,每次实际请求的宠物 ID 值是对应“获取单个宠物详情”**真实返回的 3 个元素内的 ID 值。
image.png
运行 “测试报告” 后,可以在详情内看到实际请求的值和响应数据相一致。
image.png

当前循环 element#

系统自动将 ForEach 循环中设置的数组中的元素提取出来保存在此处指定的变量中。例如:{{$.1.element.data.name}}。每次循环开始时,会基于当前循环的数组素更新这个变量的实际值。如果元素是个对象,可以通过使用 JSONPath 来提取对象中的某个子级字段。
可以使用动态值功能可视化插入循环元素。
image.png
除了可以通过动态值交互框进行可视化提取外,同样支持使用变量表达式。
如果你需要在自定义脚本中获取此变量后进一步处理,可以使用例如pm.variables.get("$.1.element")来获取当前循环元素的实际值。
在自定义脚本界面右边有提供代码片段可以快速插入获取变量脚本。
image.png

当前循环 index#

当前循环的索引值,会保存在此变量中。例如:{{$.1.index}}。第一次循环开始时,这个索引值为 0,之后每次循环开始时会 +1 更新值。
可以通过动态值交互框进行可视化提取,也同样支持使用变量表达式。
如果你需要在自定义脚本中获取此变量后进一步处理,可以使用例如pm.variables.get("$.1.index")来获取当前循环元素的实际值。

For 循环#

当测试步骤需要重复执行时,可以指定相应的循环次数重复执行。在循环的附加设置中,支持添加“中断条件”和“遇到错误时”的循环异常处理选项,关于中断条件的操作可参考判断规则模块。

使用示例#

宠物店 IT 管理员登录宠物库存管理后台,将今日出售的 10 个宠物的在售状态自动批量变更为已售出。
1.
点击底部的按钮“添加步骤”,并选择“循环”。
2.
在循环次数中输入 10 次。
image.png
3.
将和宠物信息有关的接口拖入该条件下内框中,或直接在该条件下直接添加测试步骤。
image.png

当前循环 index#

当前循环的索引值,会保存在此变量中。例如:{{$.1.index}}。第一次循环开始时,这个索引值为 0,之后每次循环开始时会 +1 更新值。
可以通过动态值功能可视化插入循环元素。
image.png
如果你需要在自定义脚本中获取此变量后进一步处理,可以使用例如pm.variables.get("$.1.index")来获取当前循环元素的实际值。
在自定义脚本界面右边有提供代码片段可以快速插入获取变量脚本。
image.png

条件分支#

在测试流程中,如果存在多条件判断,可以通过添加条件分支(If 语法)来区分执行的步骤。当满足设定条件时,该条件下的子步骤会执行;否则,子步骤将被跳过。具体可参考判断规则模块。
示例: 宠物店店主根据昨日的宠物出售情况进行判断。如果宠物已售出,则将其出售状态设置为“已售出”;否则,查询在售中的宠物列表。
1.
点击测试步骤上的+按钮,并选择「条件分支」。
2.
在 If 条件后的输入框中填写请求接口得到的变量 saleStatus,选择条件为“等于”,并输入比较值 true(即判断销售状态是否为 true,若是,则更改宠物信息为“已售出”)。
3.
将鼠标悬浮在条件分支操作栏上,点击出现的+ Else按钮,新增“出售中的宠物列表”步骤(否则,查询在售中的宠物列表)。
4.
将测试步骤拖入相应的条件分支中。
image.png

判断规则#

在使用 If 条件分支时,可以设置判断规则,满足规则后执行子步骤,否则跳过。在 ForEach 和 For 循环的“中断条件”中,同样可以设置判断规则,以便灵活控制流程的执行。
规则说明
等于判断两个值是否相等。
不等于判断两个值是否不相等。
存在判断字段或变量是否存在。
不存在判断字段或变量是否不存在。
小于判断一个值是否小于另一个值。
小于或等于判断一个值是否小于或等于另一个值。
大于判断一个值是否大于另一个值。
大于或等于判断一个值是否大于或等于另一个值。
正则匹配判断字符串是否符合指定的正则表达式。
包含判断字符串或数组中是否包含指定的值。
不包含判断字符串或数组中是否不包含指定的值。
为空判断字段、数组或变量是否为空。
不为空判断字段、数组或变量是否不为空。
属于集合判断某个值是否属于指定的集合。
不属于集合判断某个值是否不属于指定的集合。
在进行条件判断(例如大于、大于等于、等于或不等于)时,如果比较的值是整型或字符串,系统会自动将字符串转换为数字,以便进行准确的比较。例如,如果你比较一个字符串 "18" 与数字 18,系统会将字符串 "18" 转换为数字 18,然后进行比较。

等于#

判断两个值是否相等。如果相等,条件成立,执行子步骤;否则,跳过。
示例:
场景:判断“前置步骤”获取的用户信息中的年龄是否等于 18 岁。
条件设置示例:{{$.5.resopnse.body.data.age}} 等于 18
实际执行效果:如果从“前置步骤”的响应中提取的年龄字段值为 18(字符串会自动转换为数字),则执行后续子步骤,如显示特定信息或执行特定操作。

不等于#

判断两个值是否不相等。如果不相等,条件成立,执行子步骤;否则,跳过。
示例:
场景:判断“前置步骤”获取的订单状态是否不等于“已支付”。
条件设置示例:{{$.4.response.body.data.status}} 不等于 已支付
实际执行效果:如果“前置步骤”提取到的订单状态为其他值(如“待支付”或“已发货”),则执行子步骤。

存在#

判断某个字段或变量是否存在。如果存在,条件成立,执行子步骤;否则,跳过。
示例:
场景:检查“前置步骤”获取的用户数据中是否存在email字段。
条件设置示例:{{$.3.response.body.data.email}} 存在
实际执行效果:如果“前置步骤”提取的用户数据中有email字段,则执行子步骤。

不存在#

判断某个字段或变量是否不存在。如果不存在,条件成立,执行子步骤;否则,跳过。
示例:
场景:检查“前置步骤”获取的用户数据中是否没有phone字段。
条件设置示例:{{$.2.response.body.data.phone}} 不存在
实际执行效果:如果“前置步骤”提取到的用户数据中没有phone字段,则执行子步骤。

小于#

判断某个值是否小于另一个值。如果小于,条件成立,执行子步骤;否则,跳过。
示例:
场景:判断“前置步骤”获取的商品库存是否小于 10。
条件设置示例:{{$.1.response.body.data.stock}} 小于 10
实际执行效果:“前置步骤”提取到的库存值为 8,判定通过,执行子步骤。

小于或等于#

判断某个值是否小于或等于另一个值。如果是,条件成立,执行子步骤;否则,跳过。
示例:
场景:判断“前置步骤”获取的用户年龄是否小于或等于 12 岁。
条件设置示例:{{$.2.response.body.data.age}} 小于或等于 12
实际执行效果:“前置步骤”提取的年龄值为 10,判定通过,执行子步骤。

大于#

判断某个值是否大于另一个值。如果大于,条件成立,执行子步骤;否则,跳过。
示例:
场景:判断“前置步骤”获取的订单金额是否大于 1000 元。
条件设置示例:{{$.1.response.body.data.amount}} 大于 1000
实际执行效果:“前置步骤”提取的订单金额值为 1105 元,判定通过,执行子步骤。

大于或等于#

判断某个值是否大于或等于另一个值。如果是,条件成立,执行子步骤;否则,跳过。
示例:
场景:判断“前置步骤”获取的用户积分是否大于或等于 500 分。
条件设置示例:{{$.3.response.body.data.points}} 大于或等于 500
实际执行效果:“前置步骤”提取的积分值为 600,判定通过,执行子步骤。

正则匹配#

判断字符串是否匹配指定的正则表达式。如果匹配,条件成立,执行子步骤;否则,跳过。
示例:
场景:判断“前置步骤”获取的邮箱格式是否正确。
条件设置示例:{{$.2.response.body.data.email}} 正则匹配 /^[a-z0-9._%+-]+@[a-z0-9.-]+\.[a-z]{2,}$/i
实际执行效果:如果“前置步骤”提取的邮箱格式符合正则表达式(例如test@gmail.com),则执行子步骤。
正则表达式应使用“字面量”表示,字面量的正则表达式是由 / 包围的正则模式,并且可以在末尾添加修饰符(如 g 表示全局匹配,i 表示不区分大小写等),不清楚如何写正则表达式的可以学一下这里的 MDN 文档。

包含#

判断字符串或数组中是否包含指定值。如果包含,条件成立,执行子步骤;否则,跳过。
示例:
场景:判断“前置步骤”获取的用户权限列表是否包含“admin”权限。
条件设置示例:{{$.3.response.body.data.roles}} 包含 admin
实际执行效果:如果“前置步骤”提取的权限列表中包含“admin”,则执行子步骤。

不包含#

判断字符串或数组中是否不包含指定值。如果不包含,条件成立,执行子步骤;否则,跳过。
示例:
场景:判断“前置步骤”获取的用户购物车中是否没有某个商品。
条件设置示例:{{$.4.response.body.data.cartItems}} 不包含 productId123
实际执行效果:如果“前置步骤”提取的购物车数组中不包含“productId123”商品,则执行子步骤。

为空#

判断字段、数组或变量是否为空。如果为空,条件成立,执行子步骤;否则,跳过。
示例:
场景:检查“前置步骤”获取的用户备注字段是否为空。
条件设置示例:{{$.2.response.body.data.remarks}} 为空
实际执行效果:如果“前置步骤”提取的备注字段为空,则执行子步骤。

不为空#

判断字段、数组或变量是否不为空。如果不为空,条件成立,执行子步骤;否则,跳过。
示例:
场景:检查“前置步骤”获取的订单备注是否填写。
条件设置示例:{{$.1.response.body.data.orderRemarks}} 不为空
实际执行效果:如果“前置步骤”提取的订单备注不为空,则执行子步骤。

属于集合#

判断某个值是否属于一个集合。如果属于,条件成立,执行子步骤;否则,跳过。
示例:
场景:判断“前置步骤”获取的用户选择的产品是否在推荐产品列表中。
条件设置示例:{{$.3.response.body.data.productId}} 属于集合 ["prod123", "prod456", "prod789"]
实际执行效果:“前置步骤”提取的产品 ID 为“prod456”,条件成立,执行子步骤。
在 Apifox 中,输入集合时,每个元素需单独输入,并通过按下回车键进行分隔。

不属于集合#

判断某个值是否不属于一个集合。如果不属于,条件成立,执行子步骤;否则,跳过。
示例:
场景:判断“前置步骤”获取的用户输入的优惠码是否未在已使用优惠码列表中。
条件设置示例:{{$.4.response.body.data.promoCode}} 不属于集合 ["usedCode1", "usedCode2"]
实际执行效果:如果“前置步骤”提取的优惠码为“newPromo”,条件成立,执行子步骤。

等待时间#

当测试流程中某个步骤需要执行后需要等待一段时间时,比如 A 步骤需要等待若干时间后再执行 B 步骤,可以通过新增等待条件来解决。

示例: 模拟用户查看宠物详情,浏览 1000ms 后,将该宠物详情信息中的浏览状态进行更新。
1.
点击底部的按钮「添加步骤」,并选择「等待时间」。
2.
输入需要等待的时间 1000(单位毫秒)。
image.png
修改于 2025-01-06 07:06:07
上一页
测试步骤间传递数据
下一页
从接口/用例同步数据
Built with