signature.md 7.2 KB

测试用例 · 手签名实现方式重写(竖屏直签 + canvas 2d)

关联 SRS:docs/superpowers/specs/2026-11-09-signature-canvas2d-rewrite.md(需求编号 DOC-2026-11-09-signature-canvas2d-rewrite,状态:待开发)。 取代:docs/superpowers/specs/2026-11-08-signature-landscape-fix.md(整份作废,见 §历史)与旧台账(横屏 TC-SIG-01~05 系列已作废归档)。 能力键:signature.canvas2d.rewrite(前端 UI 纵切,无独立后端接口)。 涉改文件:cfc-frontend/pages/signature/signature.vue(S4-1 竖屏直签)、cfc-frontend/pages/signature/components/hand-signature/hand-signature.vue(S4-2 canvas 2d,位于 signature 子包内)。 派生自 user-scenarios/ 的家长/孩子签名回传场景(health-plan-summary / checkout / consignee-edit 跳转进入)。

TC 编号 所属场景 模块 角色 优先级 类型 前置条件 测试步骤 预期结果 关联需求/设计 对应 e2e
TC-SIG2D-01 SIG-1 签名·去横屏化 家长/孩子 P0 功能 进入签名页(任意机型) 1. 检查 signature.vue script 不再存在 enterLandscape()/restorePortrait() 方法及其 onLoad/onUnload 调用(S4-1) S4-1 删除横屏方法 —
TC-SIG2D-01b SIG-1 签名·去横屏化 家长/孩子 P0 功能 进入签名页 1. 检查模板与样式 无 h5DegradeHint / .rotate-hint 模板块与样式(S4-1 删除 H5 降级提示) S4-1 删除降级提示 —
TC-SIG2D-01c SIG-1 签名·去横屏化 家长/孩子 P0 功能 进入签名页 1. 检查源码 不再调用 wx.setPageOrientation / screen.orientation.lock(不再依赖不可靠横屏能力) S4-1 去横屏依赖 —
TC-SIG2D-02 SIG-1 签名·竖屏布局 家长/孩子 P0 兼容 竖屏进入签名页 1. 竖屏下查看画布高度 computeCanvasHeight() 保留竖屏计算:windowHeight − reserved(requireAgree 214 / 否则 174),且不低于 160 下限 S4-1 保留 computeCanvasHeight —
TC-SIG2D-03 SIG-2 签名·canvas 2d 家长/孩子 P0 功能 渲染签名组件 1. 检查组件模板 <canvas :id="canvasId" type="2d">,不再使用 canvas-id 旧式绑定 S4-2 模板 2d 化 —
TC-SIG2D-03b SIG-2 签名·canvas 2d 家长/孩子 P0 功能 渲染签名组件 1. 检查组件 data `canvasId: 'hsCanvas_'+(this._uid 0)多实例唯一;_canvasNode: null`(导出用 2d 节点)
TC-SIG2D-04 SIG-2 签名·canvas 2d 家长/孩子 P0 功能 mounted 初始化 1. 检查 mounted 逻辑 走 createSelectorQuery().in(this).select('#'+canvasId).fields({node:true,size:true,rect:true}),不再用 .select('.signature-canvas').boundingClientRect 缓存 rect S4-2 初始化 —
TC-SIG2D-05 SIG-2 签名·坐标修复 家长/孩子 P0 功能 触摸书写 1. 书写签名 触摸坐标优先 t.x/t.y(type=2d 相对画布,不再依赖缓存 rect);兜底 t.clientX − _rectLeft/_rectTop S4-2 触摸坐标 —
TC-SIG2D-06 SIG-2 签名·笔迹可见 家长/孩子 P0 功能 书写签名 1. 书写时观察笔迹 onTouchMove 用 ctx.stroke() 同步绘制,无异步 ctx.draw()(笔迹实时可见,根因 R2 修复) S4-2 同步绘制 —
TC-SIG2D-07 SIG-2 签名·导出/清空 家长/孩子 P0 功能 已绘制 1. 确认导出 2. 重写清空 导出 canvasToTempFilePath({canvas:this._canvasNode,...})(2d 节点,非 canvasId);清空 ctx.clearRect 同步,无 ctx.draw() S4-2 导出/清空 —
TC-SIG2D-08 SIG-3 签名·契约不回归 家长/孩子 P1 回归 三调用方跳转 1. 从 health-plan-summary / checkout / consignee-edit 进入 2. 签名回传 组件对外契约不变:props(value/strokeColor/strokeWidth/height/requireAgree/agreeText)+ emit(confirm/clear/agree-change)保持,调用方无感 S4-3 不回归 —

异常流用例(派生自正常流)

TC 编号 所属场景 模块 角色 优先级 类型 前置条件 测试步骤 预期结果 关联需求/设计 对应 e2e
TC-SIG2D-01-E SIG-2 签名·2d 初始化失败 家长/孩子 P2 异常 fields size/rect 均无效 1. 初始化失败路径 失败时 console.log + 定时器重试一次;_destroyed 时停止(参照 RadarChart,不静默) S4-2 初始化防御 —
TC-SIG2D-02-E SIG-2 签名·导出降级 家长/孩子 P2 异常 H5 / 无文件系统 1. H5 端确认导出 H5 直接传 dataURL;小程序 fs.readFile 转 base64 既有链路保持不变 S4-2 导出保持既有链路 —

权限流用例(派生自正常流)

本特性为纯前端 UI 纵切,无独立权限维度;权限沿用进入签名页的上游角色(家长/孩子),不单列权限流。

非功能测试用例

TC 编号 所属场景 模块 角色 优先级 类型 前置条件 测试步骤 预期结果 关联需求/设计 对应 e2e
TC-SIG2D-N01 SIG-2 签名·多端兼容 家长/孩子 P1 兼容 iOS / 安卓真机或等效工具 1. 两平台(含无法自动横屏的机型)竖屏进入签名页 2. 书写 任意机型竖屏可签,无横屏依赖;笔迹实时可见 S4-1/S4-2 —
TC-SIG2D-N02 SIG-2 签名·既有 2d 组件不回归 家长/孩子 P1 回归 雷达图/沙盘/趋势图/mbti 页面 1. 抽查项目内既有 2d 组件 未触碰(radar/trend/family/wuxing/mbti/ability 等 10+ 处不受影响) S4-3 不回归 —

状态

  • 上述用例随 SRS 变更 DOC-2026-11-09-signature-canvas2d-rewrite(2026-11-09)重写,取代 11-08 横屏方案(R2 根因:旧式 uni.createCanvasContext 触摸坐标依赖缓存 rect → 坐标漂移字迹不显示;R1 根因:setPageOrientation 部分机型不可靠)。
  • 功能状态:已实现(GREEN,第 101 轮更新)——实现 c0db9643c(feat(DOC-2026-11-09-signature-canvas2d-rewrite))已于 2026-11-09 09:07 经 ff76e1607 合入 cfclub;signature.vue 已去横屏依赖、hand-signature.vue 已改 type="2d" + ctx.stroke() 同步绘制。
  • 可执行化:已完成(第 95 轮)——cfc-frontend/__tests__/pages/signature/signature.canvas2d.test.js 覆盖全部 S4-1/S4-2 契约(11 例:9 RED 契约 + 2 保留 GREEN 基线)。
  • 实测:第 101 轮(2026-11-09 10:0x)定向复跑 npx jest __tests__/pages/signature → 14/14 全绿(含 9 例原 RED 契约转 GREEN),前端全量 383/40 中不再含签名相关红例 → 与 B-81-Update 的「实现已验证(11/11)」+「待合入 cfclub」两项前置双双达成,B-81 可闭环。
  • 归档:旧横屏契约 cfc-frontend/__tests__/pages/signature/signature.landscape.superseded.js(7 例验证已作废 S1/S2/S3,改名不参与 jest 匹配,保留审计)。
  • 仍未覆盖:TC-SIG2D-01-E(2d 初始化失败重试)、TC-SIG2D-02-E(导出降级)、TC-SIG2D-N01/N02(真机/多端)——需真机与运行时环境,本轮未实测。