文档
03 平台04 媒体供应02_需求与工作包

MG-02-012 验收测试

状态说明:以当前有效边界为准。供应执行规则与历史实现证据保留;客户身份、售价、结算、全量旧跨仓契约及图像开放计划不代表当前验收范围。

1. 验收原则

首版上线前所有 P0 用例必须通过。P1 可以延期,但必须有 Owner、风险和目标版本。

通过不等于“接口返回 200”,而是证明:

  • 请求只提交到符合能力的 Supply;
  • 同步和异步语义正确;
  • 用户错误不会被错误重试;
  • Provider 故障可以隔离和换路;
  • 单模型故障不影响同 Channel 其他模型;
  • 多渠道可以并行使用;
  • 成本可估算且不越过护栏;
  • 能力降级受控、可见、可审计;
  • 任务、输出和使用记录不会丢失或重复;
  • UI 不暴露已排除功能。

2. 测试层级

层级说明
Unit能力、成本、排序、状态、错误分类、降级变换
ComponentPostgreSQL、Redis、租约、Outbox、幂等、对象存储
Contract公开 API、管理 API、Provider Fixture
IntegrationAPI 到 Provider Fake、结果存储和查询
Real Provider经授权的真实模型、能力、价格和错误验证
Fault网络、Redis、数据库、Worker、Provider 异常
LoadAPI、队列、调度和后台查询高并发
UI角色、流程、状态、可访问性和响应式
Cutover配置导入、域名切换、回滚和生产冒烟

3. 测试环境

必须有:

  1. 单元测试环境,不访问网络;
  2. PostgreSQL 与 Redis 组件测试;
  3. Fake Provider,支持成功、内容拒绝、429、5xx、超时、未知提交和异步状态;
  4. S3/R2 兼容测试存储;
  5. 与生产隔离的真实 Provider 验证环境;
  6. 不可触达付费 Provider 的负载环境。

真实 Provider 测试必须明确授权、限制次数并保存脱敏证据。

4. 产品范围和 UI

P0-UI-001 普通用户导航

给定普通用户登录,导航只包含:

数据看板
模型广场
API Keys
使用记录
API 文档

不存在管理、聊天、Playground、充值、订单和个人资料入口。

P0-UI-002 管理员导航

管理员额外看到:

图像渠道
图像模型路由
视频渠道
视频模型路由
用户与客户组
健康与告警
核心设置

P0-UI-003 无废弃功能路由

已知聊天、Playground、充值、余额、兑换码、订单和个人资料路径返回 404 或安全重定向, 且前端构建不包含可访问入口。

P0-UI-004 数据看板范围

  • 普通用户只看到自己的统计;
  • 管理员看到全站统计;
  • 个人概览和最近记录在看板中;
  • 不存在独立个人资料页面。

P0-UI-005 可访问性

关键表单、对话框、导航、状态和确认操作支持键盘;状态不只依赖颜色;自动化 无障碍扫描没有阻断级问题。

P0-DOC-001 公开 API 文档不漂移

  • 用户页面、OpenAPI 3.1 与 Go 契约测试读取同一份请求示例 JSON;
  • 页面覆盖同步/异步图像、OpenAI 视频、ModelArk 视频、任务查询和内容下载;
  • OpenAI 视频只展示 reference_image_urls,ModelArk 使用正式 content 数组;
  • 页面和 OpenAPI 不发布 /v1/media/generate、/v1/media/status 或公开 fallback_mode;
  • 示例覆盖参考图、视频、音频、首尾帧、metadata、按秒和按条计费,并被真实 DTO 严格解码和规范化;
  • Fake Compose 使用共享的基础创建示例完成图像、视频、查询和内容交付,不连接真实 或付费 Provider。

5. 用户、客户组和 API Key

P0-AUTH-001 Key 安全

  • Key 创建只展示一次明文;
  • 数据库不存在可还原明文;
  • 日志、Trace 和错误中没有完整 Key;
  • 禁用、过期和错误 Key 返回 401。

P0-AUTH-002 模型权限

  • 客户组控制可见和可调用 Public Model;
  • API Key Allowlist 只能进一步收窄;
  • 无权限模型在 /v1/models 和模型广场中不可见;
  • 调用无权限模型返回 404,避免泄露。

P0-AUTH-003 并发和频率

同步、异步并发分别限制;超过限制返回稳定 429 和 Retry-After,不会创建孤儿 MediaRequest 或 Provider Attempt。

P0-AUTH-004 资源隔离

用户不能读取其他用户的记录、Task 或输出。资源存在与不存在都返回一致 404。

6. Channel、发现和 Supply 配置

P0-CFG-001 连接测试

正确和错误 Base URL、Key、TLS、超时分别产生明确结果;Credential 不进入日志。

P0-CFG-002 模型发现

  • 使用 Channel Credential 调用 Provider 模型接口;
  • 保存发现快照和时间;
  • 新增、移除和未变化模型可区分;
  • 发现模型不会自动启用生产 Supply。

P0-CFG-003 价格发现与手工价格

  • Provider 有价格接口时正确导入;
  • 无价格接口时标记未知;
  • 管理员可以手工录入;
  • 手工覆盖记录来源和时间;
  • 缺少可比较成本的 Supply 不能 production_ready。

P0-CFG-004 单一配置源

Supply 保存 Provider 模型、Profile、Variant、能力、成本和容量。Public Model Binding 只引用 Supply ID。数据库、管理 API 和 UI 均不存在第二份视频路由能力或价格。

P0-CFG-005 SKU 唯一

并发创建相同 (channel, upstream_model, request_profile, variant_key) 只有一条成功, 其他返回冲突。

P0-CFG-006 媒体边界

  • Image Supply 不能保存真人、视频时长和参考音视频能力;
  • Video Supply 不能使用 Image Capability;
  • 配置发布时由服务端和数据库共同拒绝。

P0-CFG-007 生产启用门槛

缺少 Capability、Cost Rule、有效 Credential、真实测试或视频真人证据任意一项时, Supply 不能启用。图像和视频真实测试都必须轮到或取得成功结果,并完成结果下载、 大小、摘要、媒体类型和文件特征校验;仅 Validate 或 Submit 成功产生的 submission_verified 不能通过 production-ready 门禁。

P0-CFG-008 Channel 媒体隔离

  • Channel 创建必须固定 image 或 video,更新 API 不能修改;
  • Image Supply 导入 Video Channel、Video Supply 导入 Image Channel 均由服务端和 PostgreSQL 拒绝;
  • 管理端图像和视频配置页没有媒体类型下拉框,也不会请求另一类型的 Channel/Supply;
  • 同一 Provider 账户接入两类媒体时使用两个独立 Channel、Credential 和健康/容量状态。

7. 模型广场和公开模型

P0-MDL-001 只展示 Public Model

普通用户无法看到 Channel、Supply、Provider 模型 ID、内部成本和健康事件。

P0-MDL-002 能力正确

模型详情与公开 API 校验使用同一个 Public Capability Version;修改并发布后两者 同时更新。

P0-MDL-003 可用状态

  • 有健康 Exact/Fallback Supply 时为 available;
  • 只有 Degraded Supply 时为 degraded_available;
  • 无任何路径时为 unavailable。

P0-MDL-004 降级披露

允许 933→900 的模型详情必须明确说明可能移除参考视频和音频,并说明 strict 模式。

P0-MDL-005 配置价格

  • 模型广场从当前用户可见 Public Model 的已发布 Supply Binding 和有效 Cost Rule 投影价格;
  • 按秒、按条以及 431/933 素材配置能够区分;
  • 响应不返回 Channel、Supply、上游模型、Cost Rule ID 或 Provider Credential;
  • Public Model 不保存第二份价格。

8. 同步图像

P0-IMG-SYNC-001 同步成功

POST /v1/images/generations 默认返回 200 和图像结果,不返回 Task ID,不创建 AsyncTask;存在一条 MediaRequest、Attempt 和 Output。

P0-IMG-SYNC-002 快速容量失败

所有匹配 Supply 无容量时,在同步超时内返回 429/503 和 Retry-After,不进入 异步队列,不创建 Provider Attempt。

P0-IMG-SYNC-003 一次透明换路

首个 Supply 明确返回可重试基础设施故障时,在总 HTTP 超时内最多换 Supply 一次; 最多两条 Attempt,成功结果仍作为一次同步响应返回。

P0-IMG-SYNC-004 内容错误不换路

Provider 返回内容审核或请求错误时只有一条 Attempt,用户收到明确错误,Supply 健康不下降。

P0-IMG-SYNC-005 同步幂等

并发 50 个相同 Key 和相同请求只能产生一次 Provider 调用;重复请求返回已保存结果 或等待同一执行结果。相同 Key 不同请求返回 409。

P0-IMG-SYNC-006 输出格式

URL、Base64 和 Provider 原生多输出按 Public Model 能力工作;多个输出顺序稳定; Base64 不进入日志。

9. 异步图像

P0-IMG-ASYNC-001 显式启用

只有 Prefer: respond-async 创建 AsyncTask 并返回 202。缺少该 Header 仍同步。

P0-IMG-ASYNC-002 不支持模式

Public Model 不支持异步时返回 ASYNC_MODE_UNSUPPORTED,不悄悄同步执行。

P0-IMG-ASYNC-003 状态与结果

queued → in_progress → succeeded/failed 可查询,输出进入平台存储,用户使用记录正确。

P0-IMG-ASYNC-004 结果持久接力

Provider Generate 只成功调用一次。停止 MinIO 后,结果完整写入持久 Result Spool, Task 保持 in_progress,Attempt 不新建;重启 Dispatcher 后仍从同一文件继续发布。 MinIO 恢复后 Task 成功,Output/Asset 只有一份。

P0-IMG-ASYNC-005 结果发布有界失败

对象存储持续失败达到配置上限后,Attempt、Task 和 Request 进入稳定失败,错误码为 IMAGE_RESULT_PUBLICATION_EXHAUSTED,Capacity/Permit 已释放并产生去重告警。之后不再 领取、不增加失败次数、不调用 Provider。

P0-IMG-ASYNC-006 同步协议不变

同步图像不创建 AsyncTask、不进入持久 Result Spool 重试;结果存储失败仍在当前 HTTP 请求内返回失败。异步图像的持久接力不改变同步成功响应。

10. 异步视频

P0-VID-001 两种创建接口

/v1/videos 和 /api/v3/contents/generations/tasks 对等规范化为同一 Video Request; 相同输入得到相同能力校验、调度、成本和错误语义。Sora 旧别名字段和 ModelArk 未定义 字段都被明确拒绝。

P0-VID-002 任务创建

创建返回 202、平台 Task ID 和 queued;MediaRequest、AsyncTask、幂等 Registry 和 Outbox 同事务提交。

P0-VID-003 查询兼容

/v1/tasks/{id}、/v1/videos/{id} 和 /api/v3/contents/generations/tasks/{id} 读取同一 Task,并分别映射统一、Sora 与 ModelArk 状态。

P0-VID-004 输入边界

覆盖 480p/720p/1080p、非 5 秒倍数、时长上下限、宽高比、0/边界/超限图片、 视频、音频、素材大小和视频总时长。

P0-VID-005 平台结果

Provider 成功但结果未转存时仍为 in_progress;结果验证并保存到平台存储后才成功。

P0-VID-006 计费方式硬过滤

省略 Sora billing_mode 等价于 per_second;显式 per_request 进入幂等指纹和 持久快照。只有计费方式匹配的有效 Cost Rule Supply 才能成为候选,缺失时在 Provider 调用前失败,不能自动切换计费方式。

11. 调度和多渠道容量

P0-SCH-001 硬能力优先

不支持请求能力的 Supply 必须排除,即使它更稳定或更便宜;排除原因可查询。

P0-SCH-002 多渠道铺满

20 个队列任务,三个 Supply 可用容量分别为 5、8、3 时,本轮最多分别预占 5、8、3, 不会全部压到一个 Supply,也不会超过任何 Channel/Supply 限制。

P0-SCH-003 同一请求不并行复制

没有 Hedged Request 配置和实现;一个 Task 同一时刻最多有一个正在提交/处理的 有效 Attempt。

P0-SCH-004 容量竞态

100 个 Dispatcher 并发争抢最后一个 Capacity Slot 时只有一个成功;失败者重新 调度,不覆盖上一轮决策。

P0-SCH-005 队列唤醒

Supply 释放容量、熔断恢复、新 Supply 启用时能够唤醒队列,不需要等待长轮询周期。

P0-SCH-006 Redis 恢复

Redis Stream 清空或短时不可用后,未处理 AsyncTask 能从 PostgreSQL Outbox/ Reconciler 恢复,不重复创建 Task 或 Attempt。

12. 稳定优先和成本优先

P0-POL-001 稳定优先

固定请求和快照下,健康等级、成功率、预计成功成本、容量和 Supply ID 按文档顺序 产生确定性结果;不同运行实例结果一致。

P0-POL-002 稳定成本护栏

稳定性最好的 Supply 超过 stable_cost_multiplier_limit 时不进入候选,并记录原因。

P0-POL-003 成本优先

低于最低成功率的廉价 Supply 被排除;其余候选按预计成功成本排序。

P0-POL-004 失败收费

失败收费和失败不收费两种 Supply 使用正确的预计成功成本,不把低单次价格误判为 低成功成本。

P0-POL-005 冷启动

没有足够样本的 Supply 使用明确冷启动规则,不能被当成 100% 成功率。

P0-POL-006 路由运营调整

  • 图像和视频路由页分别解释硬能力、健康/容量、稳定性/成本策略和一次换 Supply;
  • 管理员可启停 Binding、调整 exact/fallback/degraded 角色并切换策略;
  • 页面和 API 不提供数字优先级、权重或渠道亲和度;
  • 保存后自动重新执行发布门禁;成功发布只影响新 Attempt,在途 Attempt 的 Supply、 Credential 和策略快照不变;发布失败保持 unpublished 并明确提示模型已暂停新请求。

2026-10-18 拆分:本页只保留测试与验收的前半部分;其余章节见 验收测试(续)。

On this page

测试与验收1. 验收原则2. 测试层级3. 测试环境4. 产品范围和 UIP0-UI-001 普通用户导航P0-UI-002 管理员导航P0-UI-003 无废弃功能路由P0-UI-004 数据看板范围P0-UI-005 可访问性P0-DOC-001 公开 API 文档不漂移5. 用户、客户组和 API KeyP0-AUTH-001 Key 安全P0-AUTH-002 模型权限P0-AUTH-003 并发和频率P0-AUTH-004 资源隔离6. Channel、发现和 Supply 配置P0-CFG-001 连接测试P0-CFG-002 模型发现P0-CFG-003 价格发现与手工价格P0-CFG-004 单一配置源P0-CFG-005 SKU 唯一P0-CFG-006 媒体边界P0-CFG-007 生产启用门槛P0-CFG-008 Channel 媒体隔离7. 模型广场和公开模型P0-MDL-001 只展示 Public ModelP0-MDL-002 能力正确P0-MDL-003 可用状态P0-MDL-004 降级披露P0-MDL-005 配置价格8. 同步图像P0-IMG-SYNC-001 同步成功P0-IMG-SYNC-002 快速容量失败P0-IMG-SYNC-003 一次透明换路P0-IMG-SYNC-004 内容错误不换路P0-IMG-SYNC-005 同步幂等P0-IMG-SYNC-006 输出格式9. 异步图像P0-IMG-ASYNC-001 显式启用P0-IMG-ASYNC-002 不支持模式P0-IMG-ASYNC-003 状态与结果P0-IMG-ASYNC-004 结果持久接力P0-IMG-ASYNC-005 结果发布有界失败P0-IMG-ASYNC-006 同步协议不变10. 异步视频P0-VID-001 两种创建接口P0-VID-002 任务创建P0-VID-003 查询兼容P0-VID-004 输入边界P0-VID-005 平台结果P0-VID-006 计费方式硬过滤11. 调度和多渠道容量P0-SCH-001 硬能力优先P0-SCH-002 多渠道铺满P0-SCH-003 同一请求不并行复制P0-SCH-004 容量竞态P0-SCH-005 队列唤醒P0-SCH-006 Redis 恢复12. 稳定优先和成本优先P0-POL-001 稳定优先P0-POL-002 稳定成本护栏P0-POL-003 成本优先P0-POL-004 失败收费P0-POL-005 冷启动P0-POL-006 路由运营调整