百度一镜 如何做到24小时不间断直播
2026-07-21 3413424
2026-07-20 0
绿色的状态码也会“撒谎”。你的 POST /orders 接口返回了 201 Created,响应 body 看起来很完美,测试也通过了。但数据行真的以正确的状态存入数据库了吗?库存数量减少了吗?如果测试仅读取 HTTP 响应,那么它检查的只是 API 说了什么,而不是系统做了什么。为了弥补这一差距,你必须查看数据库本身。
这就是在测试场景中使用数据库查询的价值所在。你可以在请求前预置(seed)一个已知状态,发起请求,然后查询表以确认磁盘上的真实数据。Apifox 通过“数据库连接”和“数据库操作”处理器内置了这一功能,因此你可以将 SQL 或 NoSQL 命令作为步骤运行在驱动 HTTP 调用相同的场景中,无需额外的脚本衔接。如果你是构建场景的新手,关于如何使用 Apifox 编写测试场景的指南涵盖了本文所基于的请求级基础知识。如果你想温习关系型存储如何建模这些数据,MDN 的服务端概述是一份可靠的入门读物。
一个从不触碰数据库的 API 测试就像一个黑盒。它完全信任响应。大多数情况下这没问题,但有趣的 Bug 往往存在于 API 返回内容与持久化内容之间的差异中:状态字段从未切换、外键指向空处、逻辑删除变成了物理删除。
数据库步骤可以让你实现纯 HTTP 测试无法做到的三件事:
Apifox 将该功能分为两部分。首先,你在“设置 > 数据库连接”下创建一个可重用的连接。然后,将“数据库操作”步骤作为前置操作(在请求之前运行)或后置操作(在请求之后运行)添加到请求中。一个连接可以在项目中的每个场景中重复使用。
在规划之前请注意覆盖范围。MySQL、SQL Server(2014 及更新版本)、PostgreSQL 和 Oracle 支持免费版。ClickHouse、MongoDB 和 Redis 是付费功能。MongoDB 文档明确指出:连接到 MongoDB 是付费功能。Redis 也是如此。因此,下面的 MySQL 演练适用于免费版;Mongo 和 Redis 部分则需要付费计划。
打开“设置 > 数据库连接”,点击右上角的 + 新建。选择你的数据库类型,然后填写连接字段:
db.staging.internal 或 127.0.0.1)3306)shop)
Apifox 会自动将匹配的 ID 字符串转换为 ObjectId,因此你无需手动包装。当你确实需要 BSON 类型时,支持使用辅助函数 ISODate(...)、ObjectId(...)、NumberDecimal(...) 和 NumberLong(...);MongoDB 手册详细说明了这些函数如何映射到存储值。连接接受完整的连接字符串或单独的主机和凭据组件。
诚实提示:MySQL 流程记录了将 JSONPath 提取到变量的操作,但 MongoDB 和 Redis 文档并未描述相同的提取结果到变量机制。因此,请依靠 Mongo 操作来预置和确认状态,在控制台验证之前,不要假设 SQL 风格的提取路径完全一致。
Redis 连接需要 Host、Port、Password 和 Database Index。可视化操作使用支持 GET、SET 和 DELETE 的操作类型下拉菜单。要读取缓存的会话,请选择 GET 并将 Key 设置为类似 user:session:123 的内容。对于下拉菜单未涵盖的任何内容,运行 Redis 命令标签页可以运行任何有效命令:
KEYS user:*
这就是你确认 API 应该写入的缓存条目,或在测试前清除缓存以证明接口会重新填充它的方法。
在构建大型套件之前,有几件事值得了解:
{{$.StepID.element.field}} 引用当前循环项,其中 StepID 是循环步骤的实际编号。这对于在每次迭代中断言一行非常方便。paid 时走一条路径,在 pending 时走另一条路径。你绝不希望测试意外触碰生产数据。Apifox 的解决方案是每个环境对应一个数据库连接。你创建一个 staging 连接和一个 local 连接,每个连接都有自己的主机和密码。
然后,你使用右上角的下拉菜单切换环境。Apifox 会自动将场景中的每个查询路由到与当前选定环境匹配的连接。选择 staging,你的 SELECT 就会针对 staging 运行;切换到 local,完全相同的步骤就会针对你笔记本电脑的数据库运行,无需修改 SQL 或步骤。凭据随环境而异,无需在运行中途进行任何手动重新配置。
由于这些凭据存储在本地且不进行同步,这也确保了生产密码不会出现在共享的云端项目中。每位工程师持有自己的凭据。
一旦场景在 App 中通过,就可以在 CI 中无头运行它,以便每次拉取请求(PR)都能重新验证数据库,而不仅仅是 HTTP 契约。安装 CLI 并进行身份验证:
npm install -g apifox-cliapifox login --with-token
然后针对选定的环境,通过 ID 运行你构建的精确场景:
apifox run --access-token $APIFOX_ACCESS_TOKEN -t
这里 -t 是测试场景 ID,-e 是环境 ID,-r 是报告器(cli、html 或 junit;多个报告器用逗号分隔,如 -r html,cli)。需要规划的一点是:数据库连接详情是本地的,因此运行器需要导出的配置才能从 CI 访问你的数据库。如果你从数据集中为场景提供行数据,使用 Apifox CLI 进行数据驱动测试展示了每一行如何运行相同的数据库断言,而使用 Apifox 调度 API 测试则涵盖了如何定时运行,以便失败的数据库断言能像其他测试一样显现出来。
哪些数据库是免费的,哪些是付费的? MySQL、SQL Server(2014 及更新版本)、PostgreSQL 和 Oracle 属于免费计划。ClickHouse、MongoDB 和 Redis 需要付费计划。MongoDB 和 Redis 文档都指出其连接性是付费功能,因此在规划 NoSQL 套件之前请查看定价页面。可以先下载 Apifox 尝试免费数据库。
我可以在后续请求中使用数据库中的值吗? 可以。添加一个带有数据库操作的后置操作,运行 SELECT,然后使用“提取结果到变量”,配合变量名和 JSONPath 表达式(如 $[0].fulfillment_ref)从第一行隔离字段。之后通过 {{variable_name}} 引用它。关于 HTTP 响应的相同链式调用思路在测试步骤之间传递数据中有详细介绍。
我的团队成员会自动获得我的数据库连接吗? 不会。连接凭据存储在每个客户端的本地,不会同步到云端,因此每个团队成员都需要自行配置连接。这是刻意为之:为了确保生产密码不进入共享项目。
我的 MySQL 8 连接一直失败,为什么? MySQL 8 默认使用 caching_sha2_password 身份验证插件,这可能会阻止连接。使用 ALTER USER ... IDENTIFIED WITH mysql_native_password 将用户切换为 mysql_native_password 并重新连接。
我可以运行存储过程或复杂的数据库逻辑吗? 无法通过可视化界面实现。它处理标准的 SELECT、INSERT、UPDATE 和 DELETE 语句,但不支持存储过程等复杂操作。请保持你的测试步骤为直接的语句。
数据库查询将 API 测试从“响应看起来正确”提升到了“数据实际上是正确的”。在场景内部,通过前置操作预置已知状态,通过后置操作验证持久化行,并提取服务器生成的值以链式传递到下一个请求。为每个环境设置一个连接,相同的步骤即可安全地针对 staging 或本地环境运行,无需修改。
免费试用,无需信用卡:下载 Apifox,将 MySQL 连接指向你的开发数据库,并添加一个后置操作来读取下一个请求创建的数据行。