大多数接口测试都是线性运行的。调用登录,调用结账,调用收据接口,并在过程中进行断言。这种方式在某个步骤失败且后续步骤依赖该步骤时就会出问题。如果登录返回 401,运行结账请求就毫无意义。更糟糕的是,它会用第二个误导性的失败掩盖真实的失败。你想要的是一个能够读取登录响应、决定是否继续,并报告真实故障位置的测试。
这种决策就是条件逻辑,你可以通过流程控制来构建它。本指南将向你展示如何在 Apifox 的接口测试场景中添加 If/Else 分支,以便运行过程可以根据先前的响应进行分支。你将构建一个真实的场景:登录,检查状态码,并且只有在登录真正成功时才继续结账。如果你是 Apifox 场景的新手,关于如何使用 Apifox 编写测试场景的演练涵盖了本文所基于的线性基础知识。关于分支模式本身的定义,MDN 条件语句指南是一个很好的入门读物。你可以免费下载 Apifox 并跟随本教程操作。
AI Coding 交流群
如果你也在用 AI 写代码,或者正在研究 Cursor、Claude Code 这些工具,欢迎加入以下交流群。群里平时会聊一些 AI 编程的实际用法、开发工作流,还有各种新工具和新玩法。
什么是流程控制,什么不是
在 Apifox 中,自动化测试位于“测试”模块中。你工作的单元是测试场景,文档将其描述为类似于 Postman 中的 Collection。在场景内部,你可以安排测试步骤:每个步骤要么是一个单独的请求,要么是一个流程控制元素,如分支、循环或延迟。

流程控制是一组流程控制元素。它让场景不仅仅是按顺序执行请求。关于流程控制和条件分支的 Apifox 文档是此处使用的每个标签的参考依据。本文重点关注的是“条件分支”,这是 Apifox 对 If/Else 的称呼。分支会读取你提供的值,根据条件测试该值,并在条件成立时运行一组步骤,在条件不成立时运行另一组步骤。
首先要澄清一点,因为这两者容易混淆。分支不是循环。分支只决定一次某个步骤块是否运行。循环则会多次运行一个块。Apifox 为迭代提供了独立的功能,称为 For 循环和 ForEach 循环,它们属于不同的问题:在一定范围或数组项中重复相同的请求。如果你需要遍历订单 ID 数组,那是 ForEach 循环(在 ForEach 循环教程中涵盖),而不是分支。本指南将专注于 If/Else。
Apifox 文档中没有列出关于流程控制、条件分支、循环或在步骤之间传递数据的免费版与付费版限制。这些功能也没有云端与私有化部署的区别。只要你能创建场景,就可以向其中添加分支。
构建一个基于登录响应进行分支的场景
目标如下:用户登录。如果登录接口返回 200,场景继续创建结账。如果返回其他任何内容,场景将停止并报告失败,而不是假装运行了结账。
步骤 1:创建测试场景
打开 Apifox 并进入“测试”模块。点击搜索栏旁边的 + 创建一个新的测试场景,选择它所在的目录,并设置优先级以完成创建。你现在拥有了一个准备好添加步骤的空场景。
步骤 2:添加登录请求作为第一步
添加你的第一个测试步骤。Apifox 提供了几种引入请求的方法:从现有的接口定义导入、从保存的接口用例导入、直接添加自定义请求,或从 cURL 字符串添加。为了快速开始,添加一个自定义请求。将其设置为 POST 并指向你的 auth 接口,带上 JSON body:
POST https://api.your-store.com/v1/login
Content-Type: application/json
{
"email": "dana@example.com",
"password": "correct-horse-battery-staple"
}
单独运行此步骤一次,以确认它返回了你期望的结果。成功的登录会返回 200 和 body 中的 Token,类似于:
{
"token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
"userId": "usr_10482"
}
步骤 3:进入编排模式
点击任何步骤进入编排模式。左侧面板显示场景的整体流程;右侧面板显示你选择的步骤的详细信息。这个拆分视图是你安排分支的地方。如果你需要重新排序步骤,拖动步骤上的 ≡ 图标即可移动。
步骤 4:添加条件分支
点击 添加步骤 按钮。这是插入任何流程控制元素的主要方式。从菜单中选择 条件分支。这将创建一个 If 语句,一个等待条件和运行步骤的空分支。
现在构建条件。你需要将登录响应的状态码输入到分支中。Apifox 使用一组固定的判断操作符构建条件。完整列表包括:等于、不等于、存在、不存在、小于、小于或等于、大于、大于或等于、正则匹配、包含、不包含、为空、不为空、在列表内、不在列表内。
对于这个分支,你希望登录状态码等于 200。所以条件为:登录响应状态 等于 200。
步骤 5:在条件中引用先前的响应
要将登录结果输入到条件字段中,你有两种方法。
第一种方法无需设置。点击进入条件的数值字段并点击魔棒图标,然后选择 提取前置步骤数据。Apifox 允许你直接指向之前的登录步骤并从其响应中提取值。在底层,这使用了前置步骤引用语法 {{$.<step id>.response.body.<field path>}}。例如,如果你想要登录 body 中的 Token 而不是状态码,你可以引用 {{$.1.response.body.token}},其中 1 是登录步骤的 id。

关于 提取前置步骤数据 有两点需要注意。它仅在“测试”模块中有效,在“接口”模块中无效。并且它只有在你运行整个场景时才会解析,而不是在孤立地运行单个步骤时。如果前置步骤引用在单独运行时看起来是空的,这是正常的;运行完整场景,它就会被填充。
第二种方法使用命名变量,在“测试”和“接口”模块中都有效。在登录请求中,打开其后置操作并添加一个 提取变量 动作。使用 JSONPath 表达式(例如 $.token)提取你关心的字段,Apifox 会将其存储在一个名称下。然后你可以在后面的任何地方通过 {{token}} 引用它。当你希望相同的值在不同模块或多个分支中可用时,这是更具移植性的方法。关于在步骤之间传递值的更深层机制,请参阅关于如何在测试步骤之间传递数据的指南。
对于状态码分支,在登录步骤的状态上使用 提取前置步骤数据 是最短的路径。
步骤 6:添加 else 分支
将鼠标悬停在 If 块上并点击 + Else。这将为你提供当条件为假(即登录未返回 200)时运行的备选路径。
现在填充两侧:
- 在 If 块内部,添加结账请求作为测试步骤。这是正常路径。它仅在登录返回 200 时运行。如果结账需要登录 Token,请在此处通过
{{token}}(如果你提取了它)或通过对登录 body 的前置步骤引用来引用它。真实的结账调用通常在Authorizationheader 中携带 Bearer Token,这与 Stripe API 文档中用于身份验证请求的模式相同。 - 在 Else 块内部,添加一个让失败显而易见的步骤。常见的选择是向日志或通知接口发送请求,或者添加一个带有断言且始终失败的自定义请求,以便场景报告清晰地标记此次运行。
你的场景现在读起来就像纯逻辑:如果登录等于 200,运行结账;否则,报告并停止。
步骤 7:保存
点击 保存 以持久化场景。未保存的更改会显示一个圆点指示器,所以如果你看到那个圆点,说明你还有工作需要保存。运行完整场景并观察分支解析。将登录指向有效的凭据,If 块将触发。将其指向错误的凭据,Else 块将取而代之。
变体与高级流程控制
一旦基础分支工作正常,相同的构建块可以涵盖很多场景。
基于 body 字段分支,而不仅仅是状态码。 状态码是常见情况,但条件可以读取任何你可以引用的值。假设你的登录即使对于锁定的账户也返回 200,而真实状态在 status 字段中。提取 {{$.1.response.body.status}} 并对 "active" 使用 等于 操作符,或者对消息字符串使用 包含。操作符列表还提供了范围检查:对返回的余额使用 大于,使用 在列表内 来测试返回的角色是否为几个允许值之一。
将分支与循环结合。 分支和迭代可以组合使用。在对产品 ID 数组进行 ForEach 循环内部,条件分支步骤可以跳过缺货的产品并处理其余产品。循环索引引用 {{$.<loop step id>.index}} 从 0 开始,ForEach 元素是 {{$.<loop step id>.element.<field path>}}。循环是另一个主题;ForEach 循环教程对其进行了详细介绍。

使用 Break If 提前停止循环。 当你进行迭代时,Break If 条件 元素会在满足条件时立即结束循环。你可以拖动它来重新定位,并可以在一个循环中多次添加它。
使用 On Error 处理错误。 循环带有一个固定在循环开始处的 On Error 元素,你无法移动它。它的选项决定了当循环内部的请求出错时会发生什么:忽略 继续下一个请求,继续 跳过当前循环周期的剩余请求,断开执行 停止循环并继续执行循环后的内容,而 结束执行 则停止整个场景。
在步骤之间添加等待。 有时下游服务在反映写入之前需要一点时间。等待 元素添加了以毫秒为单位的延迟,在创建调用和检查它的读取调用之间非常有用。
在脚本中引用值。 如果分支需要的逻辑对于操作符列表来说过于复杂,前置操作或后置操作脚本可以计算它。在脚本内部,你不能直接使用 {{variable}} 语法。请改用 pm.variables.get("$.2.response.body.token"),匹配步骤 id 和字段路径。对于一个请求的输出作为下一个请求的输入的更广泛模式,请参阅关于请求链的指南以及关于接口测试编排和传递数据的深入文章。
关于自引用的说明:场景不能引用原始测试场景本身。这种保护措施可以防止在嵌套场景时发生意外的死循环。
使用 Apifox CLI 自动化工作流
你刚刚构建的场景不必只在应用内部运行。Apifox 提供了一个命令行运行器,可以无界面执行保存的场景,这正是你在 CI 中需要的。安装它并登录:
npm install -g apifox-cli
apifox login --with-token <YOUR_ACCESS_TOKEN>
然后通过 id 运行你的分支场景,指向一个环境并选择一个报告器:
apifox run --access-token $APIFOX_ACCESS_TOKEN -t <scenario_id> -e <env_id> -r cli
这里 -t 是测试场景 id,-e 是环境 id,-r 是报告器。使用 cli 进行控制台输出,或者使用 html 和 junit 生成你的流水线可以发布的产物;用逗号分隔它们(如 -r html,cli)可以同时输出多个。分支的解析方式与在应用中相同:运行器读取登录响应,走 If 或 Else 路径,退出代码反映结果,因此登录失败会导致构建失败。完整设置位于 Apifox CLI 安装指南中,将其接入流水线的方法在 Apifox CLI GitHub Actions 指南中涵盖。如果你希望按定时器而不是每次提交运行相同的场景,请参阅如何在 Apifox 中安排定时任务。
常见问题解答
Apifox 中的条件分支和循环有什么区别?
条件分支根据条件决定一次某个步骤块是否运行。循环则重复运行一个块。当你需要做二选一的决策时(例如仅在登录成功时继续结账),请使用分支。当你需要针对计数或数组重复请求时,请使用 For 或 ForEach 循环。ForEach 循环教程完整涵盖了迭代。
为什么我的 提取前置步骤数据 引用返回为空?
有两个常见原因。首先,提取前置步骤数据 仅在“测试”模块中有效,在“接口”模块中无效。其次,它仅在你运行整个测试场景时才会解析。如果你孤立地运行单个步骤,引用还没有可以指向的内容。运行整个场景,值就会填充。
我可以基于响应 body 中的字段进行分支,而不仅仅是状态码吗?
可以。使用前置步骤表达式(如 {{$.1.response.body.status}})引用该字段,或将其提取到命名变量中,然后选择操作符,如 等于、包含 或 在列表内。任何你可以引用的值都可以驱动条件。关于移动这些值的方法在如何在测试步骤之间传递数据中涵盖。
如何在脚本中使用变量而不是条件构建器?
脚本不接受 {{variable}} 语法。在向后置操作脚本中使用 pm.variables.get("$.2.response.body.token"),匹配步骤 id 和你想要的字段路径。
分支功能是否需要额外付费,或者需要私有化部署版本?
Apifox 文档没有列出流程控制、条件分支、循环或数据传递的方案限制,这些功能也没有云端与私有化部署的区别。只要你能构建场景,就可以向其中添加分支。
总结
线性测试告诉你有些东西坏了。分支测试告诉你哪里坏了,并停止在无法成功的路径上浪费步骤。添加一个条件分支步骤,通过 提取前置步骤数据 或提取的变量为其提供先前的响应,连接好 If 和 + Else,你的场景现在就可以像真实的 API 一样做出决策。当它在应用中正常工作时,一个 apifox run 命令就可以将相同的逻辑带入 CI。免费试用 Apifox,无需信用卡,让你的线性测试变成会思考的场景。
开发必备:API 全流程管理神器 Apifox
介绍完上文的内容,我想额外介绍一个对开发者同样重要的效率工具 —— Apifox。作为一个集 API 文档、调试、设计、测试、Mock、自动化测试于一体的工具,Apifox 是目前提升研发效率的首选。
如果你正在开发项目,不妨试试其极其友好的界面设计,它完全兼容 Postman 和 Swagger 数据格式,导入数据非常方便,,即使是新手也能很快上手,点击这里即可注册使用。

值得一提的是,除了个人和常规团队使用,针对有高安全合规要求、或需要在内网环境协作的企业,Apifox 还提供了深度定制的私有化部署方案。
获取专属报价与部署方案
详细的私有化部署系统架构与安全白皮书
针对您公司规模的专属报价单
免费的 1v1 专属产品演示 (Demo) 机会