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

13 KiB

样书基线验证方案讨论

需求背景

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 样书,建立一套统一矩阵、统一流程、统一模板的基线验证机制,首期重点覆盖分页耗时、目录命中率、末页事件和设置恢复稳定性,并为后续自动化回归提供稳定样书夹具。