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(密钥库)
        • 功能简介
    • 前后置操作&脚本
      • 概述
      • 断言
      • 提取变量
      • 等待时间
      • 数据库操作
        • 概述
        • MySQL
        • 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 相关特性
    • SEO 设置
    • 高级设置
      • 文档站搜索设置
      • 跨域代理
      • 文档站接入 Google Analytics
      • 文档左侧目录设置
      • 文档可见性设置
      • 在线 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 访问令牌
    • 语言设置
    • 快捷键
    • 网络代理
    • 数据备份与恢复
    • 更新 Apifox
    • 实验性功能
  • 身份验证 & 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. 最佳实践

Apifox 测试步骤之间怎么传递数据?

在使用 Apifox 编排自动化测试流程时,我们会接触到各种类型的测试步骤:接口请求、数据库查询、For 循环、ForEach 遍历、脚本处理等等。
这些测试步骤执行后产生的数据往往需要被下游步骤引用,作为下游步骤的输入条件,形成一个数据驱动 + 流程联动的自动化逻辑。
举个例子:你可能需要在前置步骤中获取用户 token,或查询数据库中的某条记录,然后将这些结果用于下一个测试步骤的调用。
那么这些上游步骤产生的数据,该如何在下游步骤中正确引用?

数据传递的两种机制#

在 Apifox 的自动化测试中,不同测试步骤之间的数据流转,通常有两种方式:

1. 通过「动态值」引用(即用即取)#

通过“动态值”功能,在下游测试步骤中直接读取上游步骤的数据。
通过“动态值”直接读取上游步骤的数据

2. 通过「变量」中转(先存后用)#

在上游步骤中通过“提取变量”将关键数据提取为变量,再供下游步骤使用。
通过“提取变量”将关键数据提取为变量
理解这两种传递方式,是掌握 Apifox 自动化测试的基础。
本文将从“如何提取数据”与“如何使用数据”两个角度出发,逐一拆解不同类型步骤的数据处理方法,帮助你灵活构建联动性更强的测试流程。
可以根据自己的实际需求,跳转至感兴趣的部分进行阅读!
1.
接口响应数据的提取与使用
2.
数据库查询结果的提取与使用
3.
For 循环中数据的提取与使用
4.
ForEach 循环中数据的提取与使用
5.
脚本中数据的设置与传递

1. 接口响应数据的提取与使用#

1.1 接口数据的特征#

在自动化测试中,接口请求执行后通常会返回结构化的 JSON 数据,这些响应数据是后续步骤的关键输入源,例如:
接口数据的特征
相比其他类型的步骤,接口数据的结构往往比较复杂,可能包含多层嵌套的对象和数组。

1.2 数据提取方式#

针对接口响应数据,我们通常采用两种方式来提取所需的数据,让其在测试步骤之间流转:

方式一:动态值引用#

你可以在下游步骤中,通过动态值语法直接引用前置接口的响应。在任意输入框中点击魔棒图标,选择读取前置步骤的运行结果,Apifox 会自动生成表达式,无需手动拼写。
通过动态值直接引用前置接口的响应

方式二:提取为变量#

你也可以在接口步骤中通过提取变量功能,将响应中的特定字段提取为变量。例如设置变量名称为products_id,JSONPath 为 $.products[0].id,那么在后续步骤中就可以直接使用 {{products_id}}来引用这个值。
在接口步骤中通过提取变量将响应中的特定字段提取为变量

1.3 数据使用场景#

接口响应数据通过上述动态值以及提取变量的方式来流转,在下游步骤中的常见用法如下:

在接口请求中使用#

动态值方式:跟上述“方式一”介绍的一样,只需在输入框中点击魔棒图标,选择读取前置步骤的运行结果来填写输入参数即可。
提取变量方式:假设提取的变量为products_id,则在参数中直接填入{{products_id}}即可
接口响应数据通过动态值及提取变量的方式来流转

在数据库操作中使用#

如果你需要将接口返回的某个值作为查询条件,传入数据库步骤中拼接 SQL 语句,也可以通过两种方式。
动态值方式:
这里面的表达式可以在动态值中读取:
在动态值中读取表达式
提取变量方式:假设提取的变量名为products_id,则在 SQL 语句中直接插入{{products_id}}即可

在 For 循环中使用#

若需根据接口返回数组的长度执行多轮循环,可以通过动态值读取数组的 .length 值作为循环次数,例如{{$.1.response.body.products.length}}:
过动态值读取数组的.length值作为循环次数

在 ForEach 中使用#

若需将接口返回的数组对象,作为 ForEach 循环的输入源,也可以通过两种方式。
动态值方式:直接把整个数组提取出来即可,例如{{$.1.response.body.products}}
将动态值提取的数组作为 ForEach 循环的输入源
提取变量方式:假设已提取整个数组为products变量,则在循环中直接插入{{products}}即可
将提取变量作为 ForEach 循环的输入源

在脚本中使用#

在脚本中引用前置步骤的数据,需要通过 pm.variables.get() 方法。
动态值方式:可以直接读取前置步骤的运行结果
在脚本中引用前置步骤的数据
提取变量方式:假设已将products提取为变量(环境/临时/全局变量) ,则在pm.variables.get()方法内填入products即可。
获取临时变量的值:
获取环境变量的值:
获取全局变量的值:
注意
在脚本中不能直接使用 {{products}} 这样的插值语法,必须通过方法获取变量值。

2. 数据库查询结果的提取与使用#

2.1 数据库数据的特征#

数据库查询步骤执行后会返回查询结果的结构化数据,格式是一个数组对象,即使只查询到一条记录也会被包装在数组中,例如:
数据库数据的特征
与接口数据不同的是,数据库步骤产生的数据不能直接通过「动态值」访问,必须先通过「提取变量」的方式保存下来。

2.2 数据提取方式#

在数据库步骤中执行完 SQL 后,Apifox 会自动解析出结构化响应,格式大致如下:
[
  {
    "id": "1000",
    "title": "标题1",
    "description": "标题1的描述"
  }
]
你可以通过 JSONPath 提取其中的字段并保存为变量,例如:
变量名:products_id
JSONPath:$[0].id,如果要保存整个结果集,则设置为$
下游步骤通过{{ }}引用变量,例如:{{products_id}}
通过 JSONPath 提取其中的字段并保存为变量

2.3 数据使用场景#

在接口请求中使用#

如果你在数据库中查询出了某个 id,将其提取为products_id的变量后,下游接口的请求参数中可以直接通过{{products_id}}引入该变量:
在接口请求中使用

在 ForEach 中使用#

如果你查询出了一组记录,想要逐条处理,就可以将整个数组作为 ForEach 循环的遍历源,例如{{products}}:
将整个数组作为 ForEach 循环的遍历源
前提是你在数据库操作中提取变量时保存了整个数组,例如:
变量名:products
JSONPath:$
在数据库操作中提取变量时保存了整个数组

在脚本中使用#

脚本中访问数据库提取出来的变量方式与其他变量一致,例如:
获取临时变量的值:
获取环境变量的值:
获取全局变量的值:

3. For 循环中数据的提取与使用#

3.1 For 循环的工作机制#

For 循环是一种重复执行特定逻辑的控制结构,它通过指定的次数来循环执行内部的步骤。
你可以固定一个常量来控制循环次数,也可以通过动态值读取前置步骤返回的数组,将数组的长度 .length 作为循环次数,例如{{$.1.response.body.products.length}}:
For 循环的工作机制
与其他输出数据的步骤不同,For 循环本身并不直接产出数据,它只提供一个从 0 开始的索引值(index),表示当前是第几次循环执行。

3.2 循环索引的获取#

在执行流程中,你可以通过动态值语法访问循环的当前索引值,例如 {{$.7.index}}。
通过动态值语法访问循环的当前索引值
其中的数字 7 代表该 For 循环步骤的 ID,每个步骤都有唯一的 ID 标识。这个索引值从 0 开始计数,在第一次循环时值为 0,第二次为 1,依此类推。
循环索引的获取

3.3 循环数据的应用场景#

在脚本中使用循环索引#

当你需要在测试脚本中访问循环相关信息时,可以通过pm.variables.get()方法获取当前循环的索引值,然后进行相应的逻辑处理:
在脚本中使用循环索引

结合其他数据源使用#

For 循环的一个常见使用场景是结合上游步骤获取的数据,在每次循环中处理不同的元素。例如,你可以先获取一个数组,然后在 For 循环中通过索引访问数组的不同元素,实现批量处理的效果。

4. ForEach 循环中数据的提取与使用#

4.1 ForEach 循环的工作原理#

ForEach 循环专为数组数据设计,它会自动遍历数组中的每一个元素并执行相同的操作。与 For 循环的关键区别是,ForEach 会在每轮迭代中自动提取当前元素的完整数据,使其在子步骤中可用。

4.2 ForEach 循环中的数据访问#

在 ForEach 循环中,系统会自动创建两个特殊变量:
1.
当前元素:包含当前正在处理的数组元素的完整数据,例如{{$.4.element}}。对于对象数组,你可以直接访问其属性,如{{$.4.element.id}}、{{$.4.element.title}}等。
ForEach 循环中的数据访问
2.
当前索引:表示当前是第几轮循环(从 0 开始计数),如{{$.4.index}}
在 ForEach 循环中自动创建两个特殊变量
注意
数字4是 ForEach 步骤的 ID,在实际使用时需要替换为你自己流程中 ForEach 步骤的 ID。

4.3 ForEach 数据的应用场景#

在接口请求中使用#

ForEach 循环非常适合批量处理数据,例如对数组中的每个元素发起一个请求。在不同轮次中,相同的请求模板会自动使用不同的数据,例如{{$.4.element.id}}:
ForEach 数据的应用场景

在数据库操作中使用#

你可以使用循环里的元素字段进行数据库查询,或者将当前元素的多个字段插入到数据库表中,实现批量的数据库操作。
用当前项中的某个字段去查询数据库:
这里的表达式{{$.4.element.id}}可以通过动态值来获取:
使用循环里的元素字段进行数据库查询
将当前项的多个字段插入到某张表中:

在脚本中使用#

如果你需要在自定义脚本中获取循环中的数据后进一步处理,也可以使用pm.variables.get()方法来获取当前循环元素的实际值,例如:

5. 脚本中数据的设置与传递#

5.1 脚本数据的特殊性#

与其他测试步骤不同,脚本不会自动产出可供下游测试步骤直接读取的数据。如果你希望将脚本中的处理结果用于后续步骤,必须显式地将数据保存为变量。

5.2 数据设置方式#

你可以在脚本中通过如下方法,将结果写入变量,例如:
脚本中数据的设置与传递
变量设置完成后,就可以在后续步骤中通过{{ }}语法进行引用。

5.3 脚本数据的应用场景#

在接口请求中使用#

脚本中设置的变量可以直接在下游接口请求的参数中使用,实现动态参数的生成和传递。例如你在脚本中写入了变量products_id,则可以在下游接口请求的参数中用{{products_id}}作为入参。
脚本数据的应用场景

在数据库操作中使用#

与其他测试步骤设置的变量一样,脚本中设置的变量也可以参与 SQL 语句的拼接,为数据库操作提供动态的查询条件或插入值。例如:

在 For 循环中使用#

你可以用脚本生成循环次数或中间值并保存在“临时变量”中,再传入 For 步骤:
然后在 For 的循环次数中填写{{loopCount}}:
用脚本生成循环次数保存在临时变量中传入 For 步骤

在 ForEach 中使用:#

你可以在脚本里将整个数组写入到变量中,然后在 ForEach 循环中使用,例如:
接着将 {{products}} 作为 ForEach 的遍历数据源:
在脚本里将数组写入到变量中在 ForEach 循环中使用

总结#

掌握不同类型步骤的数据提取与使用方法,是构建高效自动化测试流程的关键。接口和数据库步骤主要产出业务数据,循环步骤提供控制逻辑,脚本步骤则负责数据的加工处理。通过合理组合动态值引用和变量提取两种机制,你可以构建出灵活且强大的数据驱动测试流程。
在实际使用中,建议根据数据的使用频率和复杂程度来选择合适的传递方式:简单且偶尔使用的数据可以直接通过动态值引用,而需要多次使用或在脚本中处理的数据则建议提取为变量。
上一页
通过 Runner 运行包含云端数据库连接配置的测试场景
下一页
账号设置
Built with