8.7 KiB
8.7 KiB
Fonrey 客户端发布模块测试用例文档(可自动化)
文档版本:v1.0
适用范围:PRD/发布管理/客户端发布管理模块PRD.mdv1.2
用例编号范围:TC-FON-000049~TC-FON-000072(全局唯一)
编号规范:TEST_CASES/TEST_CASE_ID_SPEC.md
变更历史
| 日期 | 变更人 | 变更内容 |
|---|---|---|
| 2026-04-30 | Atlas | 补充“变更历史”章节(文档治理) |
1. 目标与原则
- 覆盖客户端发布模块 P0:下载安装、自动升级、版本发布、版本分布统计。
- 每个用例必须可追溯到
test_case_id + step_id。 - 优先 API 集成自动化,客户端壳层 UI 能力以 E2E/手工补充。
- 失败报告必须定位到具体步骤,并保留请求响应或截图证据。
2. 自动化执行与报告要求(强制)
- 执行层:
- API 集成:
pytest + pytest-django(public schema) - 客户端 E2E:后续
playwright + Electron(当前先预留)
- API 集成:
- 每步输出:
run_id / test_case_id / step_id / status / expected_result / actual_result / error_message - 失败附件:
- API:请求体、响应体、关键日志路径
- E2E:截图与视频路径
3. 客户端发布模块 API 端点口径(以 PRD/TECH_STACK 为准)
GET /api/release/updates/latest/GET /api/release/updates/POST /api/release/updates/PATCH /api/release/updates/{id}/POST /api/release/updates/{id}/rollback/POST /api/release/heartbeats/GET /api/release/metrics/version-distribution/GET /api/release/metrics/tenant-installs/GET /api/release/metrics/tenant-leaderboard/
4. 全量测试用例清单(24条)
A. 下载与完整性(Story 1)
TC-FON-000049 官网下载页可访问且展示最新版本
- 级别:E2E
- 步骤:
TC-FON-000049-S01访问官网客户端下载页TC-FON-000049-S02校验展示版本号/发布日期/下载按钮TC-FON-000049-S03校验下载按钮链接可用
- 预期:页面可访问,元信息完整
TC-FON-000050 latest 接口返回下载地址与校验值
- 级别:API
- 步骤:
TC-FON-000050-S01调用GET /api/release/updates/latest/?platform=win32&arch=x64¤t_version=1.2.0TC-FON-000050-S02校验返回download_url、checksum_sha256、release_notesTC-FON-000050-S03校验checksum_sha256长度为 64
- 预期:响应字段完整且格式正确
TC-FON-000051 安装包 SHA256 校验通过
- 级别:API+脚本
- 步骤:
TC-FON-000051-S01获取download_url和checksum_sha256TC-FON-000051-S02下载文件并计算本地 SHA256TC-FON-000051-S03比对本地值与接口返回值
- 预期:一致,允许进入安装流程
TC-FON-000052 安装包 SHA256 不一致时拒绝安装
- 级别:客户端集成
- 步骤:
TC-FON-000052-S01构造篡改包或错误 checksumTC-FON-000052-S02触发更新下载完成后的校验TC-FON-000052-S03校验客户端拒绝安装并保留当前版本
- 预期:提示完整性校验失败,不覆盖现版本
B. 自动升级(Story 3)
TC-FON-000053 无新版本时返回 has_update=false
- 级别:API
- 步骤:
S01用当前最新版本调用 latest;S02校验has_update=false;S03校验latest_version存在 - 预期:不触发更新
TC-FON-000054 有新版本时返回升级信息
- 级别:API
- 步骤:
S01用旧版本调用 latest;S02校验has_update=true;S03校验latest_version高于current_version - 预期:触发可升级状态
TC-FON-000055 普通更新允许“稍后提醒”
- 级别:客户端 E2E
- 步骤:
S01服务端发布release_type=normal;S02客户端检测更新;S03校验出现“立即更新/稍后提醒” - 预期:普通更新可延期
TC-FON-000056 强制更新不允许“稍后提醒”
- 级别:客户端 E2E
- 步骤:
S01服务端发布release_type=force;S02客户端检测更新;S03校验仅可“立即更新” - 预期:必须升级后继续使用
TC-FON-000057 更新下载失败时保持当前版本可用
- 级别:客户端 E2E
- 步骤:
S01模拟下载中断/磁盘不足;S02校验错误提示;S03校验当前版本仍可正常操作 - 预期:失败可恢复,不影响业务使用
TC-FON-000058 更新成功后重启生效并保留登录态
- 级别:客户端 E2E
- 步骤:
S01执行更新并下载完成;S02重启客户端;S03校验标题版本号更新且会话恢复 - 预期:升级成功且无需重新登录
C. 平台发布管理(Story 4)
TC-FON-000059 平台管理员可创建草稿版本
- 级别:API
- 步骤:
S01调用POST /api/release/updates/创建草稿;S02校验status=draft;S03校验版本记录可在列表查询到 - 预期:草稿创建成功
TC-FON-000060 版本号必须符合 SemVer
- 级别:API
- 步骤:
S01提交非法版本号(如1.2);S02校验 400;S03校验错误码RELEASE_VERSION_INVALID - 预期:非法版本号被拒绝
TC-FON-000061 发布后 latest 接口即时可见
- 级别:API
- 步骤:
S01将草稿改为published(PATCH);S02调用 latest;S03校验返回该版本 - 预期:发布即时生效
TC-FON-000062 同平台架构仅允许一个 published
- 级别:API
- 步骤:
S01已有一个 published;S02尝试并发发布第二个;S03校验冲突(409) - 预期:唯一生效版本约束成立
TC-FON-000063 版本下线后 latest 不再返回该版本
- 级别:API
- 步骤:
S01将已发布版本改archived;S02调用 latest;S03校验不返回已下线版本 - 预期:下线立即生效
TC-FON-000064 回滚接口将历史版本恢复为 published
- 级别:API
- 步骤:
S01调用POST /api/release/updates/{id}/rollback/;S02校验目标版本为published;S03校验原版本自动下线 - 预期:回滚原子完成
D. Heartbeat 与版本分布(Story 5)
TC-FON-000065 启动心跳首次上报创建记录
- 级别:API
- 步骤:
S01调用POST /api/release/heartbeats/;S02校验写入(tenant_id, device_id);S03校验launch_count=1 - 预期:首次上报成功
TC-FON-000066 启动心跳重复上报走 Upsert
- 级别:API
- 步骤:
S01对同(tenant_id,device_id)再次上报;S02校验未新增新行;S03校验launch_count+1且last_seen_at刷新 - 预期:符合 Upsert 语义
TC-FON-000067 版本分布统计按 24h 活跃口径
- 级别:API
- 步骤:
S01构造多版本心跳数据(含超 24h);S02调用GET /api/release/metrics/version-distribution/;S03校验仅统计最近 24h 活跃 - 预期:统计口径正确
TC-FON-000068 指定租户安装统计返回活跃+历史总数
- 级别:API
- 步骤:
S01调用GET /api/release/metrics/tenant-installs/?tenant_id=...;S02校验返回active_install_count_24h;S03校验返回historical_install_count - 预期:两个指标均返回且数值正确
TC-FON-000069 租户活跃榜按活跃安装数降序
- 级别:API
- 步骤:
S01调用GET /api/release/metrics/tenant-leaderboard/;S02校验字段包含tenant_code/tenant_name/active/historical;S03校验按活跃安装数降序 - 预期:排序与字段正确
TC-FON-000070 心跳接口拒绝未鉴权请求
- 级别:API
- 步骤:
S01未带会话访问 heartbeats;S02校验 401/403;S03校验无数据写入 - 预期:防伪造上报有效
TC-FON-000071 发布管理接口拒绝非平台管理员
- 级别:API
- 步骤:
S01租户管理员调用POST /api/release/updates/;S02校验 403;S03校验无新版本记录 - 预期:权限边界正确
TC-FON-000072 下载检测接口限流生效
- 级别:API
- 步骤:
S01同 IP 高频访问 latest;S02校验前 N 次成功;S03校验超阈值 429 - 预期:触发限流,保护服务
5. 工程实现指引(给测试开发工程师)
- 目录建议
tests/integration/release/test_us_release.pytests/e2e/release/test_tc_fon_000049_000072.spec.ts(预留)
- 命名规范
- 函数名必须带用例ID,例如:
def test_tc_fon_000062_single_published_constraint():
- 函数名必须带用例ID,例如:
- 步骤日志
- 每步打印 step_id,断言失败消息包含 step_id
- 报告产物
reports/release_run_<run_id>.json
- CI 门禁(阶段性)
- P0 API 用例(000050, 000053
000054, 000059000069, 000070~000072)必须全过
- P0 API 用例(000050, 000053
6. 变更规则
- 本模块新增用例从
TC-FON-000073继续递增 - 全项目继续使用单一序列,不得重号
- 历史 ID 仅可
deprecated,不得复用