FNOS-023 测试用例
| 项目 | 内容 |
|---|---|
| 需求编号 | FNOS-023 |
| 计划编号 | PLAN-FNOS-023 |
| 覆盖功能 | FNOS-023-01 ~ FNOS-023-04 |
| 测试状态 | 通过 |
测试范围与需求分析
被测对象是 @tnnevol/dsh-codebuddy 插件对账号级受限(HTTP 403 + 业务码 11140 + 文案 request illegal)的识别与故障转移,以及配套的可见提示、受限账号排除与全部受限时的报错。
关键风险点
| 风险 | 用例方向 |
|---|---|
| 11140 同时承载模型级限流文案,误判成账号受限会导致无谓换号 | 两种文案分别断言 |
受限被误判为鉴权失败(AUTH)会让上层丢弃内存凭据 | 断言不返回 AUTH,且 401 仍为 AUTH |
| 受限账号被选为切换目标,切过去再失败一次 | 主动/被动两条决策路径都断言排除 |
| 受限触发被「自动切换」偏好拦住,账号受限时插件仍不可用 | 偏好关闭下仍应切换 |
| 切换提示不可见,用户不知道发生了什么 | 真实会话中断言提示文本出现 |
| 受限状态写入凭据文件 | 断言落盘结构未变化(受限只在进程内) |
测试环境
| 功能 | 执行环境 | 说明 |
|---|---|---|
| FNOS-023-01、02、04 | DSH Web;本地包级单测 | 真实受限账号 + 健康账号在本地 DSH Web(项目 .dsh profile)实测 |
| FNOS-023-03 | 本地包级单测 + DSH Web | 第二轮请求不再出现受限失败 |
| 全部功能 | DSH Desktop | 与 Web 共用同一宿主逻辑,本轮未单独走查(见测试结论的遗留项) |
被测插件不依赖 fnOS 专属能力,不要求真实 NAS 验收。
测试用例
FNOS-023-01 受限账号触发自动切换
| 用例 ID | 覆盖验收 | 用例 | 预期结果 | 优先级 |
|---|---|---|---|---|
| TC-001 | FNOS-023-01-AC-01 | 403 + 11140 + request illegal 的分类 | 返回 ACCOUNT_RESTRICTED | P0 |
| TC-002 | FNOS-023-01-AC-01 | 真实受限账号 + 健康账号,在 DSH Web 发一条消息 | 自动切换并成功完成本轮 | P0 |
| TC-003 | FNOS-023-01-AC-02 | 同上,观察界面 | 出现「账号被上游限制(需重新登录)…已自动切换至…」提示,且回复内容正常 | P0 |
| TC-004 | FNOS-023-01-AC-03 | 关闭「自动切换」偏好后重复 TC-002 | 仍触发切换(受限不受偏好限制) | P0 |
FNOS-023-02 切换提示说明真实原因
| 用例 ID | 覆盖验收 | 用例 | 预期结果 | 优先级 |
|---|---|---|---|---|
| TC-005 | FNOS-023-02-AC-01 | 三种触发原因分别生成提示 | 额度不足 / 被限流 / 账号受限(需重新登录)三种文案 | P1 |
| TC-006 | FNOS-023-02-AC-01 | 提示以完整流块产出 | 发出 block-start → text-delta → block-end 三块;不再只发裸 text-delta | P1 |
FNOS-023-03 受限账号恢复前不再被选中
| 用例 ID | 覆盖验收 | 用例 | 预期结果 | 优先级 |
|---|---|---|---|---|
| TC-007 | FNOS-023-03-AC-01 | 被动切换候选含受限账号 | 跳过受限,选其余可用账号 | P0 |
| TC-008 | FNOS-023-03-AC-01 | 主动切换候选含受限账号(即便额度更高) | 不切换 | P1 |
| TC-009 | FNOS-023-03-AC-01 | 全部候选受限 | 保持不动,由调用方报错 | P1 |
| TC-010 | FNOS-023-03-AC-01 | 同一会话第二轮请求(受限账号已被标记) | 不再出现受限失败 | P0 |
| TC-011 | FNOS-023-03-AC-02 | 重新登录该账号 | 受限标记被清除 | P1 |
| TC-012 | FNOS-023-03-AC-03 | 检查凭据文件 | 无受限相关字段写入 | P1 |
FNOS-023-04 全部受限时如实报错
| 用例 ID | 覆盖验收 | 用例 | 预期结果 | 优先级 |
|---|---|---|---|---|
| TC-013 | FNOS-023-04-AC-01 | 受限错误的对外文案 | 含「账号被上游限制,该账号需重新登录」并附上游原文 | P0 |
| TC-014 | FNOS-023-04-AC-02 | 内容拦截与鉴权失败语义 | CONTENT_BLOCKED 仍不换号;401 仍为 AUTH | P0 |
| TC-015 | FNOS-023-04-AC-02 | 受限错误不进可重试集合 | 重试策略不含 ACCOUNT_RESTRICTED | P0 |
测试执行结果
| 用例 | 环境 | 结果 | 日期 | 备注 |
|---|---|---|---|---|
| TC-001 | 单测 | 通过 | 2026-10-21 | tests/error-envelope.spec.ts |
| TC-002 | DSH Web + 真实账号 | 通过 | 2026-10-21 | 活动账号为受限账号(workbuddy),发出消息后自动切换至健康账号,本轮「已完成,用时 5 秒」 |
| TC-003 | DSH Web | 通过 | 2026-10-21 | 界面文本:[CodeBuddy] 账号被上游限制(需重新登录),账号「18298014993」,已自动切换至「13215565608」继续。 |
| TC-004 | 适配器级集成(桩 11140) | 通过 | 2026-10-21 | 适配器 autoSwitch: () => false,桩返回 403 + 11140 + request illegal:仍切换到真实账号并完成(finish: stop),提示「账号被上游限制(需重新登录)…已自动切换至…」,受限标记写入该账号 |
| TC-005 | 单测 | 通过 | 2026-10-21 | 三原因文本分支 |
| TC-006 | 单测 + DSH Web | 通过 | 2026-10-21 | 提示在界面可见(首版只发裸 delta,实测界面无提示,见 BUG-01) |
| TC-007 | 单测 | 通过 | 2026-10-21 | tests/switch-policy.spec.ts |
| TC-008 | 单测 | 通过 | 2026-10-21 | 同上 |
| TC-009 | 单测 | 通过 | 2026-10-21 | 同上 |
| TC-010 | DSH Web | 通过 | 2026-10-21 | 同会话第二轮:ACCOUNT_RESTRICTED 出现 0 次,两轮均 completed |
| TC-011 | 单测 | 通过 | 2026-10-21 | 登录路径清除标记 |
| TC-012 | 实测 | 通过 | 2026-10-21 | 凭据文件无受限字段;切号仅改 activeId |
| TC-013 | 单测 | 通过 | 2026-10-21 | 文案含「需重新登录」 |
| TC-014 | 单测 | 通过 | 2026-10-21 | CONTENT_BLOCKED 与 AUTH 语义未变 |
| TC-015 | 单测 | 通过 | 2026-10-21 | tests/retry-policy.spec.ts |
汇总:15 条通过、0 条失败、0 条未执行。
回归:插件 73 个测试文件 941 条用例全绿;typecheck 与 build 通过。
测试数据清理:活动账号已恢复为健康账号、自动切换已恢复开启;本地 DSH Web 进程已停止;临时凭据备份已删除。受限标记只在进程内,随进程结束消失。
证据修正记录:TC-004 首版曾用「DSH Web 界面 + prefs.autoSwitch = false」作为证据,但该字段在凭据文档中的正确结构是 { enabled, thresholdPct },直接写布尔值会被读取逻辑忽略、实际仍为开启(默认开启),因此那一次并不能证明「偏好关闭时受限仍换号」。现改为适配器级集成验证(显式传入 autoSwitch: () => false),结论以该用例为准;TC-002/TC-003 的界面切换与提示证据不受影响(提示只可能由请求级换号产出,与偏好无关)。
Bug 记录
| Bug | 描述 | 影响 | 状态 |
|---|---|---|---|
| BUG-01 | 切换提示首版只产出裸 text-delta,未按完整块协议(block-start/end)产出,宿主不会为它开块,界面完全看不到提示 | 用户不知道为何切换、也不知道该账号需重新登录 | 已修复:改为完整文本块,并给模型输出让出块 0(translate 增加起始索引参数) |
测试结论
FNOS-023 的 4 项功能验收通过:受限账号能触发自动切换(含偏好关闭的情况)、提示按原因说明且界面可见、受限账号在恢复前不再被选中、全部受限时如实报错;内容拦截与鉴权失败语义未受影响。
遗留项:
- DSH Desktop 未单独走查——本次改动全部在宿主侧,Web 与 Desktop 共用同一适配器与决策逻辑;按兼容基线仍建议补一次 Desktop 走查,登记为后续。
- 受限标记只在进程内,宿主重启后该账号会再失败一次(设计取舍,见计划风险三)。