状态:v0.1 QA 计划稿
所属子项目:02-P-NBL
Round:Round 1
日期:2026-06-02
输入文档:
Round 1 的 QA 目标不是证明“代码结构变漂亮了”,而是证明:
底层模型 Profile 改造没有破坏现有用户体验,并且为后续多模型接入提供了可验证的基础。
重点验证:
models/state.json 缺失、损坏、失效。models/sensevoice-zh。models/sensevoice。研发移交 QA 前必须提供:
未满足以上条件时,QA 可以拒绝进入正式验收,只做预检。
最低环境:
| 项目 | 要求 |
|---|---|
| OS | macOS,优先覆盖当前主要目标版本 |
| 芯片 | Apple Silicon 必测;Intel 如仍支持则抽测 |
| 网络 | 联网、断网两种状态 |
| 权限 | 麦克风未授权、已授权;辅助功能/输入权限按当前产品要求覆盖 |
| 模型目录 | 旧目录、新目录、新旧同时存在、损坏目录 |
测试数据目录建议:
privatevoice.src/testdata/round1/
建议包含:
models-valid-legacy/
models-valid-new/
models-incomplete-missing-tokens/
models-incomplete-missing-model/
models-zero-byte/
state-invalid-json/
state-points-to-legacy/
state-points-to-broken/
userdict.json
history.json
zh_short.wav
如果真实模型体积过大,自动化测试可以使用小型 fake file fixture;真实识别必须在真机手工测试中使用真实模型完成。
| ID | 场景 | 前置数据 | 网络 | 期望结果 |
|---|---|---|---|---|
| R1-QA-001 | 老用户旧目录 | 只有 models/sensevoice,文件完整 |
断网 | 不重新下载,能初始化和识别 |
| R1-QA-002 | 新用户无模型 | 无 models 目录 |
联网 | Onboarding 下载到 models/sensevoice-zh,校验通过 |
| R1-QA-003 | 新目录优先 | 新旧目录都完整,无 state | 断网 | 使用 models/sensevoice-zh |
| R1-QA-004 | state 指旧目录 | state path=sensevoice,旧目录完整 |
断网 | 使用旧目录,不迁移、不删除 |
| R1-QA-005 | state 非法 JSON | state.json 非法,新/旧目录完整 |
断网 | fallback 到目录探测 |
| R1-QA-006 | state 指坏目录 | state 指向不完整目录,旧目录完整 | 断网 | fallback 到旧目录 |
| R1-QA-007 | 缺 tokens | 目录只有模型文件 | 断网 | ModelExists=false,不初始化 engine |
| R1-QA-008 | 缺模型文件 | 目录只有 tokens.txt |
断网 | ModelExists=false,不初始化 engine |
| R1-QA-009 | 0 字节文件 | required file 为 0 字节 | 断网 | 模型不可用 |
| R1-QA-010 | int8 优先 | 同时有 model.int8.onnx 和 model.onnx |
断网 | 使用 int8 |
| R1-QA-011 | 下载失败保护 | 已有旧模型,下载 URL 失败 | 联网/断网 | 旧模型仍可用,旧目录未被破坏 |
| R1-QA-012 | 解压失败保护 | 已有旧模型,压缩包损坏 | 联网 | 不写入完整 state,旧模型仍可用 |
| R1-QA-013 | 重试下载 | 前一次下载失败 | 联网 | 再次下载可继续,不需手动清理 |
| R1-QA-014 | Wails API 兼容 | 任意有效模型状态 | 任意 | 旧 ModelExists / DownloadModel 调用可用 |
| R1-QA-015 | UI 不暴露新能力 | 任意模型状态 | 任意 | 不出现 Moonshine、Parakeet、Qwen3-ASR、语言选择、模型选择 |
| R1-QA-016 | replacement 回归 | 模型完整,词库含 replacement | 断网 | 识别结果经过 replacement |
| R1-QA-017 | 历史回归 | 模型完整,历史为空 | 断网 | 识别后新增历史 |
| R1-QA-018 | 权限回归 | 麦克风未授权 | 任意 | 不进入假录音状态,权限页可用 |
| R1-QA-019 | 权限已授权 | 麦克风已授权 | 断网 | 可录音、识别、上屏 |
| R1-QA-020 | macOS 真实使用 smoke | 模型完整 | 断网 | 菜单栏、Dock 策略、窗口层级、全屏/Split View 无明显回归 |
自动化优先覆盖确定性逻辑:
ModelRegistry 默认模型。LanguageRegistry 最小 zh-CN。allOf / anyOf。SelectedModelID 默认值。SelectedModelID 回退。建议命令:
cd privatevoice.src
go test ./...
如果新增前端相关改动,执行项目现有前端构建或检查命令。
models/sensevoice。models/state.json。通过标准:
models/sensevoice-zh 存在。models/state.json 存在。selectedModelId = sensevoice-zh。通过标准:
models/sensevoice。通过标准:
通过标准:
QA 结论必须记录:
建议输出:
02-P-NBL/round-1/qa-report-YYYYMMDD.md
QA 通过必须同时满足:
| 级别 | 定义 | 示例 |
|---|---|---|
| P0 | 阻塞发布,核心功能不可用或数据损坏 | 老用户升级后模型不可用;下载失败删除旧模型;用户词库丢失 |
| P1 | 主要路径失败或离线承诺破坏 | 已有模型断网不能识别;不完整模型导致崩溃;Wails 旧 API 断裂 |
| P2 | 局部功能异常,有绕过方式 | state 修复失败但不影响加载;错误文案不够清晰 |
| P3 | 轻微问题 | 日志不够明确;测试辅助文件残留但不影响使用 |