13 KiB
13 KiB
RDAIReaderView 商用测试与发布计划
文档状态: Draft 0.1
最后更新: 2026-07-25
目标版本: RDAIReaderView 1.0
1. 目标
测试计划验证以下结论:
- AI 模块不会破坏现有 PDF、EPUB、搜索、标注和 TTS。
- 索引和引用在书籍更新、分页变化、OCR 和应用中断后仍然可靠。
- Foundation Models 的输出有证据、可拒答、不剧透并可安全降级。
- 性能、内存、耗电、隐私和可访问性达到商用要求。
- Prompt 或系统模型更新后,可以通过可重复评测发现质量回归。
2. 测试层级
人工与 TestFlight 验收
↑
UI / 真机系统测试
↑
PDF / EPUB / TTS 集成测试
↑
AI 产品评测与 Prompt 回归
↑
Core / Storage / NLP 单元测试
确定性校验优先放在单元测试;非确定性生成质量使用固定数据集、多次运行和人工评审。
3. 测试目标与 Target
建议新增:
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:
{
"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:
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/17:Foundation 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 建议
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 天。
- 完整日志仅限脱敏元数据。
阶段 B:5%
- 只开启摘要和问答。
- 观察 crash-free、取消率、拒答率、引用点击成功率。
- 人物关系仍受远程/本地 feature flag 控制。
阶段 C:25%
- 开启人物卡片。
- 关系图只对达到索引完整度的书籍开放。
- 至少稳定 7 天。
阶段 D:100%
- 所有发布门禁持续达标。
- 保留快速关闭 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 灰度指标稳定。