Files
ReadViewSDK/Doc/RDAIReaderView/RDAIReaderView-TEST-PLAN.md
T
2026-07-27 21:43:13 +08:00

474 lines
13 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# RDAIReaderView 商用测试与发布计划
**文档状态:** Draft 0.1
**最后更新:** 2026-07-25
**目标版本:** RDAIReaderView 1.0
## 1. 目标
测试计划验证以下结论:
1. AI 模块不会破坏现有 PDF、EPUB、搜索、标注和 TTS。
2. 索引和引用在书籍更新、分页变化、OCR 和应用中断后仍然可靠。
3. Foundation Models 的输出有证据、可拒答、不剧透并可安全降级。
4. 性能、内存、耗电、隐私和可访问性达到商用要求。
5. Prompt 或系统模型更新后,可以通过可重复评测发现质量回归。
## 2. 测试层级
```text
人工与 TestFlight 验收
UI / 真机系统测试
PDF / EPUB / TTS 集成测试
AI 产品评测与 Prompt 回归
Core / Storage / NLP 单元测试
```
确定性校验优先放在单元测试;非确定性生成质量使用固定数据集、多次运行和人工评审。
## 3. 测试目标与 Target
建议新增:
```text
RDAIReaderViewCoreTests
RDAIReaderViewNaturalLanguageTests
RDAIReaderViewFoundationModelsTests
RDPDFReaderViewAITests
RDEpubReaderViewAITests
ReadViewDemoAIUITests
```
Foundation Models 真机测试与普通 CI 分离,避免不支持模型的 Runner 造成假失败。
## 4. 测试数据
### 4.1 数据来源
只使用:
- 公版书籍。
- 项目拥有测试授权的书籍。
- 团队自行编写的合成文本。
- 经过脱敏、明确允许进入测试仓库的样本。
不得把商业书籍全文或用户内容提交到测试仓库。
### 4.2 数据集组成
首版至少包含:
| 类型 | 最低数量 | 重点 |
|------|----------|------|
| 中文小说章节 | 20 | 多人物、别名、代词、倒叙、否定关系 |
| 英文小说章节 | 10 | 名称大小写、代词、长句 |
| 中文技术/非虚构 | 10 | 术语、组织、事实问答 |
| 英文技术/非虚构 | 10 | 代码块、列表、表格 |
| 原生文本 PDF | 5 本/50 页 | 单栏、双栏、页眉页脚 |
| 扫描 PDF | 5 本/50 页 | OCR 错字、旋转、低清晰度 |
| EPUB | 5 本/30 章 | CFI、脚注、长章节、重排 |
| 无答案问题 | 20 | 拒答 |
| 剧透边界问题 | 20 | 已读/未读范围隔离 |
| 同名或别名关系 | 20 | 实体合并准确性 |
首版产品评测集不少于 100 个 Case。每个 Case 保存输入、允许范围、期望证据、可接受答案要点和禁止行为。
### 4.3 Case 格式
建议使用 JSONL
```json
{
"id": "qa-zh-001",
"task": "questionAnswering",
"documentFixture": "novel-zh-01",
"readScope": {
"resourceOrderUpperBound": 3,
"utf16UpperBound": 8200
},
"input": "林川为什么离开村庄?",
"expectedPassageIDs": ["p-3-18", "p-3-19"],
"requiredFacts": ["受到追捕"],
"forbiddenFacts": ["第四章之后的身份揭示"],
"expectedStatus": "answered"
}
```
测试结果不得把 fixture 原文写入可上传日志。
## 5. Core 单元测试
### 5.1 文本范围
- 空文本、空白文本和超长文本。
- Emoji、组合字符、代理对、中文标点和换行。
- UTF-16 范围与 Swift String Index 双向转换。
- 搜索规范化不能改变 source range。
- Passage 重叠不能产生错误 Locator。
### 5.2 哈希与失效
- 相同内容产生相同哈希。
- 只改变一个章节时只失效该资源。
- Prompt 版本变化只失效相关 Artifact。
- embedding 模型 revision 变化只重建对应向量。
- 阅读范围扩大不复用越界缓存。
### 5.3 存储与迁移
- 首次建库、重复打开和并发读取。
- 每个 Schema 版本向下一版本迁移。
- 迁移中断后恢复或回滚。
- 数据库损坏时保留诊断并可安全重建。
- 按书删除和删除全部数据。
- 登出/删书回调后无孤立 Passage、向量或 Artifact。
### 5.4 索引调度
- 当前章节优先。
- 暂停、恢复、取消和重复 prepare。
- 应用强制退出后从 checkpoint 恢复。
- 内存警告取消低优先级任务。
- 内容 Provider 释放后任务安全失败,不野指针或永久等待。
## 6. Natural Language 测试
### 6.1 语言与分句
- 中文、英文、中英混排。
- 无标点长段落。
- 缩写、小数、网址和引号。
- 句子范围与 RDSpeechReaderView 结果一致。
- 不支持语言的降级分块。
### 6.2 实体
按任务统计 Precision、Recall、F1
```text
precision = 正确识别实体 / 所有识别实体
recall = 正确识别实体 / 所有标注实体
F1 = 2 * precision * recall / (precision + recall)
```
首版门槛:
- 人物候选 Precision ≥ 0.95。
- 人物候选 Recall ≥ 0.85。
- 地点/组织作为辅助信息,F1 ≥ 0.80。
人物候选宁可少召回,也不能大量创建虚假人物。
### 6.3 检索
- 关键词命中、同义表达、别名和错别字。
- Top 5 包含正确证据的 Recall@5 ≥ 0.90。
- 无 embedding 资源时词法检索仍可返回结果。
- 已读范围外 Passage 召回数必须为 0。
- 相同输入和索引版本的词法结果顺序稳定。
## 7. PDF Adapter 测试
- 原生文本 run 按 `readingOrder` 正确拼接。
- 双栏页面不会按几何坐标错误穿插。
- run 间换行计入 UTF-16 范围。
- Passage 范围映射回正确 normalized rects。
- characterRects 存在/缺失均可高亮。
- OCR 与原生文本来源正确标记。
- OCR 缓存命中、失败、取消和重试。
- 页面缓存裁剪后 Citation 仍可重新加载。
- 跳转后目标页和高亮正确。
- 旋转、横屏、竖滑、双页模式下高亮位置正确。
- 页面导航取消 OCR 时,AI 索引任务不应永久丢失。
PDF 引用定位有效率必须 ≥ 99%。
## 8. EPUB Adapter 测试
- `href` 规范化一致。
- UTF-16 range、rangeAnchor、CFI 和 rangeCFI 互相映射。
- 改字号、行距、边距、字体和横竖屏后 Citation 可恢复。
- 长章节按需加载时可提取目标资源。
- 脚注、列表、图片替代文本和代码块类型正确。
- EPUB 更新导致 source hash 变化时旧 Citation 标记 stale。
- CFI 缺失时 progression 只作兜底。
- 引用跳转复用标准位置恢复流程。
- 固定版式无文本章节返回明确不可分析状态。
EPUB 重排后引用定位有效率必须 ≥ 99%。
## 9. Foundation Models 产品评测
### 9.1 运行方式
- 每个 Case 至少运行 3 次,避免偶然结果掩盖问题。
- 按系统模型版本、系统语言和设备分桶。
- Prompt 新版本同时运行旧版和新版,生成差异报告。
- 代码校验先执行,再进入人工/模型评分。
### 9.2 摘要 Rubric
| 分数 | 标准 |
|------|------|
| 5 | 覆盖关键事件,全部有证据,无未读信息,表述简洁 |
| 3 | 基本正确但遗漏一项重要内容,或引用不够精确 |
| 1 | 包含无证据事实、重大误解或剧透 |
发布门槛:
- 平均分 ≥ 4.0。
- 任一剧透 Case 失败即阻断发布。
- 无证据事实比例 ≤ 2%。
### 9.3 问答 Rubric
检查:
- 是否回答用户问题。
- 每个事实是否被引用支持。
- 是否遗漏关键反证。
- 证据不足时是否拒答。
- 是否泄漏未读内容。
发布门槛:
- Context faithfulness ≥ 98%。
- 无答案正确拒答率 ≥ 95%。
- Citation validity ≥ 99%。
- Spoiler safety = 100%。
### 9.4 人物与关系 Rubric
检查:
- 人物真实出现。
- 别名有明确证据。
- 同名人物未误合并。
- 关系方向正确。
- `confirmed``possible` 分类合理。
- 冲突关系没有被静默覆盖。
发布门槛:
- Character precision ≥ 97%。
- Alias merge precision ≥ 98%。
- 关系证据覆盖率 = 100%。
- 无证据关系数 = 0。
### 9.5 LLM Judge
LLM Judge 只作为辅助:
- 使用固定 Rubric,不使用泛化“是否有帮助”问题。
- 先对至少 30 个 Case 与人工评分校准。
- Spearman/Pearson 相关性低于 0.7 时不得作为发布门禁。
- Judge 分歧、低分和边界 Case 必须人工复核。
- 若使用云端 Judge,测试原文必须为可上传的公版或合成数据。
## 10. 可用性与错误测试
覆盖:
- iOS 15/17Foundation Models 模块不参与运行。
- iOS 26+ 不支持设备。
- Apple Intelligence 未开启。
- 模型正在下载或未准备。
- 当前语言不支持。
- context limit exceeded。
- guardrail 拒绝输入或输出。
- 生成中取消、切书、关闭页面、进入后台。
- 同一 session 并发请求。
- 低存储空间和数据库写入失败。
每种情况必须产生稳定枚举状态,并保持阅读器可操作。
## 11. UI 与可访问性
### 11.1 UI 自动化
- 打开/关闭 AI 面板。
- 当前章节索引状态。
- 发起问题、取消和重试。
- 点击引用并跳转高亮。
- 仅已读范围默认开启。
- 整本书模式确认。
- Foundation Models 不可用状态。
- 清除本书和全部 AI 数据。
- AI 结果交给 TTS 朗读。
### 11.2 可访问性
- VoiceOver 顺序和标签。
- Dynamic Type 最大辅助字号。
- Reduce Motion。
- 深色模式和高对比度。
- `possible`/`conflicting` 不只依赖颜色。
- 加载、取消和失败状态有可访问性公告。
## 12. 性能与资源测试
目标设备至少覆盖:
- 最低性能 iOS 15 支持设备。
- iOS 17 中档设备。
- 一台首代支持 Apple Intelligence 的设备。
- 一台当前系统的高性能设备。
基准:
| 指标 | 1.0 目标 |
|------|----------|
| 当前章节基础索引 P95 | ≤ 2 秒 |
| 10 万中文字基础索引 P95 | ≤ 30 秒 |
| 本地检索 P95 | ≤ 300 ms |
| 生成首个可展示结果 P95 | ≤ 5 秒 |
| 引用跳转 P95 | ≤ 500 ms,不含未缓存页面加载 |
| 索引峰值额外内存 | 目标 ≤ 150 MB,按真机基线确认 |
| 空闲内存释放 | 30 秒内释放 embedding 和大文本缓存 |
| AI crash-free session | ≥ 99.9% |
测试同时记录:
- CPU time。
- 主线程卡顿。
- thermal state。
- 电量变化。
- 数据库大小/万字。
- embedding 资源加载耗时。
- 缓存命中率。
性能基线变化超过 15% 时 CI 或发布报告必须提示。
## 13. 隐私与安全测试
- 网络抓包确认默认实现不上传书籍或问题。
- 搜索日志、控制台日志和 crash breadcrumbs 不含原文。
- 清除 AI 数据后数据库、缓存和临时文件均删除。
- 删除书籍和退出账户触发相同清除路径。
- Scope 过滤在检索前和生成后均执行。
- 构造伪造 Passage ID,确认 Citation Validator 拒绝。
- 构造路径、超长查询和大量 Tool 参数,确认边界限制。
- Tool Calling 最大次数和重复调用检测生效。
- 数据库迁移和诊断包不泄漏原文。
## 14. 回归测试
每次合入必须运行:
- Core 单元测试。
- Natural Language 确定性测试。
- PDF/EPUB Adapter fixture 测试。
- 现有 PDF、EPUB 和 TTS 编译。
- `git diff --check` 和公共 API 兼容检查。
每日或候选发布运行:
- UI smoke。
- 完整 AI 评测集。
- 大书索引性能。
- Foundation Models 真机矩阵。
- 现有 `ReadViewDemoUITests` 回归。
## 15. CI 建议
```text
PR:
lint/diff-check
Core unit tests
NLP unit tests
Adapter tests
build iOS 15 target
build iOS 26 FoundationModels target
Nightly:
Full reader UI regression
AI deterministic evals
Performance fixtures
Release candidate:
Foundation Models physical-device eval
Human review sample
Privacy/network audit
Migration matrix
```
设备模型评测结果应保存以下元数据:
- OS 版本。
- 模型版本或可识别 profile。
- Prompt identifier/version。
- fixture version。
- SDK commit。
- 各指标与失败 Case ID。
不得保存生产用户原文。
## 16. 缺陷分级
### P0
- 泄漏书籍内容或阅读历史。
- 绕过已读范围造成剧透。
- 删除用户原书、标注或笔记。
- 大面积崩溃或数据库不可恢复损坏。
### P1
- 无引用或错误引用的事实作为确定答案展示。
- 人物关系大面积误合并。
- Foundation Models 不可用导致阅读器不可用。
- 引用跳转到错误章节/页面。
### P2
- 摘要遗漏、检索质量下降、局部 UI 或性能问题。
- 可重试且不影响阅读主流程的生成失败。
发布时 P0/P1 必须为 0;P2 必须有明确接受记录和后续版本计划。
## 17. TestFlight 灰度
### 阶段 A:内部
- 团队和测试设备。
- 至少 7 天。
- 完整日志仅限脱敏元数据。
### 阶段 B5%
- 只开启摘要和问答。
- 观察 crash-free、取消率、拒答率、引用点击成功率。
- 人物关系仍受远程/本地 feature flag 控制。
### 阶段 C25%
- 开启人物卡片。
- 关系图只对达到索引完整度的书籍开放。
- 至少稳定 7 天。
### 阶段 D100%
- 所有发布门禁持续达标。
- 保留快速关闭 Foundation Models 功能的配置,但关闭后基础阅读和 NLP 正常。
## 18. 最终发布门禁
- [ ] 五份开发文档与实现一致。
- [ ] 公共 API 兼容检查通过。
- [ ] Core/NLP/Adapter 单元和集成测试通过。
- [ ] 现有 Reader 与 TTS 回归通过。
- [ ] 100+ AI Case 全量运行并达到指标。
- [ ] Foundation Models 支持与不支持路径均完成真机测试。
- [ ] PDF/EPUB Citation validity ≥ 99%。
- [ ] Context faithfulness ≥ 98%。
- [ ] Spoiler safety = 100%。
- [ ] AI crash-free session ≥ 99.9%。
- [ ] 隐私和网络审计通过。
- [ ] 无 P0/P1 缺陷。
- [ ] TestFlight 灰度指标稳定。