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