ReadViewSDK/Doc/FeatureSolution/样书基线验证方案讨论.md
2026-05-21 19:40:51 +08:00

440 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.

# 样书基线验证方案讨论
## 需求背景
`Doc/EPUB_MAINTENANCE.md` 已将“样书基线验证”列为 EPUB 阅读器下一阶段的高优先级能力之一。
当前阅读器已经具备:
1. EPUB 打开与解析
2. WebView / DTCoreText / fixed-layout 三条正文渲染路径
3. 目录跳转、阅读位置恢复、字号与主题调整
4. 高亮、划线、批注、搜索等阅读交互能力
但这些能力目前主要还是依赖“人手点一遍”来判断是否正常,缺少固定样书、固定流程、固定输出格式的基线验证机制。
因此,“样书基线验证”这项需求的目标,不是再增加几本 demo 书,而是基于当前已内置的四本 EPUB 样书,建立一套:
1. 可重复执行
2. 可横向比较
3. 可长期沉淀
4. 可逐步自动化
的阅读器基线验证机制。
## 代码事实
### 已有基础
当前仓库已经具备样书基线验证所需的基本条件:
1. `ReadViewSDKDemo/ReadViewSDKDemo/Resources/` 内已经内置四本 EPUB 样书
2. `RDReaderManager.bundledEPUBURLs(in:)` 会自动枚举 bundle 中所有 `.epub`
3. `RDReaderManager.demoBookItems(in:)` 已将这些样书接入 demo 书架入口
4. `ViewController` 支持通过 `-demo-book-title` 启动参数自动打开指定样书
这意味着当前并不缺“样书载体”或“执行入口”,更缺的是:
1. 哪本样书用于验证哪类能力
2. 每次验证时要记录哪些数据
3. 什么叫验证通过
4. 如何把结果沉淀成可比较的基线
### 当前实现存在的问题
#### 问题 1四本样书当前只是 demo 资源,不是正式基线夹具
现在这四本书更多承担“可打开、可展示”的职责,但还没有被正式定义为:
1. 固定基线样书
2. 各自覆盖的风险场景
3. 必测能力清单
4. 异常归档与复验对象
#### 问题 2当前没有统一的基线指标结构
`Doc/EPUB_MAINTENANCE.md` 已明确提到要补齐:
1. 分页耗时
2. 目录命中率
3. 末页事件
4. 设置恢复稳定性
但当前还没有统一规定:
1. 指标如何采集
2. 指标如何记录
3. 指标的通过标准是什么
4. 下次如何与这次比较
#### 问题 3样书验证目标混杂了性能、正确性与兼容性
“样书基线验证”至少同时包含三类验证目标:
1. 性能基线:分页耗时、页数规模
2. 正确性基线:目录跳转、末页事件、位置恢复
3. 兼容性基线:不同 EPUB 类型在不同渲染路径下是否稳定
如果不拆开,执行时很容易退化成“随便翻一下,感觉没问题”。
## 需求拆解
建议把“样书基线验证”拆成四部分来推进。
### 1. 固定样书集
先把四本样书从“demo 资源”提升为“固定基线夹具”,后续版本迭代尽量不随意替换。
### 2. 固定样书职责
每本样书都明确它主要覆盖哪些风险,而不是所有书都做完全相同的验证。
### 3. 固定基线指标
每次验证时都按同一组字段记录结果,保证可比较。
### 4. 固定验证流程与输出模板
每轮验证都按统一步骤执行,并把结果写入统一模板,避免结论只停留在口头描述。
## 技术路线对比
### 路线 A完全手工验证
思路:
1. 打开四本样书
2. 手工翻页、点目录、调字号
3. 用主观结论判断是否正常
优点:
1. 上手快
2. 不需要额外改工程
风险:
1. 结果不稳定
2. 不同人执行结论可能不同
3. 无法形成长期可比较的基线
### 路线 B一开始就全量自动化
思路:
1. 直接把四本样书的打开、翻页、跳转、恢复全部接入 UI 自动化或脚本采集
2. 让基线数据自动产出
优点:
1. 理想状态下最规范
2. 长期收益高
风险:
1. 前期成本大
2. 当前测试基础设施还不完整
3. 部分阅读体验问题在第一阶段更适合半自动确认
### 路线 C先建立半自动基线再逐步自动化
思路:
1. 先固定样书矩阵与基线字段
2. 借助现有 demo 自动打开入口执行统一验证流程
3. 先沉淀结构化结果
4. 再将适合自动化的部分逐步纳入 XCTest / XCUITest
优点:
1. 投入和收益平衡更好
2. 能更快形成第一版基线
3. 不会被早期自动化建设阻塞
风险:
1. 需要纪律性执行模板
2. 初期仍有部分验证依赖人工操作
### 推荐结论
建议采用:
**主路线:路线 C先建立半自动样书基线再逐步自动化**
原因:
1. 当前仓库已经有四本固定样书和自动打开入口
2. 样书基线验证的第一目标是“有可比较的结果”,而不是“立刻完全自动化”
3. 自动化测试体系尚在建设中,先立住基线矩阵更划算
## 推荐方案
### 方案总览
样书基线验证第一阶段建议形成如下结构:
1. 固定四本样书,不随意替换
2. 每本样书绑定主要验证职责
3. 每轮版本验证按统一流程执行
4. 每次都输出结构化基线表
5. 对异常项保留备注与复验结论
### 四本样书矩阵
> 以下矩阵以当前样书名称和文档信息为基础readingProfile 可在首次正式基线验证时补齐实测结果。
| 样书 | 主要定位 | 重点验证能力 | 适合记录的核心指标 |
|------|----------|--------------|--------------------|
| `爱忘事的熊爷爷.epub` | 轻量快速回归样书 | 打开成功、基础分页、目录基本可用、设置恢复 | 打开耗时、总页数、TOC 基本命中、设置恢复 |
| `张学良传.epub` | 标准长文 reflowable 样书 | 长文分页、目录跳转、字号变化后位置恢复 | 首次分页耗时、TOC 命中率、字号调整后恢复 |
| `宝山辽墓材料与释读.epub` | 复杂结构与学术内容样书 | 复杂 TOC / fragment 命中、图片与正文结构稳定性、搜索与标注抽样 | TOC 命中率、fragment 命中、搜索命中、高亮恢复 |
| `《凡人修仙传》精校版全本.epub` | 大体量长书与压力样书 | 大体量分页稳定性、持久化恢复、末页事件、长时阅读链路 | 分页耗时、总页数、末页事件、重进恢复稳定性 |
### 推荐验证维度
第一阶段建议围绕下面这些维度建立固定基线:
1. 打开是否成功
2. readingProfile 类型
3. spine 数量
4. 总页数是否合理
5. 首次分页耗时
6. TOC 是否可打开
7. TOC 抽样命中率
8. 末页事件是否正常触发
9. 字号调整后位置是否稳定恢复
10. 主题 / 设置是否稳定恢复
11. 重进后阅读位置是否恢复
12. 标注或高亮是否恢复
其中第一阶段最核心的四项,应与 `Doc/EPUB_MAINTENANCE.md` 对齐:
1. 分页耗时
2. 目录命中率
3. 末页事件
4. 设置恢复稳定性
## 推荐执行流程
建议每本样书都按同一流程执行,避免漏项。
### Step B1冷启动打开样书
目标:
1. 验证样书可正常进入阅读器
2. 记录首次打开与首次分页表现
记录:
1. 是否打开成功
2. readingProfile
3. spine 数量
4. 总页数
5. 首次分页耗时
### Step B2目录抽样验证
目标:
1. 验证 TOC 是否能正常打开
2. 验证典型目录项是否能跳转到正确章节或语义位置
建议:
1. 每本样书至少抽样 3 到 5 个目录项
2. 包含开头、中间、靠后位置
3. 如果目录层级复杂,额外抽样一个带 fragment 的条目
记录:
1. 抽样条目数
2. 命中数
3. 命中率
4. 失败条目与现象
### Step B3末页事件验证
目标:
1. 验证阅读器到达末页时的状态变化是否正确
2. 检查不会提前触发或漏触发
记录:
1. 是否到达末页
2. 末页事件是否正常触发
3. 是否出现重复触发或不触发
### Step B4设置恢复稳定性验证
目标:
1. 修改字号、主题或其他关键阅读设置
2. 验证设置变更后分页是否稳定
3. 验证退出重进后设置是否恢复
记录:
1. 修改的设置项
2. 修改后是否立即生效
3. 重进后是否恢复
4. 是否伴随位置飘移或异常白页
### Step B5位置与标注恢复抽样验证
目标:
1. 在样书中间位置退出重进
2. 验证阅读位置恢复
3. 抽样验证一条高亮或标注恢复
记录:
1. 退出前位置
2. 重进后位置
3. 是否在同一章节或邻近语义位置
4. 高亮 / 标注是否仍存在
## 基线表模板
建议每轮验证都至少产出两张表:
1. 总览表
2. 单书详情表
### 模板 1样书基线总览表
| 日期 | 版本 / 分支 | 样书 | readingProfile | spine 数量 | 总页数 | 首次分页耗时 | TOC 抽样 / 命中 | 末页事件 | 设置恢复 | 位置恢复 | 标注恢复 | 结论 | 备注 |
|------|--------------|------|----------------|------------|--------|--------------|-----------------|----------|----------|----------|----------|------|------|
| YYYY-MM-DD | branch / commit | 爱忘事的熊爷爷 | 待填 | 待填 | 待填 | 待填 | 待填 | 待填 | 待填 | 待填 | 待填 | 通过 / 风险 / 失败 | 待填 |
| YYYY-MM-DD | branch / commit | 张学良传 | 待填 | 待填 | 待填 | 待填 | 待填 | 待填 | 待填 | 待填 | 待填 | 通过 / 风险 / 失败 | 待填 |
| YYYY-MM-DD | branch / commit | 宝山辽墓材料与释读 | 待填 | 待填 | 待填 | 待填 | 待填 | 待填 | 待填 | 待填 | 待填 | 通过 / 风险 / 失败 | 待填 |
| YYYY-MM-DD | branch / commit | 《凡人修仙传》精校版全本 | 待填 | 待填 | 待填 | 待填 | 待填 | 待填 | 待填 | 待填 | 待填 | 通过 / 风险 / 失败 | 待填 |
### 模板 2单书详细验证表
#### 样书信息
| 字段 | 值 |
|------|----|
| 样书名称 | 待填 |
| 文件大小 | 待填 |
| readingProfile | 待填 |
| spine 数量 | 待填 |
| TOC 条目数 | 待填 |
| 总页数 | 待填 |
| 验证日期 | 待填 |
| 验证版本 / 分支 | 待填 |
#### 核心基线结果
| 项目 | 结果 | 备注 |
|------|------|------|
| 打开成功 | 通过 / 失败 | 待填 |
| 首次分页耗时 | 待填 | 单位建议统一为 ms 或 s |
| TOC 打开 | 通过 / 失败 | 待填 |
| TOC 抽样命中率 | 待填 | 例如 `4/5` |
| 末页事件 | 通过 / 风险 / 失败 | 待填 |
| 字号调整后恢复 | 通过 / 风险 / 失败 | 待填 |
| 主题 / 设置恢复 | 通过 / 风险 / 失败 | 待填 |
| 重进后位置恢复 | 通过 / 风险 / 失败 | 待填 |
| 高亮 / 标注恢复 | 通过 / 风险 / 失败 | 待填 |
#### TOC 抽样记录
| 序号 | TOC 条目 | 预期目标 | 实际结果 | 是否命中 | 备注 |
|------|----------|----------|----------|----------|------|
| 1 | 待填 | 待填 | 待填 | 是 / 否 | 待填 |
| 2 | 待填 | 待填 | 待填 | 是 / 否 | 待填 |
| 3 | 待填 | 待填 | 待填 | 是 / 否 | 待填 |
| 4 | 待填 | 待填 | 待填 | 是 / 否 | 待填 |
| 5 | 待填 | 待填 | 待填 | 是 / 否 | 待填 |
#### 异常与复验记录
| 异常编号 | 场景 | 现象 | 复现条件 | 当前结论 | 备注 |
|----------|------|------|----------|----------|------|
| B-001 | 待填 | 待填 | 待填 | 待确认 / 已复现 / 已修复 | 待填 |
## 推荐输出规范
为了让基线真正可比较,建议每轮验证输出时统一遵守以下规范:
### 1. 样书集固定
第一阶段尽量只使用当前这四本 EPUB不随意更换避免基线漂移。
### 2. 字段命名固定
例如:
1. `首次分页耗时`
2. `TOC 抽样命中率`
3. `末页事件`
4. `设置恢复`
5. `位置恢复`
尽量不要每次换表头名称。
### 3. 结论分级固定
建议统一使用:
1. `通过`
2. `风险`
3. `失败`
其中:
1. `通过`:功能符合预期,无明显异常
2. `风险`:功能基本可用,但存在偏差、偶发不稳或需继续观察
3. `失败`:功能不符合预期,影响可用性
### 4. 差异说明固定
如果与上次基线相比发生变化,建议在备注中明确:
1. 是否变快
2. 是否变慢
3. 是否命中率下降
4. 是否新增异常
5. 是否已有异常被修复
## 风险与注意点
### 风险 1把基线验证做成纯主观体验记录
如果只有“感觉正常”“翻起来没问题”这类结论,后续几乎无法比较。
### 风险 2过度依赖绝对页码
页码会受到字号、行距、视口与渲染策略影响,样书基线更适合比较:
1. 是否能正常分页
2. 是否恢复到同章节或邻近语义位置
3. 是否出现明显回归
而不是执着于固定页号完全一致。
### 风险 3样书职责不清导致验证重复或漏项
如果四本书都做完全相同的验证,会浪费时间;如果每本书都“随便点几下”,又会漏掉高风险场景。
## 推荐实施顺序
如果目标是“最小投入换最大稳定性提升”,建议按下面顺序推进:
1. 先将四本样书正式定义为固定基线样书
2. 先用本文件中的矩阵与模板跑第一轮人工基线
3. 在第一轮基线中补齐每本样书的实测 `readingProfile`、spine 数量、总页数等信息
4. 统一记录异常项与复验结论
5. 再将其中适合自动化的部分逐步并入 `XCTest / XCUITest`
## 推荐结论
“样书基线验证”这项需求,建议最终收敛为下面这句话:
**基于当前 demo 内置的四本固定 EPUB 样书,建立一套统一矩阵、统一流程、统一模板的基线验证机制,首期重点覆盖分页耗时、目录命中率、末页事件和设置恢复稳定性,并为后续自动化回归提供稳定样书夹具。**